¿Hay alguna forma de evitar que un usuario cree ejecutables y los ejecute?

31

Los ataques de ransomware podrían usar exploits de día cero, pero a menudo un atacante engañará a un usuario crédulo para que ejecute un ejecutable al descargar y hacer clic.

Supongamos que tenemos un usuario ingenuo y queremos restringirlo a la ruta normal. ¿Hay alguna forma de restringirlos para que no creen un archivo con privilegio ejecutable?

O, de manera más general, ¿hay alguna forma de crear una lista de control de acceso y definir que este usuario solo puede ejecutar archivos en esta lista?

Dov
fuente
77
Deshabilitar la ejecución de esta manera prohibiría a los usuarios poder hacer cualquier cosa en el sistema. No hay ningún mecanismo para esto integrado en el sistema o incluso con software de terceros que conozco para hacer este tipo de bloqueo de seguridad
Thomas Ward
3
no responde pero insinúa lo que puedes hacer: agrega noexec en los montajes de escritura del usuario. No evitará los scripts, sino la ejecución binaria real.
GoFundMonica - codidact.org
3
@ThomasWard, ¿no es eso exactamente lo que es un shell restringido?
Robert Riedl
77
@ThomasWard existe un concepto general de 'ejecutables incluidos en la lista blanca' donde se permite una cierta lista de ejecutables (generalmente firmados) y no se puede ejecutar nada más sin privilegios elevados; y tanto Windows como OS X tienen soluciones razonables que hacen esto. Sin embargo, no sé si hay una buena solución de Ubuntu (u otra Linux) para la lista blanca de aplicaciones.
Peteris
2
@Peteris, hay múltiples soluciones de este tipo. Mi favorito es tener un sistema de archivos firmado y de solo lectura con sus ejecutables y montar todos los demás noexec, en la línea de cómo ChromeOS utiliza dm_veritypara garantizar la integridad del sistema de archivos raíz. Para la gente que no es tan hardcore, uno puede usar módulos EVM; ver wiki.gentoo.org/wiki/Extended_Verification_Module para la documentación de Gentoo sobre el mismo.
Charles Duffy

Respuestas:

50

El ataque específico por el que has expresado preocupación es:

a menudo, un atacante engañará a un usuario crédulo para que ejecute un ejecutable descargando y haciendo clic.

Al menos en el caso común en el que el archivo se descarga en un navegador web, esto ya debería evitarse en Ubuntu por la adhesión del navegador a la política de bit de permiso de ejecución requerido . Las partes más directamente relevantes de esa política son:

  • Las aplicaciones, incluidos los escritorios y los shells, no deben ejecutar código ejecutable desde archivos cuando ambos son:

    • sin el bit ejecutable
    • ubicado en el directorio de inicio de un usuario o directorio temporal.
  • Los archivos descargados de un navegador web, cliente de correo, etc. nunca deben guardarse como ejecutables.

Entonces, si se le dice a un usuario que descargue un programa en un navegador web, lo hace e intenta ejecutar el archivo haciendo doble clic en él, no se ejecutará. Esto se aplica incluso si el archivo descargado es un script de shell o incluso un archivo .desktop. (Si alguna vez se ha preguntado por qué los archivos .desktop en su directorio de inicio deben marcarse como ejecutables aunque en realidad no sean programas, es por eso).

Es posible que los usuarios alteren este comportamiento a través de cambios de configuración. La mayoría no lo hará, y aunque los que lo hacen probablemente no deberían, eso no es realmente de lo que deba preocuparse. La mayor preocupación es el ataque más complejo que creo que ya le preocupa, en el que una persona maliciosa (o bot) le indica al usuario que descargue un archivo específico, lo marque como ejecutable (a través de su buscador de archivos o con chmod), y entonces ejecútalo.

Desafortunadamente, restringir la capacidad de un usuario para establecer el bit de ejecución en un archivo o para ejecutar archivos que no sean los de alguna lista blanca no mitigaría notablemente el problema. Algunos ataques ya funcionarán, y los que no pueden modificarse trivialmente para que lo hagan. El problema fundamental es que el efecto de ejecutar un archivo se puede lograr incluso si el archivo no tiene permisos ejecutables .

Esto se ilustra mejor con un ejemplo. Supongamos que evilhay un archivo en el directorio actual que, si se le otorgan permisos ejecutables ( chmod +x evil) y run ( ./evil), haría algo malo. Dependiendo de qué tipo de programa sea, uno de los siguientes puede lograr el mismo efecto:

Ninguno de ellos, ni siquiera el último, requiere que el archivo tenga permisos ejecutables o que el usuario pueda otorgarle permisos ejecutables.

Pero las instrucciones maliciosas ni siquiera tienen que ser tan complicadas. Considere este comando no malicioso , que es una de las formas recomendadas oficialmente para instalar o actualizar NVM :

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash

La razón por la que no es malicioso es que NVM no es malware, pero si la URL fuera en lugar del script de alguien que hace mal cuando se ejecuta, ese comando descargaría y ejecutaría el script. En ningún momento ningún archivo necesitaría permisos ejecutables. Descargar y ejecutar el código contenido en un archivo malicioso con un solo comando como este es, creo, una acción bastante común que los atacantes engañan a los usuarios para que tomen.

Puede pensar en restringir qué intérpretes están disponibles para que los usuarios los ejecuten. Pero no hay realmente una manera de hacer esto que no afecte sustancialmente las tareas ordinarias que presumiblemente desea que los usuarios puedan hacer. Si está configurando un entorno extremadamente restringido en el que se prohíbe casi todo lo que un usuario pensaría hacer en una computadora, como un quiosco que solo ejecuta un par de programas, entonces esto podría proporcionar alguna medida de protección significativa. Pero no parece que sea su caso de uso.

Entonces, la respuesta aproximada a su pregunta es "No". La respuesta más completa es que probablemente podría evitar que los usuarios ejecuten cualquier archivo, excepto los que proporciona en una lista blanca. Pero eso es en el sentido estricto y técnico de "ejecutar", que no es necesario para lograr el efecto completo de ejecutar la mayoría de los programas o scripts. Para evitar que , se podría tratar de hacer la lista blanca muy pequeña, por lo que no incluyó ningún intérpretes excepto aquellos que podrían ser muy restringidas. Pero incluso si lograste eso, los usuarios no podrían hacer mucho, y si lo hiciste tan pequeño que no podrían lastimarse, probablemente no podrían hacer nada. (Ver el comentario de Thomas Ward ).

Si sus usuarios pueden lastimarse a sí mismos, pueden ser engañados para lastimarse a sí mismos.

Es posible que pueda restringir el uso de programas específicos o comportarse de otra manera de una manera que pueda ser dañina, y si observa patrones específicos que el ransomware tiende a seguir, puede evitar algunos casos comunes específicos. (Ver AppArmor .) Eso podría proporcionar algún valor. Pero no le dará nada parecido a la solución integral que espera.

Cualesquiera que sean las medidas técnicas (si las hay) que termine tomando, su mejor opción es educar a los usuarios. Esto incluye decirles que no ejecuten comandos que no entienden y que no usen los archivos descargados en situaciones en las que no podrían explicar por qué es razonablemente seguro hacerlo. Pero también incluye cosas como hacer copias de seguridad, de modo que si algo sale mal (debido a malware o no), el daño causado será lo menos posible.

Eliah Kagan
fuente
66
Quizás las medidas no técnicas deben incluir tener información de contacto de alguien que pueda verificar la sanidad algo que quiera hacer. Cada vez que no estén seguros, llame o envíe un mensaje y pregunte. Eso podría eliminar la tentación de adivinar.
Peter Cordes
1
Este es un gran resumen sobre los problemas y temores detrás de la pregunta de los OP
Robert Riedl
Minor nit: " . ./evilo source ./evilejecuta los comandos en evil.sh" - Esos sourcecomandos ejecutarían los comandos a evilmenos que especifiquen la extensión, por ejemplo. ./evil.sh
pausa hasta nuevo aviso.
@DennisWilliamson Gracias - ¡arreglado! Eso quedó de un borrador anterior (no presentado) de la respuesta en el que utilicé diferentes nombres de guiones. Rápidamente me di cuenta de que era una tontería, pero aparentemente no pude cambiar todas las ocurrencias.
Eliah Kagan
1
Cada vez que veo una manera de instalar o actualizar una pieza de software que implica "simplemente ejecutar este script y ejecutarlo", mis uñas de los pies se curvan un poco. Nada está impidiendo que alguien cree una cuenta / repositorio de GitHub que está desactivada por un solo carácter, o usa 0 en lugar de O, o usa caracteres UTF-8 para la oscuridad y pega su propio script malicioso ... entonces todo lo que necesita es uno error tipográfico en su comando wget y bam.
Ian Kemp
11

*


Se llama un shell restringido.

Puede usar /bin/rbash, que ya está disponible en Ubuntu y combinarlo con una variable PATH restringida . La rbashvoluntad prohibirá la ejecución de cualquier cosa que no esté dentro $PATH.

Agregar un usuario restringido:

sudo adduser --shell /bin/rbash res-user

Cree un nuevo directorio, en el que podamos vincular binarios, en el que el usuario estará limitado a:

sudo mkdir /home/res-user/bin

Modificar el .profilearchivo:

sudo vim /home/res-user/.profile

if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

readonly PATH=/home/res-user/bin
export PATH

Hacer el .profile, bashrce .bash_profileinmutable:

sudo chattr +i /home/res-user/.profile
sudo chattr +i /home/res-user/.bashrc
sudo chattr +i /home/res-user/.bash_profile

Ahora le damos al usuario lo único que se le permitirá hacer, es decir, abrir Firefox:

sudo ln -s /usr/lib/firefox/firefox /home/res-user/bin/

Ahora, si iniciamos sesión ya res-userque solo podemos abrir Firefox:

res-user@localhost:~$ /home/res-user/bin/firefox --version
Mozilla Firefox 68.0.1

No podemos escapar fácilmente de nuestro shell restringido:

res-user@localhost:~$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
-su: PATH: readonly variable

El usuario restringido no puede hacer que los archivos sean ejecutables o iniciarlos:

res-user@localhost:~$ chmod +x script.sh 
Command 'chmod' is available in '/bin/chmod'
res-user@localhost:~$ bash script.sh 
Command 'bash' is available in '/bin/bash'
The command could not be located because '/bin' is not included in the PATH environment variable.
bash: command not found

El usuario restringido no puede ejecutar scripts malvados desde Internet, porque el usuario no puede ejecutar los comandos necesarios:

res-user@localhost:~$ wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
Command 'wget' is available in '/usr/bin/wget'
The command could not be located because '/usr/bin' is not included in the PATH environment variable.
wget: command not found
Command 'bash' is available in '/bin/bash'
The command could not be located because '/bin' is not included in the PATH environment variable.
bash: command not found

* Hay formas de salir de los caparazones restringidos , pero si su usuario es capaz de eso, es posible que no sean tan crédulos como cree.

Robert Riedl
fuente
2
Esto trata de lograr "un entorno extremadamente restringido en el que se prohíbe casi todo lo que un usuario pensaría hacer en una computadora" (como lo expresé en mi respuesta). res-userNo puedo iniciar sesión gráficamente. Lo único útil que pueden hacer es ssh -Xentrar y correr firefox. Puede permitir más comandos para que el usuario pueda hacer su trabajo. Entonces estallar se vuelve más fácil. Varios de los métodos vinculados se pueden convertir en líneas simples (que puede proporcionar un atacante). Si los usuarios encuentran restricciones sofocantes, se convertirán en expertos en eludirlos, sin dejar de ser tan inteligentes o crédulos como lo eran antes.
Eliah Kagan
1
@EliahKagan sí, correcto. Tendría que vincular todo lo que el usuario necesita. Pero esto está muy cerca de [...] si hay alguna forma de crear una lista de control de acceso y definir que este usuario solo puede ejecutar archivos en esta lista [...] . Por lo tanto, podría ayudar a OP. Romper estas conchas no es imposible, pero sí bastante difícil. Hemos tenido configuraciones similares para acceso externo a recursos específicos, o hosts de salto. Dudo que haya ataques generales, contra configuraciones de shell restringido ... y si se trata de un ataque dirigido , donde el atacante conoce el entorno ... todas las apuestas están canceladas de todos modos.
Robert Riedl
44
Elevaría la nota a pie de página a la primera línea de su respuesta.
Pausado hasta nuevo aviso.
Probablemente sea mejor que utilicen Chrome en modo quiosco u otro navegador reforzado. Debería ser bastante fácil instalar un complemento o extensión de Firefox con permisos muy elevados y ejecución de comandos del sistema. En Firefox, asegúrese de usar la última versión y no permitir extensiones.
Benjamin Gruenbaum
Para mayor protección, otorgue al usuario solo acceso de escritura a los sistemas de archivos montados con la opción noexec.
Dan D.