¿Cómo extraigo de forma segura un archivo tar no confiable?

30

Me gustaría poder extraer un archivo tar, de modo que todos los archivos extraídos se coloquen en un determinado directorio de prefijos. Cualquier intento de los archivos tar para escribir en directorios externos debería hacer que la extracción falle.

Como puede imaginar, esto es para que pueda extraer de forma segura un archivo tar no confiable.

¿Cómo puedo hacer esto con GNU tar?

Se me ocurrio:

tar --exclude='/*' --exclude='*/../*' --exclude='../*' -xvf untrusted_file.tar

pero no estoy seguro de que esto sea lo suficientemente paranoico.

Demi
fuente
2
No es lo suficientemente paranoico. En el pasado construí algunas bolas de alquitrán desagradables que ascendieron a través de enlaces simbólicos que creó. Terminé haciendo mi propio tar que era setuid-root para que pudiera ejecutar chroot (".") Y soltar privilegios.
Joshua
8
@Joshua, entonces, ¿su solución para hacer que una utilidad ampliamente probada sea más segura fue hacer su propia versión y darle privilegios de root?
Deja de dañar a Monica el
44
@OrangeDog: int main (int argc, char ** argv) {chroot (".") || salida (1); setuid (getuid ()); Es fácil de auditar.
Joshua
2
También es posible que desee inspeccionar lo que hay dentro del archivo tar mediante la -topción.
Thomas

Respuestas:

40

No necesitas la paranoia en absoluto. GNU tar, y de hecho cualquier programa bien escrito tarproducido en los últimos 30 años más o menos, se negará a extraer archivos en el tarball que comiencen con una barra o que contengan ..elementos, por defecto.

tarDebe esforzarse para obligar a los programas modernos a extraer tales tarballs potencialmente maliciosos: tanto GNU como BSD tarnecesitan la -Popción para que deshabiliten esta protección. Consulte la sección Nombres de archivos absolutos en el manual de GNU tar.

Sin -Pembargo, POSIX no especifica el indicador, por lo que otros tarprogramas pueden tener diferentes formas de lidiar con esto. Por ejemplo, las herramientas Schily stardel programa de usos -/y -..para desactivar estas protecciones.

Lo único que podría considerar agregar a un tarcomando ingenuo es una -Cbandera para forzarlo a extraer cosas en un directorio temporal seguro, para que no tenga que hacerlo cdprimero.


A un lado :

  1. Técnicamente, tarPOSIX ya no lo especifica. Intentaron decirle al mundo informático de Unix que deberíamos estar usando paxahora en lugar de tary cpio, pero el mundo informático los ignoró en gran medida.

    Es relevante tener en cuenta que la especificación POSIX para paxno dice cómo debe manejar las barras inclinadas o los ..elementos incrustados . Hay un --insecureindicador no estándar para que BSDpax suprima las protecciones contra ..elementos de ruta incrustados , pero aparentemente no hay una protección predeterminada contra las barras diagonales principales; la paxpágina de manual de BSD recomienda indirectamente escribir -sreglas de sustitución para tratar el riesgo de ruta absoluto.

    Ese es el tipo de cosas que suceden cuando un estándar de facto permanece en uso activo mientras que el estándar de jure se ignora en gran medida.

Warren Young
fuente
77
pax - portable archive interchangeAwww, qué lindo, POSIX pensando que va a reemplazar posiblemente el formato de archivo más utilizado: P
cat
1
@cat El formato de archivo predeterminado es una variante tar razonablemente ampliamente compatible (AIUI también se supone que admite el formato cpio). Pax es más bien un intento de reemplazar la interfaz de comando para manejar dichos archivos, ya que el manejo de argumentos de comando de tar es ... peculiar.
Random832
Nota al azar: estoy bastante seguro de que es "de jour", es decir, la palabra francesa, en lugar de "de jure".
Financia la demanda de Mónica el
77
@QPaysTaxes no lo es. de jure es latino y contrasta con la situación actual, es decir, lo que es de facto. De jour también debe ser du jour para obedecer las reglas gramaticales francesas.
Prime
1
Este es un caso de un afortunado falso afín. El francés "du jour" ("del día") se parece / suena mucho al latín "de jure" ("de derecho") aquí contrastado con "de facto" ("de hecho"). Se podría argumentar que pax es el "estándar del mes" o "estándar del día" para burlarse de cómo se proponen nuevos estándares con tanta frecuencia, mientras que la gran cantidad de usuarios simplemente se queda con lo que les funciona (estándar de facto), sabiendo que (metafóricamente) habrá un nuevo estándar mañana para que ignoren.
Monty Harder
19

Con GNU tar, es simplemente

tar -xvf untrusted_file.tar

en un directorio vacio GNU tar elimina automáticamente /los nombres de los miembros principales cuando se extrae, a menos que explícitamente no se indique lo contrario con la --absolute-namesopción . GNU tar también detecta cuándo el uso de ../haría que un archivo se extrajera fuera del directorio de nivel superior y coloca esos archivos en el directorio de nivel superior, por ejemplo, un componente foo/../../bar/quxse extraerá como bar/quxen el directorio de nivel superior bar/quxen lugar del padre del directorio de nivel superior . GNU tar también se encarga de los enlaces simbólicos que apuntan fuera del directorio de nivel superior, por ejemplo, foo -> ../..y foo/barno hará barque se extraiga fuera del directorio de nivel superior.

Tenga en cuenta que esto solo se aplica a (versiones suficientemente recientes de) GNU tar (así como a algunas otras implementaciones, por ejemplo, * BSD tar y BusyBox tar). Algunas otras implementaciones no tienen dicha protección.

Debido a los enlaces simbólicos, las protecciones que usa no serían suficientes: el archivo podría contener un enlace simbólico que apunta a un directorio fuera del árbol y extraer archivos en ese directorio. No hay forma de resolver ese problema basándose únicamente en los nombres de los miembros, debe examinar el objetivo de los enlaces simbólicos.

Tenga en cuenta que si está extrayendo en un directorio que ya contiene enlaces simbólicos, es posible que la garantía ya no se mantenga.

Gilles 'SO- deja de ser malvado'
fuente
6

Para cubrir algunos puntos, las otras respuestas no lo han hecho:

  1. Primero, mira lo que hay en el archivo antes de extraerlo:

    tar -tvf untrusted_tar_file.tar
    

    Si hay algo allí en lo que no confías o no quieres extraer, no extraigas el tarball.

  2. En segundo lugar, extraiga el tarball como usuario no root que solo tiene acceso de escritura al único directorio en el que extrae el tarball. Por ejemplo, extraiga el tarball desde el directorio de inicio del usuario no root.
Andrew Henle
fuente
44
1. Eso no es práctico para las operaciones por lotes. 2. A menos que esté ejecutando una configuración personalizada, todos los usuarios pueden escribir en ciertas ubicaciones, especialmente / tmp /
pipe
@pipe one también podría crear un directorio y un nuevo usuario, y solo ese usuario tiene acceso solo a ese directorio, luego ejecutar el comando. Me gusta mucho mi directorio personal, gracias.
gato
2
@pipe ¿Por qué Dios nunca pasaría datos no confiables a través de una operación por lotes? Si no confías en él, NO lo ejecutes sin supervisión.
Andrew Henle
66
@ AndrewHenle Uhm, está bien. ¿Cómo crees que funciona cada servidor en Internet? ¿Crees que alguien en stackexchange ejecuta este comentario a través de su base de datos y sistema de marcado mientras monitorea manualmente la operación? Debido a que esta entrada son datos no confiables a través de una operación por lotes.
tubería
No recomendaría extraer un archivo no confiable directamente en un directorio de inicio. No quieres que te sobrescriba .bashrc y otros archivos .config /, ¿verdad?
Hugal31