Firma de código en memoria

2

Dado que muchos códigos maliciosos se ejecutan solo en la memoria, ¿no sería posible firmar cada uno de los códigos ejecutables (funciones, etc.) de cada archivo PE y verificar antes de cada nueva secuencia iniciada que el código (en memoria) es de hecho firmado para continuar?

Con este sistema, si un proceso firmado desea inyectar parte de su código en otro proceso (a través de VirtualAllocEx, WriteProcessMemory, etc.) estará bien.

¿Cuáles son los defectos de mi razonamiento? ¿Se puede utilizar este mecanismo en la práctica (con algún cambio en la estructura de PE o en el sistema operativo)?

ed; Omito intencionalmente los lenguajes de script y la función de "código firmado en la memoria" que propongo se utilizará, por supuesto, además de funcionalidades como Windows Guard / AppLocker

    
pregunta cialeaks 23.03.2017 - 21:27
fuente

1 respuesta

1

Si un atacante tiene una vulnerabilidad de escritura arbitraria, puede omitir cualquier forma de firma de código en memoria implementada por software. Pueden modificar la memoria después de que se haya verificado el código pero antes de que se ejecute (una vulnerabilidad de TOCTOU clásica), o simplemente alternar cualquier bit que se use para verificar la integridad. La única forma en que esto funcionaría es si la verificación se implementara en hardware, con el código real verificado por la propia CPU. Sin embargo, es mucho más fácil usar controles de acceso estándar para evitar la inyección de memoria. En Linux, por ejemplo, esto se puede hacer con el Yama LSM. Esto es posible porque la inyección de memoria está mediada por el núcleo. El proceso de inyección debe especificar el destino y solicitar permiso para leer o escribir en su memoria. El kernel puede simplemente rechazar la solicitud, lo que obliga al proceso malintencionado a aumentar los privilegios un poco para modificar la memoria.

    
respondido por el forest 31.12.2017 - 05:30
fuente

Lea otras preguntas en las etiquetas