Dlaczego PL / Python jest niezaufany?

11

Według dokumentów:

PL / Python jest dostępny tylko jako „niezaufany” język, co oznacza, że ​​nie oferuje żadnego sposobu ograniczenia tego, co użytkownicy mogą w nim robić, dlatego jest nazywany plpythonu. Zaufany wariant plpython może stać się dostępny w przyszłości, jeśli w Pythonie zostanie opracowany mechanizm bezpiecznego wykonywania.

Dlaczego dokładnie trudno jest stworzyć bezpieczny mechanizm wykonywania dla Pythona, ale nie dla innych języków, takich jak Perl?

foobar0100
źródło

Odpowiedzi:

13

Ma to związek z modelem obiektowym Pythona - zawsze istnieje sposób na uzyskanie odniesienia do obiektów, które mogą być niebezpieczne. Zapoznaj się z dokumentacją modułu rexec i rozdziałem ograniczonego wykonywania dokumentacji, aby uzyskać informacje na temat problemów, a także:

Ograniczenia nie mają nic wspólnego z PostgreSQL, są związane z implementacją interpretera CPython, a nawet z samym językiem Python.

Niektóre inne języki sprawdzały środowiska wykonawcze, takie jak Perl, Java, JavaScript i Lua. Większość z nich napotyka szereg problemów związanych z bezpieczeństwem, ponieważ takie ograniczone środowiska wykonawcze są bardzo trudne do ochrony przed wszystkimi możliwymi exploitami jailbreak.

Naprawdę nic nie stoi na przeszkodzie, aby PostgreSQL dodał półkrytyczny interpreter Pythona, ponieważ rexec jest „wystarczająco dobry” do wielu celów. PostgreSQL nie jest jednak skłonny do tego, aby być może tylko w większości dość dobrym. Prawdopodobnie zostanie to zaakceptowane tylko wtedy, gdy zostanie oznaczone jako tylko superużytkownik, ale zawsze możesz wtedy przyznać dostęp do niego określonym użytkownikom. Byłoby to lepsze niż niezaufany Python.

Osobiście uważam, że PL / V8 lub podobny jest tutaj przyszłością i chciałbym, aby zmierzał w kierunku wsparcia w rdzeniu.

Ja też niejasno zgłębiłem pomysł zaufanego Mono, który może ładować „bezpieczne” zestawy napisane w C #, VB.NET, IronPython lub cokolwiek, ale nie był w stanie wiele zrobić na ten temat.

Craig Ringer
źródło
Nigdy nie widziałem tego jako powodu, dla którego uważa się to za niezaufane. Domyślnie Java, V8, TCL, R i inne są uważane za niezaufane. Jedynym powodem, dla którego Perl jest zaufany, jest to, że bc wysyłają specjalną zaufaną wersję Perla z PostgreSQL postgresql.org/docs/11/plperl-trusted.html
TheSteve0
1
@ TheSteve0 Być może nie widziałeś tego jako takiego, ale właśnie dlatego tak jest. PostgreSQL miał kiedyś plpythonu i został usunięty po wycofaniu rexecmodułu Pythona jako nieodłącznie niepewny, jak to opisano powyżej. Wyobrażam sobie, że może plpython korzystający z PyPi mógłby zapewnić tryb ograniczony, z którego Pg mógłby wtedy skorzystać. Nie szukałem, czy jest dużo pracy. Mylisz się także co do „specjalnej zaufanej wersji Perla” - w rzeczywistości jest to perfekcyjnie zwyczajny Perl, ten sam interpreter jest używany dla plperl i plperlu. Różnica polega na konfiguracji środowiska wykonawczego.
Craig Ringer,
@ TheSteve0 plperl inaczej konfiguruje instancje interpretera Perla w czasie wykonywania. Zobacz plperl.c, aby uzyskać szczegółowe informacje na temat gorey , pp_require_safea zwłaszcza plperl_trusted_init. Nie wiem wystarczająco dużo, aby mieć opinię na temat prawdziwego bezpieczeństwa ograniczonego wykonywania Perla. Wolałbym zobaczyć zaufaną wersję Lua lub uzyskać lepszy dostęp do myśli i adopcji, zaufanego tłumacza JavaScript. Ale to, co mamy, to na razie plperl.
Craig Ringer
@ TheSteve0 BTW, Java JVM korzystająca z kodu Java lub Groovy lub Mono VM korzystająca z C # lub VB.NET wydaje się mieć sens, ponieważ oba środowiska wykonawcze mają solidne funkcje piaskownicy i zarządzania bezpieczeństwem. Na przykład SecurityManager Java. Ale niestety oba środowiska wykonawcze używają ciężkich modeli uruchamiania, wątków, modeli współdzielenia wszystkiego domyślnie, które są słabo dopasowane do lekkiego procesu PostgreSQL-a-domyślnie „fork-nic-domyślnie” - bez modelu exec. Nie są tak naprawdę w stanie fork (). Dlatego nie możemy używać ich bardzo skutecznie w PostgreSQL.
Craig Ringer
Czytelnicy tutaj mogą być zainteresowani tym problemem GitHub, który napisałem w projekcie Mono, używając ponownie środowiska wykonawczego Mono w fork () ing: github.com/mono/mono/issues/11857
Craig Ringer