parser YAML sicuro?

8

Recentemente ho letto che YAML non era " progettato per gestire l'input dell'utente malintenzionato ", perché un input YAML dannoso "può creare istanze di tutte le classi definite nell'applicazione Rails di destinazione". Anche Wikipedia spiega che

YAML allows language specific tags so that arbitrary local objects can be created by a parser that supports those tags. Any YAML parser that allows sophisticated object instantiation to be executed opens the potential for an injection attack.

Di conseguenza, sembra che sia potenzialmente pericoloso analizzare l'input non attendibile utilizzando alcuni parser YAML.

Qualcuno può spiegare come analizzare in modo sicuro l'input YAML non attendibile, in Rails, Python e Perl? Ci sono librerie di analisi YAML che sono sicure, o modi per invocarle che garantiscono che siano sicure anche se l'input proviene da una fonte non affidabile?

    
posta D.W. 09.01.2013 - 07:04
fonte

2 risposte

6

Proprio in quello stesso articolo di Wikipedia è la risposta che stai cercando:

Note that the ability to construct an arbitrary Python object may be dangerous if you receive a YAML document from an untrusted source such as the Internet. The function yaml.safe_load limits this ability to simple Python objects like integers or lists.

( enfasi aggiunta )

La specifica YAML consente la serializzazione completa e la deserializzazione delle strutture di dati arbitrarie , che include la possibilità di deserializzare (e quindi istanziare) qualsiasi oggetto definito nell'applicazione. Pensala come la routine di serializzazione integrata di python pickle , solo con una sintassi diversa.

Il metodo safe_load su PyYAML è stato creato appositamente per affrontare il fatto che questo è intrinsecamente, disastrosamente pericoloso. Ti permette di deserializzare solo verso tipi universali, semplici e orientati ai dati, che sono noti per non avere effetti collaterali (cioè numero, stringa, lista, ecc.).

Per quanto riguarda le implementazioni in altre lingue, possono essere soggette a restrizioni (ad esempio "sicure") per impostazione predefinita o possono essere non limitate per impostazione predefinita. Dovresti controllare la documentazione associata. So solo dell'implementazione Python.

    
risposta data 09.01.2013 - 08:16
fonte
6

Purtroppo non esiste una modalità sicura integrata per Ruby. Ho scritto la gemma SafeYAML per tappare questo buco per ora; e c'è una discussione in corso sull'aggiunta di questa funzionalità a Psych, il motore di analisi YAML di Ruby a partire dal 1.9.2 .

Per ora, se sei uno sviluppatore di app Ruby, la soluzione migliore è probabile che utilizzi SafeYAML o trovi una libreria simile per soddisfare le tue esigenze.

    
risposta data 31.01.2013 - 16:44
fonte

Leggi altre domande sui tag