10

W wielu aplikacjach Python, które stworzyłem, często tworzę proste moduły zawierające tylko stałe, które będą używane jako pliki konfiguracyjne. Dodatkowo, ponieważ plik konfiguracyjny jest w rzeczywistości plikiem kodu Pythona, mogę dodać prostą logikę do zmiany zmiennych w zależności od poziomu debugowania, itp.Czy istnieje "bezpieczny" podzestaw języka Python do użycia jako osadzony język skryptowy?

Chociaż działa to doskonale w aplikacjach wewnętrznych, nie chciałbym publikować takich aplikacji na wolności, bojąc się kogoś przypadkowo lub złośliwie, dodając destrukcyjny kod do pliku. To samo dotyczy używania Pythona jako osadzonego języka skryptowego.

Czy istnieje podzbiór Python, który jest uważany za "bezpieczny" do osadzania? Zdaję sobie sprawę, jak bezpiecznie można go uznać za dość subiektywny. Jednak aplety Java i Flash mają dobrze zdefiniowaną przestrzeń izolacyjną. Zastanawiam się, czy istnieje wersja Pythona, która ma podobne zasady?

EDIT: Pytam nie tyle ze względu na podejście pliku konfiguracyjnym, ale dlatego, że jestem zainteresowany w realizacji niektórych mechanizmów skryptów/wtyczki do nowszych aplikacji i nie chcą plugin lub skrypt być w stanie, powiedzmy, usuwać pliki. Wykracza to poza zakres tego, co aplikacja powinna być w stanie zrobić.

+0

Co oznacza "złośliwy" w tym kontekście? Pobieram twoje oprogramowanie, konfiguruję je, spieprzę konfiguracje, robiąc zbyt wiele niebezpiecznego kodu. Jak to jest "złośliwe"? Brzmi dla mnie "głupio". Pytasz "co mogę zrobić, aby uniemożliwić użytkownikom bycie głupim?" –

Odpowiedz

3

Nie istnieje żaden gotowy podzbiór produkcji Pythona, który jest "bezpieczny". Python miał kilka modułów piaskownicy, które zostały wycofane z powodu braków.

Najlepiej jest utworzyć własny parser lub wyizolować proces Pythona za pomocą haczyków syscall i uwięzionego konta.

Niektórzy ludzie mogą wskazać Ci PyPy, ale jest on powolny i nieukończony.

+2

PyPy: Myślę, że musisz teraz usunąć "powolny". – EoghanM

1

AFAIK, niektóre próby zostały wykonane w standardowej bibliotece Pythona, ale nie powiodły się. Aby uzyskać szczegółowe informacje, patrz Restricted Execution.

Warning

W Pythonie 2.3 moduły te zostały wyłączone z powodu różnych znana i nie łatwo naprawić luki bezpieczeństwa. Moduły są tu nadal udokumentowane, aby pomóc w odczytaniu starego kodu, który korzysta z modułów rexec i Bastion .

1

Byłbym nieufny wobec uwolnienia takich aplikacji w środowisku naturalnym z obawy przed przypadkiem , lub złośliwie, podając destrukcyjny kod do pliku.

Twój macierzysty kod "na wolności" jest równie podatny na ataki; to, że jest w kodzie maszynowym, to tylko uderzenie szybkości i brak zabezpieczeń.

Jeśli jesteś bardzo paranoikiem i chcesz wyższego przyspieszenia, możesz ustawić swoją aplikację natywną, w której znajduje się instancja skryptu, i sprawdzić mieszankę zawartości. Wtedy zmiany w mieszkaniu są niemożliwe; tylko przemyślane zmiany mogą sprawiać kłopot z aktualizacją sumy kontrolnej. Możesz pójść dalej i sprawdzić, czy zostały podpisane za pomocą klucza publicznego; wtedy tylko włamywanie do twojej rodzimej aplikacji może pozwolić na nowe skrypty.

Ale piaskownica? Nie przejmuj się tym!

+0

Kto mógłby pobrać, zainstalować i "złośliwie" uszkodzić aplikację, którą pobrali i zainstalowali? Co oznacza "złośliwy", gdy robią to sami? To tylko jedna z wielu opowieści "głupich użytkowników", które zbieracie, wypuszczając swój kod na wolność. –

1

Możesz wypróbować IronPython na Silverlight/Moonlight, ponieważ wydaje się, że imponująco wygląda to w przypadku these guys. Jest wiele świetnych informacji na temat tego typu aplikacji IronPython od deweloperów Resolver One here.

1

Nie wiem zbyt wiele o tym, jakie funkcje zabezpieczeń można uzyskać w wirtualnej maszynie Java lub środowiskach wykonawczych .NET, ale warto rozważyć, czy uruchomienie kodu Pythona przy pomocy Jython lub IronPython może pozwolić uzyskać dodatkowe bezpieczeństwo .

1

Trochę trudno zrozumieć, co próbujesz zrobić - za mało szczegółów.

Czy udostępniasz natywną aplikację i pozwalasz użytkownikom pisać wtyczki? Rozważ użycie rozwiązania na poziomie systemu operacyjnego, uruchamiając aplikację Python jako oddzielny proces wykonawczy wewnątrz więzienia/chroot/podobny i komunikując się przez gniazda.

Czy spodziewasz się, że Twoi klienci będą obsługiwać natywną aplikację i będą mogli pisać wtyczki "niezaufanych stron"? Czy istnieje powód, dla którego powyższe rozwiązanie nie zadziała? (Np. Klient chciałby wdrożyć na dziwnych systemach operacyjnych bez takich opcji ...)

Czy spodziewasz się, że te same osoby będą hostować natywną aplikację i "niezaufany skrypt" i chcą chronić je przed nimi? W sensie chronienia ich przed pisaniem "os.remove" i robienia tego, co napisali? Czy możesz mi wytłumaczyć dlaczego?

Należy pamiętać, że samo piaskowanie często nie wystarcza bez bardziej rygorystycznych ograniczeń (maksymalne cykle procesora, maksymalna pamięć, problemy z własnością pamięci ...)? Jaki rodzaj złośliwości chcesz zatrzymać? Zauważ, że i tutaj systemy operacyjne mają wspaniałe możliwości (priorytety, procesy zabijania, ulimity), które nie wszystkie środowiska piaskownicy powielają - i są z pewnością mniej testowane pod kątem bezpieczeństwa niż rzeczy w systemach operacyjnych. (Ufam, że Linux nie będzie miał łatwych limitów, zanim zaufam PyPy, aby nie pozwolić złośliwemu koderowi na pobieranie nieograniczonej ilości pamięci, po prostu dlatego, że Linux został zaatakowany na wolności.)

2

tinypy (tinypy.org) został stworzony jako mały, wbudowany podzbiór Pythona napisany w stylu Lua. A ponieważ lua ma sposób na stworzenie piaskownicy, szacuję, że tinypy może zostać zhakowane w ten sam sposób.Ponieważ baza kodu tinypy jest tak mała, łatwo jest się jej nauczyć i dowiedzieć się, jak zmieniać rzeczy, aby pasowały do ​​twoich potrzeb.

3

PyMite VM pasuje do rachunku, jeśli wszystko, co musisz zrobić, to ustawić proste zmienne, pętle, warunki i funkcje. PyMite jest malutki, napisany w C, używa statycznej puli pamięci i może być osadzony. Ma bardzo ograniczony zestaw wbudowanych funkcji, które można łatwo skonfigurować. Podobnie, jedynymi standardowymi bibliotekami są częściowe implementacje łańcucha, dyktowania, listy i sys. Maszyna PyMite VM jest częścią projektu Python-on-a-chip, więc została zaprojektowana do pracy z mikrokontrolerami, ale może działać w systemach typu posix. Minusem jest to, że PyMite nie jest tak szeroko rozpakowywany, jak inne implementacje Pythona.

0

Brzmi to tak, jak chcesz: Reviving Python restricted mode.

Interpreter języka Python ma wbudowany tryb "ograniczony", który można włączyć, zmieniając zmienną magiczną __builtins__. Artykuł Paving the Way to Securing the Python Interpreter wyjaśnia sprawę bardziej szczegółowo. Zauważ, że aby działać całkowicie, potrzebuje łatki do intrepretera Pythona; Nie wiem, czy został już zastosowany.

Dla czystego pythonowego proof-of-concept, zobacz jego poprzedni wpis A Challenge To Break Python Security.

Powiązane problemy