«запустить любую команду, которая будет передавать ненадежные данные командам, которые интерпретируют аргументы как команды»

Нет; это невозможно. USB - это протокол ведущий / ведомый (узел / устройство). Вы можете подключать устройства только к хосту, а хост может быть подключен только к устройствам. Дополнение USB On The Go позволяет некоторым гаджетам (только сотовым телефонам и планшетам) действовать как одно или другое, в зависимости от того, к чему они подключены, но настольные ПК являются только хостом и поэтому не могут быть подключены друг к другу. .

18
07.06.2018, 21:24
3 ответа

Esto no está realmente relacionado con las citas, sino con el procesamiento de argumentos.

Considere el ejemplo arriesgado:

find -exec sh -c "something {}" \;
  • Esto es analizado por el shell y dividido en seis palabras :find, -exec, sh, -c,something {}(ya no hay comillas ), ;. No hay nada que ampliar. El shell ejecuta findcon esas seis palabras como argumentos.

  • Cuando findencuentra algo para procesar, digamos foo; rm -rf $HOME, reemplaza {}con foo; rm -rf $HOMEy ejecuta shcon los argumentos sh, -cy something foo; rm -rf $HOME.

  • shahora ve -cy, como resultado, analizasomething foo; rm -rf $HOME(el primer argumento de opción no -)y ejecuta el resultado.

Ahora considere la variante más segura:

find -exec sh -c 'something "$@"' sh {} \;
  • El shell ejecuta findcon los argumentos find, -exec, sh, -c, something "$@", sh, {}, ;.

  • Ahora, cuando findencuentra foo; rm -rf $HOME, reemplaza {}nuevamente y ejecuta shcon los argumentos sh, -c, something "$@", sh, foo; rm -rf $HOME.

  • shve -cy analiza something "$@"como el comando a ejecutar, y shy foo; rm -rf $HOMEcomo los parámetros posicionales(a partir de $0), expande "$@"afoo; rm -rf $HOMEcomo un valor único , y ejecuta somethingcon el argumento único foo; rm -rf $HOME.

Puede ver esto usando printf. Cree un nuevo directorio, ingréselo,y corre

touch "hello; echo pwned"

Ejecutando la primera variante de la siguiente manera

find -exec sh -c "printf \"Argument: %s\n\" {}" \;

produce

Argument:.
Argument:./hello
pwned

mientras que la segunda variante, se ejecuta como

find -exec sh -c 'printf "Argument: %s\n" "$@"' sh {} \;

produce

Argument:.
Argument:./hello; echo pwned
29
27.01.2020, 19:45

Parte 1:

findsolo usa reemplazo de texto.

Sí, si lo hiciste sin comillas, así:

find. -type f -exec sh -c "echo {}" \;

y un atacante pudo crear un archivo llamado ; echo owned, luego ejecutaría

sh -c "echo ; echo owned"

, lo que daría como resultado que el shell ejecute echoy luego echo owned.

Pero si agregó comillas, el atacante podría simplemente finalizar sus comillas y luego colocar el comando malicioso después creando un archivo llamado'; echo owned:

find. -type f -exec sh -c "echo '{}'" \;

, lo que daría como resultado que el shell se ejecute echo '', echo owned.

(si cambia las comillas dobles por comillas simples, el atacante también podría usar el otro tipo de comillas.)


Parte 2:

En find -exec sh -c 'something "$@"' sh {} \;, el shell no interpreta {}inicialmente, se ejecuta directamente con execve, por lo que agregar comillas de shell no ayudaría.

find -exec sh -c 'something "$@"' sh "{}" \;

no tiene ningún efecto, ya que el shell elimina las comillas dobles antes de ejecutar find.

find -exec sh -c 'something "$@"' sh "'{}'" \;

agrega comillas que el shell no trata de manera especial, por lo que en la mayoría de los casos solo significa que el comando no hará lo que usted quiere.

Hacer que se expanda a /tmp/foo;, rm, -rf, $HOMEno debería ser un problema, porque esos son argumentos para something, y somethingprobablemente no trata sus argumentos como comandos a ejecutar.


Parte 3:

Supongo que se aplican consideraciones similares para cualquier cosa que tome una entrada que no sea de confianza y la ejecute como (parte de )un comando, por ejemplo xargsy parallel.

3
27.01.2020, 19:45

Su preocupación es precisamente la razón por la cual GNU Parallel cita la entrada:

touch "hello; echo pwned"
find. -print0 | parallel -0 printf \"Argument: %s\\n\" {}

Esto no se ejecutará echo pwned.

Ejecutará un shell, de modo que si extiende su comando, no recibirá una sorpresa repentina:

# This _could_ be run without spawining a shell
parallel "grep -E 'a|bc' {}" ::: foo
# This cannot
parallel "grep -E 'a|bc' {} | wc" ::: foo

Para obtener más detalles sobre el problema del desove -a -shell, consulte:https://www.gnu.org/software/parallel/parallel_design.html#Always-running-commands-in-a-shell

1
27.01.2020, 19:45

Теги

Похожие вопросы