Das Flag GCC -fstack-protector ermöglicht die Verwendung von Stapelkanarien für den Stapelüberlaufschutz. Die standardmäßige Verwendung dieser Flagge war in den letzten Jahren stärker ausgeprägt.
Wenn ein Paket mit -fstack-protector kompiliert wird und ein Puffer im Programm überläuft, wird wahrscheinlich ein Fehler angezeigt, wie z.
*** buffer overflow detected ***: /xxx/xxx terminated
"Wer" ist jedoch für diese Fehlermeldungen verantwortlich? Wo werden diese Nachrichten protokolliert? Wählt der Syslog-Daemon diese Nachrichten aus?
libssp
gibt es seine Nachricht über die von nginx verwendete stderr-Ausgabe aus.libssp
Versuchen Sie dann möglicherweise, den Prozess (oder den untergeordneten Prozess für Nginx) zu beenden. Wenn die Anwendung nicht zum Absturz gebracht werden muss, werden abnormale Exit-Logger dies nicht erkennen. Ist dies eine korrekte Interpretation?__builtin_trap()
ersten Mal zum Absturz zu bringen. Wenn dies fehlschlägt, wird versucht, eine Segmentverletzung zu provozieren, und nur wenn dies fehlschlägt, wird der Status 127 beendet.abort()
. B. ).Moderne Linux-Distributionen wie CentOS / Fedora richten standardmäßig einen Daemon für die Absturzbehandlung (z. B.
systemd-coredump
oderabortd
) ein.Wenn Ihr Programm auf ungewöhnliche Weise beendet wird (Segfault, nicht erfasste Ausnahme, Abbruch, unzulässige Anweisung usw.), wird dieses Ereignis von diesem Daemon registriert und protokolliert. So finden Sie im Systemjournal einige Meldungen und möglicherweise einen Verweis auf ein Verzeichnis mit einigen zusätzlichen Details (z. B. Kerndatei, Protokolle usw.).
Beispiel
Kompilieren:
Ausführen:
Der Ausgangsstatus ist 134, was 128 + 6 ist, dh 128 plus der Abbruch-Signalnummer.
Das Systemjournal:
Das bedeutet, dass Sie die Protokollierung vom
auditd
Überwachungsdämon und vomsystemd-coredump
Crash-Handler erhalten.Um zu überprüfen, ob ein Daemon für die Absturzbehandlung konfiguriert ist, können Sie Folgendes überprüfen
/proc
: z.(alles getestet auf Fedora 26, x86-64)
quelle
abort()
die ein Abbruchsignal ergeben, dh es liegt kein Segmentierungsfehler vor. Es ist nur so, dass die Standard-Signalhandler für Abbruch- / Segmentierungsfehler usw. dieselbe Aktion ausführen: Schreiben Sie den Kern und beenden Sie den Prozess mit einem Exit-Status ungleich Null, der auch die Signalnummer codiert. Das Kernschreiben wird vom Kernel ausgeführt und sein Verhalten kann über konfiguriert werden/proc/.../core_pattern
. Im obigen Beispiel wird ein User-Space-Helfer konfiguriert und somit aufgerufen. Der Kernel löst auch die Überwachung aus.abort()
, der SSP-Code verwendet__builtin_trap()
(aber der Effekt ist der gleiche).abort()
es heißt.__builtin_trap()
, um eine explizite Abhängigkeit von zu vermeidenabort()
). Andere Distributionen haben andere Stapelspuren.