Caricamento sicuro di un file pickle?

4

Nella nostra app Python, stiamo usando pickle.load per caricare un file chiamato perceptron.pkl . Una scansione statica HP Fortify solleva un'elevata vulnerabilità, "Valutazione del codice dinamico - Deserializzazione sottosterzo non sicura", sulla stessa riga.

Come posso risolverlo? C'è un modo in cui possiamo tranquillamente caricare un sottaceto?

    
posta Pro 18.04.2018 - 10:14
fonte

3 risposte

9

Il manuale di Python viene fornito con un avviso sul modulo pickle:

Warning The pickle module is not secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source.

Questo avvertimento dovrebbe essere preso molto sul serio. Se si annullano i dati non attendibili, un utente malintenzionato sarà in grado di rilevare codice arbitrario sul proprio sistema. Non va bene. Molto male.

La parte chiave della citazione qui è "fonte non attendibile o non autenticata", però. Se stai caricando solo un file statico di cui non ritieni che un attore malintenzionato avrebbe il controllo, lo smistamento è sicuro. Ad esempio, se si archivia il file insieme al codice sorgente e con le stesse restrizioni di accesso, un utente malintenzionato potrebbe anche modificare il codice sorgente come file pickle. Pertanto, l'annullamento non deve essere un rischio per la sicurezza.

Che cosa succede se non ti puoi fidare del file? Hai due opzioni:

  1. Passa a un formato non vulnerabile all'esecuzione del codice, come JSON.
  2. Crea un unplicatore limitato utilizzando il metodo find_class (vedi il manuale ) .

La mia ipotesi è che il # 2 sarebbe probabilmente più rapido da implementare in quanto richiede meno modifiche nel codice. Ma è anche una strategia rischiosa, poiché sospetto che sia molto facile commettere un errore minore che ti apre a una vulnerabilità. Se vuoi minimizzare il rischio, andrei con # 1.

    
risposta data 18.04.2018 - 11:01
fonte
3

Is there any way we can safely load a pickle?

Hai chiesto in qualsiasi modo , ma in parte dipende non solo dal modo in cui, ma dal sottaceto in questione e da cosa intendi con "sicuro".

A meno che tu non intenda qualcosa del tipo "ragionevolmente sicuro, dato che conoscerò sempre la provenienza del sottaceto", la risposta è probabilmente "no".

Tuttavia, ecco alcune domande a cui la risposta è "sì":

  • Posso caricare tranquillamente un sottaceto se sono sicuro al 100% di averlo scritto e che non è stato modificato durante il trasporto?
  • Posso caricare tranquillamente un pickle se la fonte è attendibile e ho controllato che il file dal quale sto caricando il pickle provenga effettivamente da quella fonte?
  • Posso ottenere in modo sicuro la stessa cosa che caricare un pickle usando la logica di de / serializzazione completamente sicura nella maggior parte dei casi?

Quindi, la prima domanda da porsi è: il terzo di questi si applica a te? Puoi serializzare e deserializzare in un modo diverso?

In caso contrario, si applicano i primi due?

In caso contrario, c'è un progetto su cui ho appena imparato a PyCon chiamato "Pikara" - ha lo scopo di "rendere gli oggetti che non distruggono più sicuri che mai." Apparentemente è chiamato per un piatto polacco in salamoia; Ho suggerito che "kimchi" potrebbe essere ugualmente adatto. : -)

Se un metodo alternativo di serializzazione non è l'ideale per la tua implementazione, potresti prendere in considerazione di controllarlo: link

Un altro rispondente ha anche pubblicato un metodo alternativo di disimpegno, ma non posso garantire per questo (anche se ho dato una buona occhiata oggi ed è almeno interessante - controllerò quando i documenti diventeranno maggiorenni).

Se questa risposta non ti ha dato il 100% di confidenza nella direzione da seguire, allora permettimi di chiedere un follow-up: cosa stai effettivamente cercando di annullare qui?

    
risposta data 20.05.2018 - 22:18
fonte
0

Solo l'unpickler predefinito non è sicuro. Puoi scrivere un unpickler modificato che è sicuro, o usarne uno già scritto da qualcun altro, come picklemagic: link

    
risposta data 23.04.2018 - 18:20
fonte

Leggi altre domande sui tag