Ejecución de código arbitrario

La ejecución de código arbitrario  es un error en un sistema de software cuando un usuario malintencionado ( pirata informático ) puede obligarlo a ejecutar cualquier código de máquina que desee. Si se puede hacer que una máquina ejecute código arbitrario a través de una red, esto a veces se denomina ejecución remota de código . Esta es la vulnerabilidad de software más peligrosa: el código malicioso se introduce a través de acciones aparentemente inofensivas (por ejemplo, descargar un archivo de datos) y puede hacer cualquier cosa dentro de los privilegios del programa: extraer información de la memoria del programa, enviarla a través de la red, leer , escribir y modificar archivos...

Una vulnerabilidad similar para la web se denomina secuencias de comandos entre sitios  , pero dado que JavaScript en sí tiene capacidades limitadas, entonces el daño suele ser menor, principalmente fugas de datos. Una vulnerabilidad similar para SQL se llama inyección de SQL y está cargada de todo lo que SQL puede hacer: fugas, sustituciones y pérdida de datos.

Razones

Las principales razones para ejecutar código arbitrario son:

Corrupción de memoria Ejemplo: el desbordamiento del búfer sobrescribe el puntero de retorno (en x86 , la pila crece y el puntero está después del marco de la pila ). Tan pronto como el programa necesita terminar la subrutina, el procesador extrae esta dirección de la pila y salta allí, a la subrutina del hacker. Serialización automática + exceso de confianza A menudo, en las bibliotecas de un programa o sistema hay clases vulnerables que ejecutan código por error, o del sistema que son realmente capaces de ejecutar cualquier cosa. En algunos lenguajes ( Java ) es habitual pasar estructuras de objetos complejos a través de la serialización estándar, y si un atacante envía un comando para crear dicho objeto, será posible ejecutar código arbitrario. WebSphere y Jenkins [1] tenían una vulnerabilidad similar . Ejecución aleatoria de código en operaciones sobre EXE y DLL que no impliquen esta ejecución Dos ejemplos: 1. En Windows , se carga un ícono desde una DLL a través de una función LoadLibraryque, entre otras cosas, ejecuta el código de inicialización de la DLL; por lo tanto, basta con navegar en el directorio con la DLL "envenenada" en Explorer para ejecutar el código malicioso. Resuelto a través de una bandera adicional LOAD_LIBRARY_AS_DATAFILE, sin ejecutar el código. 2. En los sistemas operativos similares a Unix, el programa lddque verifica las dependencias del programa es un script simple que ejecuta un archivo ELF con ciertas configuraciones del sistema [2] . No resuelto: simplemente no ejecute ldd en archivos no verificados.

Defensa

Prohibición de modificación de segmentos de código y ejecución de segmentos de datos En este caso, el programa simplemente no podrá escribir nada en la memoria que se pueda ejecutar. Una opción extrema es la arquitectura Harvard , común en máquinas limitadas, en la que el código y los datos se ubican en diferentes espacios de direcciones. Desventaja: existe código automodificable , cargadores nativos (compresión de archivos ejecutables, protección contra copias...), compilación JIT . Ejecutar programas con derechos que no permitirán mucho daño. Dado que trabajar en una cuenta restringida es bastante inconveniente, Microsoft implementó el Control de cuentas de usuario , que evita que los programas funcionen con datos del sistema. En los navegadores, como los programas que reciben los ataques de piratas informáticos más masivos, existe el trabajo de las pestañas en procesos limitados; esto se implementó primero en Google Chrome y luego en Firefox Quantum. Desventaja: la complejidad del sistema de distribución de derechos; en cualquier caso, habrá programas con amplios derechos, y se convertirán en el principal objetivo de los piratas informáticos. Aleatorización del espacio de direcciones del programa ( ASLR ) Las direcciones no persistentes dificultan la creación de un exploit en vivo. Desventajas: carga lenta. Autocomprobaciones ampliadas en bibliotecas Se utilizan en software crítico que es especialmente propenso a ataques de piratas informáticos (por ejemplo, en software de red). Por ejemplo, en el sistema de tiempo de ejecución de Java , el acceso a una matriz u objeto siempre se verifica, lo que dificulta la corrupción de la memoria. Desventaja: rendimiento reducido. Restricciones de estilo de código Por lo tanto, el estándar de código rígido MISRA C adoptado en la industria automotriz está diseñado para reducir el riesgo de error. Uso de máquinas virtuales limitadas y lenguajes de secuencias de comandos en lugar de código de máquina Si se desea programabilidad pero el malware es inaceptable, se utiliza un lenguaje altamente restringido. Así funcionan Java , JavaScript , muchos de los sistemas operativos de los smartphones, incluido Android . Este esquema también resuelve otros problemas: brinda independencia de la arquitectura del procesador, simplifica la programación, la falla del programa no conduce a la falla de todo el sistema. Desventaja: extrema complejidad del sistema y los controles de seguridad difíciles resultantes, bajo rendimiento.

Notas

  1. ¿Qué tienen en común WebLogic, WebSphere, JBoss, Jenkins, OpenNMS y su aplicación? Esta vulnerabilidad
  2. Ejecución de código arbitrario ldd