He estado contemplando el problema fundamental de los desbordamientos de pila, desde la clásica inyección de código de shell que no funciona con el bit NX a los nuevos artilugios ROP.
La primera pregunta que tuve fue con respecto a las CPU que tienen registros de sucursales. Parece como si realizar cualquiera de estos tipos de ataques en una CPU que rastrea las ramas en una "pila" de registros de ramas, como lo hace Itanium, por ejemplo, sería difícil si fuera posible. Obviamente, hay otros ataques que no requieren sobrescribir la IP de retorno, pero ¿la combinación de registros de rama y un bit NX no permite una gran cantidad de ataques? Si ese es el caso, ¿por qué la gente no considera usar arquitecturas de procesadores que emplean registros de sucursales para sus dispositivos perimetrales?
Como una pregunta de seguimiento, ¿por qué Intel / AMD no introduce un modo de operación en el que la serie de instrucciones CALL / RET se verifican y aplican? Parece que el verdadero problema es que la CPU deja en la pila el seguimiento de las IP de retorno en el cuidado del proceso. Sería una ruptura de compatibilidad muy mala simplemente no empujar el IP de retorno en la pila, o incluso empujar un valor aleatorio, pero ¿por qué no ofrecer un modo en el que la CPU en CALL empuja el IP de retorno en la pila Y en una CPU? almacén de respaldo administrado para este proceso / hilo / contexto. Estas páginas estarían totalmente fuera de los límites del proceso, excepto a través de CALL y RET. Cuando se ejecuta RET, la dirección extraída de la pila se compara con la dirección en el almacenamiento secundario y, si no son iguales, se cancela. Obviamente, esto sería más lento, pero para partes de aplicaciones sensibles a la seguridad, como aquellas que manejan entradas externas, la aplicación podría establecer la marca / modo seguro al elegir sacrificar el rendimiento por seguridad.
¿Este concepto tiene sentido? ¿Realmente mitigaría los ataques orientados a IP?