c++ - ¿Cuándo y cómo utilizar la función de protección de pila de GCC?
stack protection (2)
De hecho, no debería preocuparse por la advertencia de compilaciones normales. Es realmente más un mensaje informativo. Espero que sea obvio que tienes una preocupación de seguridad inherente con los búferes de tamaño variable en la pila; obtener el cálculo de tamaño incorrecto y está abriendo un gran agujero.
He habilitado la -Wstack-protector
al compilar el proyecto en el que estoy trabajando (un motor de juego multiplataforma C ++ comercial, que compila en Mac OS X 10.6 con GCC 4.2). Esta bandera advierte sobre las funciones que no estarán protegidas contra la -fstack-protector
pila aunque esté habilitado -fstack-protector
. GCC emite algunas advertencias al construir el proyecto:
función que no protege: ningún búfer de al menos 8 bytes de longitud
no protege las variables locales: buffer de longitud variable
Para la primera advertencia, encontré que es posible ajustar el tamaño mínimo que un buffer debe tener cuando se usa en una función, para que esta función esté protegida contra el --param ssp-buffer-size=X
pila: --param ssp-buffer-size=X
se puede usar, donde X es 8 por defecto y puede ser tan bajo como 1.
Para la segunda advertencia, no puedo suprimir sus ocurrencias a menos que deje de usar -Wstack-protector
.
- ¿Cuándo se debe
-fstack-protector
? (como en, por ejemplo, todo el tiempo durante el desarrollo, o simplemente cuando rastrea bugs?) - ¿Cuándo se debe
-fstack-protector-all
? - ¿Qué es "
-Wstack-protector
diciéndome? ¿Sugiere que disminuya el tamaño mínimo del buffer? - Si es así, ¿hay algún inconveniente para poner el tamaño en 1?
- Parece que "
-Wstack-protector
no es el tipo de indicador que desea habilitar en todo momento si desea una versión libre de advertencia. ¿Es esto correcto?
La protección de la pila es una estrategia de endurecimiento, no una estrategia de depuración. Si su juego es compatible con la red o si los datos provienen de una fuente no controlada, enciéndalo. Si no tiene datos provenientes de algún lugar sin control, no lo encienda.
Así es como funciona: si tiene un error y realiza un cambio en el búfer basado en algo que un atacante puede controlar, ese atacante puede sobrescribir la dirección de retorno o partes similares de la pila para hacer que ejecute su código en lugar de su código. La protección de pila abortará su programa si detecta que esto sucede. Sus usuarios no estarán contentos, pero tampoco serán pirateados. Este no es el tipo de piratería que se trata de hacer trampa en el juego, es el tipo de piratería que se trata de que alguien use una vulnerabilidad en tu código para crear un exploit que potencialmente infecte a tu usuario.
Para soluciones orientadas a la depuración, mira cosas como mudflap.
En cuanto a sus preguntas específicas:
- Utilice el protector de pila si obtiene datos de fuentes no controladas. La respuesta a esto es probablemente sí. Entonces úsalo. Incluso si no tiene datos de fuentes no controladas, es probable que tarde o temprano lo haga y no se dé cuenta.
Las protecciones de pila para todos los buffers se pueden usar si desea protección adicional a cambio de algún golpe de rendimiento. Desde el manual gcc4.4.2 :
-fiesta-protector
Emite código adicional para verificar desbordamientos de búfer, como ataques de destrucción de pila. Esto se hace agregando una variable de guardia a las funciones con objetos vulnerables. Esto incluye funciones que llaman alloca y funciones con búferes de más de 8 bytes. Las protecciones se inicializan cuando se ingresa una función y luego se verifican cuando la función sale. Si falla una verificación de guardia, se imprime un mensaje de error y el programa sale.
-fstack-protector-todo
Como -fstack-protector, excepto que todas las funciones están protegidas.
Las advertencias le dicen qué amortiguadores la protección de la pila no puede proteger.
- No necesariamente sugiere que disminuyas el tamaño mínimo de tu buffer, y en un tamaño de 0/1, es lo mismo que stack-protector-all. Solo se lo señala a usted para que pueda, si decide rediseñar el código para que el búfer esté protegido.
- No, esas advertencias no representan problemas, solo te señalan información. No los uses regularmente.