Perché PL / Python non è affidabile?


11

Secondo i documenti:

PL / Python è disponibile solo come linguaggio "non attendibile", il che significa che non offre alcun modo di limitare ciò che gli utenti possono fare in esso e pertanto è chiamato plpythonu. Una variante attendibile plpython potrebbe diventare disponibile in futuro se in Python viene sviluppato un meccanismo di esecuzione sicura.

Perché è esattamente difficile sviluppare un meccanismo di esecuzione sicura per Python ma non per altri linguaggi come Perl?

Risposte:


13

Ha a che fare con il modello a oggetti di Python: c'è sempre un modo per ottenere un riferimento a oggetti che potrebbero non essere sicuri. Consultare la documentazione del modulo rexec e il capitolo sull'esecuzione limitata dei documenti per alcune informazioni sui problemi, nonché:

Le limitazioni non hanno nulla a che fare con PostgreSQL stesso, sono inerenti all'implementazione dell'interprete CPython o forse anche al linguaggio Python stesso.

Alcune altre lingue hanno verificato i tempi di esecuzione, come Perl, Java, JavaScript e Lua. La maggior parte di loro ha affrontato una serie di problemi di sicurezza in quanto tali ambienti di esecuzione confinati sono molto difficili da proteggere da tutti i possibili exploit di jailbreak.

Non c'è davvero nulla che impedisce a PostgreSQL di aggiungere un interprete Python semitrust, poiché rexec è "abbastanza buono" per molti scopi. PostgreSQL non tende ad essere appassionato di solo-per lo più-abbastanza-buono-forse-forse però. Probabilmente sarebbe accettato solo se contrassegnato come solo superutente, ma si potrebbe sempre concedere l'accesso ad esso per utenti specifici. Sarebbe meglio di Python non attendibile.

Personalmente penso che PL / V8 o simili siano il futuro qui e mi piacerebbe vederlo spostarsi verso il supporto nel core.

Ho anche vagamente esplorato l'idea di un Mono di fiducia che può caricare assembly "sicuri" scritti in C #, VB.NET, IronPython o qualsiasi altra cosa, ma non sono stato in grado di fare molto su questo argomento.


Non l'ho mai visto come una ragione per cui è considerato non attendibile. Per impostazione predefinita, Java, V8, TCL, R e altri sono considerati non attendibili. L'unica ragione per cui il Perl è attendibile è perché spediscono una versione speciale fidata del Perl con PostgreSQL postgresql.org/docs/11/plperl-trusted.html
TheSteve0

1
@ TheSteve0 Potresti non averlo visto come tale, ma è per questo che è così. PostgreSQL aveva in passato plpythonu ed è stato rimosso dopo la deprecazione del rexecmodulo Python come intrinsecamente insicuro, come indicato sopra. Immagino che forse un plpython usando PyPi potrebbe essere in grado di fornire una modalità limitata che Pg potrebbe quindi usare. Non ho cercato di vedere se c'è molto lavoro. Anche tu non sei corretto su una "versione fidata speciale di Perl" - è in realtà Perl perfettamente ordinario, lo stesso interprete viene usato per plperl e plperlu. La differenza è la configurazione di runtime.
Craig Ringer,

@ TheSteve0 plperl configura le istanze dell'interprete Perl in modo diverso in fase di esecuzione. Vedi plperl.c per i dettagli gorey, in particolare pp_require_safee plperl_trusted_init. Non ne so abbastanza per avere un'opinione sulla vera sicurezza dell'esecuzione limitata del Perl. Preferirei vedere una versione fidata di Lua o ottenere una condivisione mentale e un'adozione migliori, un interprete JavaScript fidato. Ma quello che abbiamo è per ora pronto.
Craig Ringer,

@ TheSteve0 BTW, Java JVM che utilizza codice Java o Groovy o Mono VM che utilizza C # o VB.NET sembrerebbe molto logico in quanto entrambi i tempi di esecuzione hanno sandbox robuste e funzionalità di gestione della sicurezza. SecurityManager di Java, ad esempio. Ma sfortunatamente entrambi i tempi di esecuzione utilizzano modelli di esecuzione di avvio pesante, threaded, condivisi di tutto per impostazione predefinita che si adattano male al processo leggero di PostgreSQL condiviso-niente-per-default fork () - senza modello exec. Non sono davvero in grado di fork (). Quindi non possiamo usarli in modo molto efficace in PostgreSQL.
Craig Ringer,

I lettori qui potrebbero essere interessati a questo numero di GitHub che ho fatto sul progetto Mono riutilizzando Mono in fork () ing runtime: github.com/mono/mono/issues/11857
Craig Ringer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.