2010-07-22 11 views
5

Chcę użyć node.js (lub innego rozwiązania SSJS), uruchamiając mój własny kod + zewnętrzny pisemny kod wewnątrz (niezaufany).Zabezpieczanie SSJS przed niezweryfikowanym kodem

Jakikolwiek sposób na oddzielenie i ochronę mojego własnego kodu? Czy mogę ograniczyć moduły i efekt systemowy niezaufanego kodu (ograniczyć dostęp do plików, portów innych niż HTTP itp.)?

+0

Wow nie widać js po stronie serwera bardzo często. ; – rook

Odpowiedz

1

Możesz sprawdzić ten projekt wydaje się bardzo obiecujący:

http://github.com/gf3/node-sandbox

Osobiście nie używam węzła zrobić wykonanie dowolnego SSJS. Prawdopodobnie nie spodoba ci się to rozwiązanie, ale sprawdziło się przez około rok:

Istnieje implementacja Perl API Spidermonkey'a (Spidermonkey to silnik JS Firefoksa) that's available. Podłączyłem to za pomocą jakiegoś CGI. Możesz w nim dokładnie określić funkcje, które chcesz eksponować (przyznane, są w Perlu ... blech) i wykonać dowolny kod. Nie ma ryzyka luk w zabezpieczeniach, ponieważ cała instalacja jest całkowicie piaskowana. Nie symuluje DOM.

Sposób, w jaki zaimplementowałem to na moim serwerze (aby zapobiec nadużyciom), to wydawanie tokenów, które przyznawały dostęp jednorazowy za pośrednictwem interfejsu API REST na innym serwerze. Jest to prosta implementacja HMAC, która zawiera znacznik czasu w celu wymuszenia prawowitości tokena. Kiedy skrypt Perla otrzyma żądanie, sprawdza token i przetwarza skrypt (skrypt powinien być częścią żądania POST). Skrypt Perla po prostu zapisuje wyniki. Mój serwer ustawił czas oczekiwania na około 10 sekund.

Mam nadzieję, że to pomoże!

+0

@Rook Właściwie się mylisz. To nawet nie szyfrowanie, to uwierzytelnianie. Jest to ta sama technika, której używa Amazon AWS. Bardziej technicznie, nie jest to "krypto-magiczna różdżka", jest to uzasadniony sposób zabezpieczenia dowolnego interfejsu API REST skierowanego do przodu. Nie ma znaczenia, co jest używane jako sekret HMAC. Wskakuj do dowolnego losowego generatora tekstów i użyj pierwszych 30 znaków, a to nie ma znaczenia. Chociaż okazało się, że nie bardzo rozumiesz bezpieczeństwo. – mattbasta

+0

@mattbasta crypto jest skrótem od kryptografii, a funkcja kryptograficznego skrótu, taka jak sha256, należy do tej kategorii. Oczywiście bezpieczeństwo to temat bardzo głęboki i każdy musi się czegoś więcej nauczyć. Krótko mówiąc, zdecydowanie nie podoba mi się takie podejście do zarządzania podatnością na zdalne wykonanie kodu. Jest dobry cytat "Jeśli eval() jest odpowiedzią, to zadajesz niewłaściwe pytanie". Nie ma absolutnie żadnego powodu, dla którego ktoś mógłby wykonywać kod taki jak ten. Jest prawdopodobne, że OP robi krótkie cięcie i zostanie spalony przez tę częściową odpowiedź. – rook

+0

@Rook Po raz ostatni nie jest to usterka. Nie ma "eval", ponieważ kod działa w środowisku z dosłownie nic do zerwania. Dosłownie nie ma możliwości modyfikowania poufnych informacji, uzyskiwania dostępu do dysku lub wysyłania żądań wychodzących. Taki jest pomysł piaskownicy: wyraźnie temat, który twój profesor bezpieczeństwa musiał przejrzeć. Oczywiście, wykonywanie kodu w instrukcji 'eval' jest złe, ale jeśli OP chce uruchomić JS użytkownika, wówczas jego uruchomienie w otoczeniu piaskownicy jest najbezpieczniejszym i najskuteczniejszym sposobem osiągnięcia tego celu. Wymień jedną lukę w zabezpieczeniach przez piaskownicę. – mattbasta

0

Spójrz na Caja. Przekłada kod strony trzeciej na formularz, w którym kod ma tylko dostęp do obiektów, które jawnie mu przyznajesz.

+0

Caja też jest fajna, musisz po prostu przejść przez próbę jej zrozumienia i zrozumienia, co robisz (i potrzebujesz java itp.). –

1

Sprawdź to z dokumentacji node.js

script.runInNewContext ([sandbox])

podobne do Script.runInNewContext (nota kapitału 'S'), ale teraz jest to metoda prekompilowanego obiektu Script. script.runInNewContext uruchamia kod skryptu z piaskownicą jako obiekt globalny i zwraca wynik. Uruchomiony kod nie ma dostępu do zasięgu lokalnego. Sandbox jest opcjonalny.

http://nodejs.org/api.html#script-runinnewcontext-105

+1

Uważaj, z bieżących dokumentów: Zwróć uwagę, że uruchamianie niezaufanego kodu to skomplikowana sprawa wymagająca dużej staranności. Aby uniknąć przypadkowego wycieku globalnej zmiennej, skrypt.runInNewContext jest całkiem przydatny, ** ale bezpiecznie działa niezaufany kod wymaga oddzielnego procesu **. –

+0

Tak, ale to naprawdę zależy od tego, jak uprzywilejowany jest obecny proces. To prawdopodobnie oznacza, że ​​utworzysz nowy proces z mniejszymi przywilejami, który wymaga więcej przywilejów (zaczynając demona jako root). Tak więc, piaskowanie globalnego wykonania do nowego procesu jest dobre, ale jeśli używasz jako nieuprzywilejowanego użytkownika, to prawdopodobnie jesteś w porządku. Zależy to również od tego, jak bardzo jest to krytyczne dla misji. Jeśli jest to blog Twojego kota, prawdopodobnie masz rację, cokolwiek robisz. Jeśli jest to transakcyjna witryna zgodna z PCI, to byłoby trochę inaczej. Naprawdę nie powiedziałem ... –

Powiązane problemy