the_open_door
café
ESEN
← Volver al índice

tar wildcard injection

La inyección de comodín en tar (tar wildcard injection) es un abuso clásico que aparece cuando un usuario puede ejecutar tar como root (vía sudo) sobre una ruta con un comodín *, por ejemplo:

(ALL) NOPASSWD: /usr/bin/tar -czvf /tmp/backup.tar.gz *

El truco está en cómo la shell expande el *: antes de lanzar tar, sustituye el comodín por la lista de ficheros del directorio actual. Si en ese directorio existen ficheros cuyo nombre coincide con una opción de tar, esos nombres llegan a tar como argumentos, no como datos. tar admite la opción --checkpoint (mostrar un aviso cada N registros) y --checkpoint-action=exec=... (ejecutar un comando al llegar a un checkpoint). Combinándolas, se logra ejecución de comandos:

echo "" > "--checkpoint-action=exec=sh payload.sh"
echo "" > "--checkpoint=1"
echo "/bin/bash" > payload.sh
chmod +x payload.sh
sudo /usr/bin/tar -czvf /tmp/backup.tar.gz *

Al expandirse el *, tar recibe --checkpoint=1 y --checkpoint-action=exec=sh payload.sh como si fueran opciones: en el primer checkpoint ejecuta payload.sh, que lanza una shell. Como tar corre como root, esa shell es de root.

Por qué funciona. El fallo no está en tar sino en la combinación de un comodín sin acotar y la expansión de la shell: cualquier fichero que un usuario controle en el directorio se convierte en un argumento. Es la misma idea que afecta a otros binarios cuando se les pasa *.

Otros binarios con el mismo patrón

# rsync -e permite lanzar un comando "shell remoto"
touch ./-e; echo 'sh payload.sh' > './-e sh payload.sh'
sudo rsync -a * root@localhost:/tmp/    # el argumento -e se cuela y ejecuta el comando

# chown/chmod: el flag --reference toma el dueno/permiso de un fichero que controlamos
touch "--reference=ref"; # ref con dueno/perm elegidos → chown * los aplica a todo

# 7z / zip: -i@... y -x@... leen listas de ficheros, permiten leer rutas arbitrarias
touch @/etc/shadow; touch ./-op    # 7z filtra y revela contenido de ficheros que no deberia

Requisitos

Hay que poder crear ficheros en el directorio sobre el que actúa el comodín y que el comando se ejecute realmente desde ahí (el * se expande en el cwd). El nombre del fichero ES el argumento: por eso se crean ficheros vacíos llamados literalmente --checkpoint=1, etc. Si el comando fija la ruta con cd /otro, el comodín se expande sobre ese directorio, no sobre el nuestro.

Cómo detectarlo. El delator es un sudo -l que permita ejecutar tar (o chown, chmod, rsync) sobre una ruta con *, o un script/cron que empaquete un directorio con comodín. La constante es el comodín sin acotar sobre un directorio donde podamos crear ficheros. Cuando lo lanza una tarea programada en vez de un sudo, pspy revela la línea de tar exacta.

Defensa. No conceder por sudo comandos con comodines; fijar rutas y argumentos completos (sin *); y, si hay que empaquetar, hacerlo desde un script envoltorio que controle el directorio y la lista de ficheros. Relacionado con escapes de sudo (GTFOBins) y otros abusos de sudoers.

Máquinas donde se aplica