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.
fonte
2014-08-21 21:46:05
E l'utilizzo di più comandi? Ad esempio "cd" + dir + "; ./" + fileToExecute. Immagino che non saresti in grado di descriverti. Ho sbagliato? –