¿Cuándo y cómo utilizar la función de protección de stack de GCC?

He habilitado la -Wstack-protector al comstackr el proyecto en el que estoy trabajando (un motor de juego multiplataforma C ++ comercial, que comstack 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 stack 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 stack: --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 .

  1. ¿Cuándo se debe -fstack-protector ? (como en, por ejemplo, todo el tiempo durante el desarrollo, o simplemente cuando rastrea bugs?)
  2. ¿Cuándo se debe -fstack-protector-all ?
  3. ¿Qué es ” -Wstack-protector diciéndome? ¿Sugiere que disminuya el tamaño mínimo del buffer?
  4. Si es así, ¿hay algún inconveniente para poner el tamaño en 1?
  5. 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 stack 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 stack para hacer que ejecute su código en lugar de su código. La protección de stack abortará su progtwig 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:

  1. Utilice el protector de stack si obtiene datos de fonts no controladas. La respuesta a esto es probablemente sí. Entonces úsalo. Incluso si no tiene datos de fonts no controladas, es probable que tarde o temprano lo haga y no se dé cuenta.
  2. Las protecciones de stack 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 stack. 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 progtwig sale.

    -fstack-protector-todo

    Como -fstack-protector, excepto que todas las funciones están protegidas.

  3. Las advertencias le dicen qué amortiguadores la protección de la stack no puede proteger.

  4. 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.
  5. No, esas advertencias no representan problemas, solo te señalan información. No los uses regularmente.

De hecho, no debería preocuparse por la advertencia de comstackciones 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 stack; obtener el cálculo de tamaño incorrecto y está abriendo un gran agujero.