La bandera GCC -fstack-protector flag permite el uso de canarios de pila para la protección de desbordamiento de pila. El uso de esta bandera por defecto ha sido más destacado en los últimos años.
Si un paquete se compila con -fstack-protector, y desbordamos un búfer en el programa, es probable que recibamos un error como:
*** buffer overflow detected ***: /xxx/xxx terminated
Sin embargo, ¿"quién" está a cargo de estos mensajes de error? ¿Dónde se registran estos mensajes? ¿El demonio syslog selecciona estos mensajes?
libssp
enviará su mensaje por la salida stderr utilizada por nginx. Entonces,libssp
podría intentar salir del proceso (o proceso hijo para nginx). Si "no necesita" bloquear la aplicación, los registradores de salida anormales no lo detectarán. ¿Es esta una interpretación correcta?__builtin_trap()
primero, y luego, si esto falla, tratando de provocar una violación de segmento, y sólo si eso no funciona, salir con el estado 127.abort()
).Las distribuciones modernas de Linux como CentOS / Fedora configuran un daemon de manejo de fallas (por ejemplo,
systemd-coredump
orabortd
), de manera predeterminada.Por lo tanto, cuando su programa finaliza de manera anormal (por defecto, excepción no detectada, aborto, instrucción ilegal, etc.), este evento es registrado y registrado por ese demonio. Por lo tanto, encontrará algunos mensajes en el diario del sistema y posiblemente una referencia a un directorio con algunos detalles adicionales (por ejemplo, archivo central, registros, etc.).
Ejemplo
Compilar:
Ejecutar:
El estado de salida es 134, que es 128 + 6, es decir, 128 más el número de señal de cancelación.
El diario del sistema:
Eso significa que obtiene el registro del
auditd
demonio de auditoría y elsystemd-coredump
controlador de fallas.Para verificar si un demonio de manejo de fallas está configurado, puede verificar
/proc
, por ejemplo:(todo probado en Fedora 26, x86-64)
fuente
abort()
que produce una señal de aborto, es decir, no hay una falla de segmentación. Es solo que los manejadores de señal predeterminados para la falla de aborto / segmentación, etc. producen la misma acción: escribir núcleo y salir del proceso con un estado de salida de cero desigual que también codifica el número de señal. El núcleo realiza la escritura y su comportamiento es configurable a través de/proc/.../core_pattern
. En el ejemplo anterior, se configura un asistente de espacio de usuario y, por lo tanto, se lo llama. El núcleo también desencadena la auditoría.abort()
, el código SSP usa__builtin_trap()
(pero el efecto es el mismo).abort()
se llama.__builtin_trap()
para evitar tener una dependencia explícitaabort()
). Otras distribuciones tienen diferentes trazas de pila.