Pregunta

He activado la advertencia -Wstack-protector al compilar el proyecto en el que estoy trabajando (un motor comercial de juegos multiplataforma C ++, compilando en Mac OS X 10.6 con GCC 4.2). Este indicador advierte sobre funciones que no estarán protegidas contra el aplastamiento de la pila aunque -fstack-protector esté habilitado. GCC emite algunas advertencias al construir el proyecto:

  

función no protectora: sin búfer de al menos 8 bytes de largo
  no protege las variables locales: búfer de longitud variable

Para la primera advertencia, descubrí que es posible ajustar el tamaño mínimo que debe tener un búfer cuando se usa en una función, para que esta función esté protegida contra la destrucción de la 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 .

  1. ¿Cuándo se debe usar -fstack-protector ? (como en, por ejemplo, todo el tiempo durante el desarrollo, o solo cuando se rastrean errores)
  2. ¿Cuándo se debe usar -fstack-protector-all ?
  3. ¿Qué me dice -Wstack-protector ? ¿Sugiere que disminuya el tamaño mínimo del búfer?
  4. Si es así, ¿hay alguna desventaja en poner el tamaño a 1?
  5. Parece que -Wstack-protector no es el tipo de indicador que desea habilitar en todo momento si desea una compilación sin advertencia. ¿Es esto correcto?
¿Fue útil?

Solución

La protección de la pila es una estrategia de refuerzo, no una estrategia de depuración. Si tu juego es compatible con la red o tiene datos provenientes de una fuente no controlada, enciéndelo. Si no tiene datos provenientes de un lugar no controlado, no lo encienda.

Así es como se desarrolla: si tiene un error y realiza un cambio de 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 que ejecute su código en lugar de su código. La protección de pila anulará su programa si detecta que esto sucede. Sus usuarios no estarán contentos, pero tampoco serán pirateados. Este no es el tipo de pirateo que se trata de hacer trampa en el juego, es el tipo de pirateo que se trata de alguien que usa una vulnerabilidad en su código para crear una vulnerabilidad que potencialmente infecta a su usuario.

Para soluciones orientadas a la depuración, mire cosas como mudflap.

En cuanto a sus preguntas específicas:

  1. Use el protector de pila si obtiene datos de fuentes no controladas. La respuesta a esto es probablemente sí. Así que úsalo. Incluso si no tiene datos de fuentes no controladas, es probable que eventualmente lo haga o que ya no se dé cuenta.
  2. Se pueden usar protecciones de pila para todos los búferes si desea protección adicional a cambio de algún impacto en el rendimiento. Del gcc4.4.2 manual :

      
        
          

    -fstack-protector

                 

    Emite código adicional para verificar si hay desbordamientos del búfer, como ataques de destrucción de la pila. Esto se hace agregando una variable de protección a las funciones con objetos vulnerables. Esto incluye funciones que llaman a alloca y funciones con buffers de más de 8 bytes. Los guardias se inicializan cuando se ingresa una función y luego se verifican cuando la función sale. Si falla una verificación de protección, se imprime un mensaje de error y el programa se cierra.

                 

    -fstack-protector-all

                 

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

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

  4. No necesariamente sugiere que disminuyas el tamaño mínimo del búfer, y en un tamaño de 0/1, es lo mismo que stack-protector-all. Solo se lo señala para que pueda hacerlo, si decide rediseñar el código para que el búfer esté protegido.
  5. No, esas advertencias no representan problemas, solo le indican información. No los use regularmente.

Otros consejos

De hecho, no debería importarle la advertencia para las compilaciones normales. Realmente es más un mensaje informativo. Espero que sea obvio que tiene una preocupación de seguridad inherente con los búferes de tamaño variable en la pila; obtienes el cálculo de tamaño incorrecto y estás abriendo un gran agujero.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top