¿Por qué la CPU no verifica / impone las direcciones de llamada / devolución coincidentes?

0

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?

    
pregunta Jeremiah Gowdy 29.11.2013 - 19:54
fuente

2 respuestas

1

Su idea suena como ROP Defender aunque eso es un implementación de software.

Esto haría que el búfer se sobrecargue más, pero aunque ahora no puedo pensar en una forma de evitarlo, espero que algunas proezas inteligentes puedan sortearlo. Entonces, lo que propones es efectivamente otro tipo de técnica anti-explotación: sería una hermana de Stack Guard, DEP, ASLR, etc.

Al considerar las técnicas contra la explotación, hay dos consideraciones principales: la compatibilidad y el rendimiento. Estas técnicas solo se utilizan cuando hay una muy buena recompensa. Mi intuición es que esto no lo reducirá, demasiado dolor en el rendimiento por muy poco beneficio. Pero quién sabe, tal vez se implementará.

    
respondido por el paj28 29.11.2013 - 23:00
fuente
0

¿Cómo espera que la CPU verifique estas coincidencias? Tendría que memorizar la ubicación de las instrucciones de llamada. ¿Dónde los pondría? en una pila? Los procesadores no tienen almacenamiento de tamaño variable.

No sé de dónde sacas que una CPU "rastrea las ramas en una" pila "de registros de ramas". Este no es el caso en absoluto. Las CPU mantienen los datos de rama , pero no rastrean en qué orden se tomaron las ramas.

Incluso si la CPU de alguna manera encuentra un lugar para almacenar la dirección de la sucursal, se le debe informar sobre todas las cosas que rompen la coincidencia de llamada / ret: devoluciones no locales (excepciones), cambios de contexto, etc.

Además, ¡muchas arquitecturas de hardware (¿la mayoría?) ni siquiera tienen instrucciones de llamada / devolución! Al menos en ARM y MIPS, una llamada de función es un empuje seguido de una rama, y un retorno de función es una rama seguida de un pop. (Estoy simplificando pero entiendes la idea).

No conozco la característica de Itanium que mencionas, pero si realmente puede hacer lo que buscas, es altamente inusual.

En pocas palabras, lo que está proponiendo no puede funcionar con un procesador de hardware típico. Podría funcionar en algunas máquinas virtuales.

    
respondido por el Gilles 29.11.2013 - 20:39
fuente

Lea otras preguntas en las etiquetas