¿Cómo fakeroot no es una violación de seguridad en Linux?


18

Después de leer algunas respuestas bastante agradables de esta pregunta , todavía no sé por qué querría fingir que es root sin obtener ninguno de los beneficios de ser root.

Hasta ahora, lo que puedo deducir es que fakeroot se usa para dar propiedad a un archivo que debe ser root cuando se descomprime / tar'ed. Mi pregunta es, ¿por qué no puedes hacer eso con chown?

Una discusión de Grupos de Google aquí señala que necesita fakeroot para compilar un núcleo Debian (si desea hacerlo desde un usuario no privilegiado). Mi comentario es que, la razón por la que necesita ser root para compilar es probablemente porque los permisos de lectura no se establecieron para otros usuarios. Si es así, ¿no es una violación de seguridad que fakeroot permita la compilación (lo que significa que gcc ahora puede leer un archivo que era para root)?

Esta respuesta aquí describe que las llamadas reales del sistema se realizan con uid / gid real del usuario , así que de nuevo, ¿dónde ayuda fakeroot?

¿Cómo detiene fakeroot las escaladas de privilegios no deseadas en Linux? Si fakeroot puede engañar al alquitrán para que cree un archivo propiedad de root, ¿por qué no hacer algo similar con SUID?

Por lo que he reunido, fakeroot es útil cuando quieres cambiar el propietario de cualquier archivo de paquete que hayas creado para rootear. Pero puede hacer eso con chown, entonces , ¿ dónde me falta entender cómo se supone que se usará este componente?


1
No necesita fakeroot para compilar un núcleo. El sistema de compilación del núcleo no es tan loco. La discusión vinculada se trata de crear un paquete de kernel de Debian , en el que la compilación real del kernel es solo un paso.

@ WumpusQ.Wumbley Corregiré eso, y ¿podría decirme por qué ese es el caso?
ng.newbie

¿Porque fakeroot es una cosa de Debian y Linux es más que Debian?

@ WumpusQ.Wumbley debería ejecutarse en cualquier distribución.
user253751

Respuestas:


33

Hasta ahora, lo que puedo deducir es que fakeroot se usa para dar propiedad a un archivo que debe ser root cuando se descomprime / tar'ed. Mi pregunta es, ¿por qué no puedes hacer eso con chown?

Porque no puedes hacer eso con chown, al menos no como usuario no root. (Y si está ejecutando como root, no necesita fakeroot). Ese es el objetivo de fakeroot: permitir que los programas que esperan ejecutarse como root se ejecuten como un usuario normal, al tiempo que se pretende que las operaciones que requieren root tengan éxito.

Esto se usa normalmente al compilar un paquete, de modo que el proceso de instalación del paquete que se está instalando puede continuar sin errores (incluso si se ejecuta chown root:root, o install -o root, etc.). fakerootrecuerda la propiedad falsa que pretendía dar archivos, por lo que las operaciones posteriores que miran la propiedad ven esto en lugar de la real; esto permite tarejecuciones posteriores, por ejemplo, para almacenar archivos como propiedad de root.

¿Cómo detiene fakeroot las escaladas de privilegios no deseadas en Linux? Si fakeroot puede engañar al alquitrán para que cree un archivo propiedad de root, ¿por qué no hacer algo similar con SUID?

fakerootno engaña tara hacer nada, conserva los cambios que la compilación desea realizar sin permitir que esos cambios surtan efecto en el sistema que aloja la compilación. No necesita fakerootproducir un tarball que contenga un archivo propiedad de root y suid; si tiene un binario evilbinary, en ejecución tar cf evil.tar --mode=4755 --owner=root --group=root evilbinary, como usuario normal, creará un tarball que contiene evilbinary, propiedad de root y suid. Sin embargo, no podrá extraer ese tarball y preservar esos permisos a menos que lo haga como root: aquí no hay escalada de privilegios. fakerootes un privilegio deherramienta de escalado: le permite ejecutar una compilación como usuario normal, al tiempo que conserva los efectos que la compilación habría tenido si se hubiera ejecutado como raíz, lo que permite que esos efectos se reproduzcan más tarde. Aplicar los efectos "de verdad" siempre requiere privilegios de root; fakerootno proporciona ningún método para adquirirlos.

Para comprender el uso fakerootcon más detalle, considere que una distribución de distribución típica implica las siguientes operaciones (entre muchas otras):

  • instalar archivos, propiedad de root
  • ...
  • archivar esos archivos, aún propiedad de root, de modo que cuando se extraigan, serán propiedad de root

La primera parte obviamente falla si no eres root. Sin embargo, cuando se ejecuta bajo fakeroot, como usuario normal, el proceso se convierte

  • instalar archivos, propiedad de root: esto falla, pero fakerootpretende que tiene éxito y recuerda la propiedad modificada
  • ...
  • archivar esos archivos, aún propiedad de root: cuando tar(o cualquier archivo que se esté usando) pregunta al sistema cuál es la propiedad del archivo, fakerootcambia la respuesta para que coincida con la propiedad que registró anteriormente

Por lo tanto, puede ejecutar una compilación de paquetes sin ser root, mientras obtiene los mismos resultados que obtendría si realmente se ejecutara como root. El uso fakerootes más seguro: el sistema aún no puede hacer nada que su usuario no pueda hacer, por lo que un proceso de instalación no autorizado no puede dañar su sistema (más allá de tocar sus archivos).

En Debian, las herramientas de compilación se han mejorado para que ya no sea necesario, y puede compilar paquetes sin ellasfakeroot . Esto es compatible dpkgdirectamente con la Rules-Requires-Rootdirectiva (ver rootless-builds.txt).

Para comprender el propósito fakerooty los aspectos de seguridad de la ejecución como root o no, puede ser útil considerar el propósito del empaquetado. Cuando instala un software desde la fuente, para usarlo en todo el sistema, proceda de la siguiente manera:

  1. construir el software (que se puede hacer sin privilegios)
  2. instale el software (que debe hacerse como root, o al menos como un usuario autorizado para escribir en las ubicaciones apropiadas del sistema)

Cuando empaqueta una pieza de software, está retrasando la segunda parte; pero para hacerlo con éxito, aún necesita "instalar" el software en el paquete en lugar de en el sistema. Entonces, cuando empaqueta el software, el proceso se convierte en:

  1. construir el software (sin privilegios especiales)
  2. pretender instalar el software (nuevamente sin privilegios especiales)
  3. capturar la instalación del software como un paquete (ídem)
  4. hacer que el paquete esté disponible (ídem)

Ahora un usuario completa el proceso instalando el paquete, que debe hacerse como root (o de nuevo, un usuario con los privilegios apropiados para escribir en las ubicaciones apropiadas). Aquí es donde se realiza el proceso privilegiado retrasado, y es la única parte del proceso que necesita privilegios especiales.

fakeroot ayuda con los pasos 2 y 3 anteriores al permitirnos ejecutar procesos de instalación de software y capturar su comportamiento, sin ejecutarlo como root.


1
@ ng.newbie Si desea una explicación alternativa: es completamente posible para mí usar un editor hexadecimal para construir manualmente un archivo tar que contenga archivos propiedad de root o con cualquier otro permiso posible. Es solo algo de información agrupada, después de todo, no tiene ningún poder hasta que el archivo realmente exista en el sistema.
mbrig

@ ng.newbie ¿Lo descomprimes con fakeroot o sin fakeroot?
user253751

2
@ ng.newbie, además, si desea crear un tarball con un binario suid-root con fines maliciosos, puede hacerlo en otra máquina como raíz real y luego copiarlo en el destino. No hay necesidad de fakeroot allí. fakeroot es solo una herramienta para ayudar a crear el archivo tar, elimina la necesidad de usar tar --mode --ownertodos y cada uno de los archivos agregados al archivo (y también funciona con otros programas). Los posibles problemas surgen si / cuando desempaqueta un archivo tar o archivo no confiable como raíz, no cuando lo crea.
ilkkachu

7

NO. La raíz falsa le permite ejecutar herramientas de manipulación de permisos e informes, informará constantemente. Sin embargo, en realidad no otorgará estos permisos. Simplemente parecerá que los tienes (falso). No cambiará nada fuera del medio ambiente.

Es útil, si desea crear una estructura de directorio, que contenga propiedad y permisos, que su usuario no pueda establecer, que luego usará tar, zip u otro paquete.

Que no realmente elevar los permisos, es falso. No le permite hacer nada (borrar, escribir, leer) que de otro modo no podría hacer. Podría producir el paquete (en teoría) sin él. Podría obtener un informe falso ( ls) sin él.

No es una falla de seguridad, ya que no permite el acceso, ni nada que no pueda hacer sin él. Se ejecuta sin privilegios. Todo lo que dosis es interceptar llamadas a chown, chmod, etc. ellas un no-operación hace, excepto que registra lo que habría sucedido. También intercepta llamadas a statetc. para que informe los permisos y la propiedad, desde su propia base de datos interna, como si se hubieran hecho los otros comandos. Esto es útil, porque si luego comprime el directorio, tendrá los permisos falsos. Si luego descomprime, como root, los permisos se volverán reales.

Cualquier archivo que no sea legible / editable anteriormente, no será legible / editable. Cualquier archivo especial (por ejemplo, dispositivos) creado, no tendrá poderes especiales. Cualquier set-uid (a otro usuario), los archivos no se establecerán-uid. Cualquier otra escalada de privilegios no funcionará.

Es un tipo de máquina virtual: una máquina virtual, en general, puede simular cualquier entorno / SO, pero no puede hacer nada al host, como ninguna otra aplicación podría hacer. Dentro de la máquina virtual, puede parecer que haces cualquier cosa. Puede reinventar el sistema de seguridad para que sea igual o diferente. Sin embargo, todo esto existirá en el host, como recursos propiedad del usuario / grupo del proceso que ejecuta el entorno virtual.


@ ctrl-alt-decor Como he preguntado en el comentario anterior, en * nix no es posible configurar el propietario para rootear desde otro usuario no privilegiado, ¿correcto? Entonces, debe haber una buena razón para eso si un programa lo permite, ¿cómo no es una falla de seguridad?
ng.newbie

@ ctrl-alt-decor El fakeroot no me permite leer / escribir / eliminar, pero si escribí un contenedor para las llamadas al sistema, es lógico que pueda hacer esas operaciones también.
ng.newbie

@ ctrl-alt-decor Por lo tanto, la única razón para que exista fakeroot es establecer permisos para que un archivo rootee sin ser root. Si eso no es una falla de seguridad, ¿por qué Linux no lo permitiría en primer lugar?
ng.newbie

1
No, le permite falsificar la configuración de usuario a cualquier usuario y falsificar algunas otras cosas. Pruébelo: ejecute fakeroot y mire los archivos desde afuera, intente acceder a los archivos, que no debería.
ctrl-alt-delor

4

Ya hay dos respuestas buenas y muy detalladas aquí, pero solo señalaré que el párrafo introductorio de la página de manual original 1 en realidad lo explica de manera bastante clara y concisa:fakeroot

fakeroot ejecuta un comando en un entorno en el que parece tener privilegios de root para la manipulación de archivos. Esto es útil para permitir a los usuarios crear archivos (tar, ar, .deb, etc.) con archivos en ellos con permisos / propiedad raíz. Sin fakeroot, uno tendría que tener privilegios de root para crear los archivos constitutivos de los archivos con los permisos y la propiedad correctos, y luego empaquetarlos, o uno tendría que construir los archivos directamente, sin usar el archivador.

Fakeroot permite a un usuario no root crear archivos que contengan archivos propiedad de root, lo cual es una parte crítica de la generación y distribución de paquetes de software binario en Linux. Sin ellos fakeroot, los archivos de paquetes tendrían que generarse mientras se ejecutan como raíz real, de modo que contengan la propiedad y los permisos correctos del archivo. Eso sería un riesgo de seguridad. Crear y empaquetar software potencialmente no confiable es una gran exposición si se hace con privs raíz. Gracias a fakeroot, un usuario sin privilegios con archivos sin privilegios aún puede generar archivos que contienen archivos con propiedad raíz. 2

Pero no es un riesgo de seguridad, porque no hay nada en el archivo es en realidad propiedad de root hasta que los archivos se EXTRAEN . E incluso entonces, los archivos solo se extraerán con sus permisos de raíz intactos si lo hace un usuario privilegiado. Ese paso, donde un fakerootusuario privilegiado extrae un archivo asistido que contiene archivos "raíz", es donde la raíz "falsa" finalmente se vuelve real. Hasta ese momento, no se obtienen ni se omiten los privilegios de root reales.

Notas

  1. Fakeroot ha generado algunos competidores / imitadores que se disfrazarán como fakerootsi estuvieran instalados, incluidos fakeroot-ngy pseudo. Pero, en mi humilde opinión, ni la página de manual de "imitador" es tan clara acerca de ir directamente al grano en esta pregunta. Quédese con el original, único fakerootOG
  2. Otras distribuciones / sistemas de empaque superan esto simplemente al no utilizar la propiedad raíz en sus archivos de paquetes. En Fedora, por ejemplo, un usuario sin privilegios puede compilar, instalar y empaquetar el software sin necesidad de hacerlo fakeroot. Todo se hace dentro del $HOME/rpmbuild/espacio del usuario , y los pasos normalmente privilegiados como make installser redirigido (a través de mecanismos como --prefixy DESTDIR) a una $HOME/rpmbuild/BUILDROOT/jerarquía que podría considerarse una especie de espacio "fakechroot" (sin usar realmente fakechroot).

    Pero incluso durante make install, todo se ejecuta como propiedad del usuario sin privilegios. La propiedad y los permisos de los archivos extraídos se establecerán en root,rooty 0644(o 0755para los ejecutables) de manera predeterminada, a menos que se anulen en el .specarchivo de definición del paquete ( ) en cuyo caso se almacenan como metadatos dentro del paquete final. Debido a que los permisos o la propiedad no se aplican realmente hasta el proceso de instalación del paquete rpm (privilegiado), no fakerootse necesita ni root ni durante el empaquetado. Pero en fakerootrealidad es solo un camino diferente hacia el mismo resultado.


1
Con respecto a su primera nota, fakeroot-ng pretende reemplazar fakeroot, pero en la práctica no lo ha reemplazado, y AFAIK fakerootsigue siendo la herramienta utilizada en Debian de forma predeterminada (cuando sea necesario).
Stephen Kitt

@StephenKitt Aha! Gracias. Me preguntaba sobre eso. Inicialmente estaba confundido porque fui a buscar la página de fakerootmanual, y Google me dejó en casa fakeroot-ng(disfrazado de fakeroot(1)), y supongo que presumí en exceso. Pero ahora veo que fakeroot-ng no se ha actualizado desde 2014 , mientras que fakeroot todavía está activo . Aparentemente también hay un pseudo que lo intentó hace un par de años, pero ahora se ha estancado. Ajustaré mi respuesta en consecuencia.
FeRD

1
Sí, al principio también estaba confundido, ya que la página de fakerootmanual en el sitio de Debian conduce a fakeroot-ngla versión por defecto. Echa un vistazo al último párrafo de la fakeroot-ngpara un giro divertido ;-).
Stephen Kitt
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.