2014-05-16 17 views
7

In Nodo, sto usando un modulo (GM) e ho notato che utilizza spawn dal modulo child_process per passare argomenti a convert eseguibile di GraphicMagick.uova child_process nella sicurezza node.js/fuga

Sto passando le informazioni inviate dall'utente a GM. C'è un problema di sicurezza che l'utente possa fare una sorta di attacco di iniezione usando una pipe (o altri trucchi della riga di comando)? O lo protegge spawn? In caso contrario, esiste una best practice per l'escape dei valori inviati dall'utente in questo caso?

risposta

7

Abbiamo recentemente pubblicato un post sul blog avoiding command injection vulnerabilities in node.js. Spiega un po 'come spawn lo impedisce.

Se gm stava usando child_process.exec ci sarebbe una maggiore possibilità di iniezione. Questo perché child_process.exec esegue i comandi sotto una subshell e non direttamente, lasciando i meta caratteri della shell come apici inversi, $(),;, & &, || ecc. da usare in modo nefasto.

La chiamata di sistema risultante ha questo aspetto con .exec() per un semplice ls -l che potrebbe richiedere l'input dell'utente.

[pid 25170] execve ("/ bin/sh" [ "/ bin/sh", "-c", "ls -l input utente"], [ /* 16 * vars /]

Dal gm usa deporre le uova la chiamata di sistema risultante sarebbe simile a questa.

[pid 25565] execve ("/ bin/ls", [ "/ bin/ls", "-l ",". "], [/ * 16 vars * /]

Come sarebbe b e il primo argomento da eseguire. Ciò significa che un utente non può eseguire sottocomandi nella shell usando pipe e altri trucchi della riga di comando, perché nel nostro esempio/bin/ls non ha idea di cosa fare con backtick o pipe o;. È/bin/bash che interpreterà quei comandi. È simile all'utilizzo di query SQL parametrizzate o basate su stringhe, se si ha familiarità con ciò.

Questo tuttavia viene fornito con un avvertimento: l'utilizzo di spawn non è sempre una cosa sicura. Gli argomenti forniti dall'utente potrebbero ancora avere un esito negativo, forse non il comando dell'iniezione ma qualcos'altro. Verifica con il comportamento di gm e gli argomenti che ti vengono inoltrati in input forniti dall'utente e pensa a come l'utente potrebbe essere in grado di abusare di tale argomento.

Quindi, ecco la guida collettiva generico per sistema che esegue i comandi da node.js:

  • Evitare di utilizzare child_process.exec, e non usare mai, se il comando contiene qualsiasi ingresso che cambia in base all'input dell'utente.
  • Cerca di evitare che gli utenti passino le opzioni ai comandi, se possibile. In genere i valori sono corretti quando si utilizza spawn o execfile, ma la selezione di opzioni tramite una stringa controllata dall'utente è una cattiva idea.
  • Se è necessario consentire le opzioni controllate dall'utente, esaminare estesamente le opzioni per il comando, determinare quali opzioni sono sicure e inserire nella whitelist solo quelle opzioni.
+0

E l'utilizzo di più comandi? Ad esempio "cd" + dir + "; ./" ​​+ fileToExecute. Immagino che non saresti in grado di descriverti. Ho sbagliato? –