Bendera GCC -fstack-protector flag memungkinkan penggunaan stack canaries untuk perlindungan stack overflow. Penggunaan bendera ini secara default lebih menonjol dalam beberapa tahun terakhir.
Jika sebuah paket dikompilasi dengan -fstack-protector, dan kami meluap buffer dalam program, kami kemungkinan akan mendapatkan kesalahan seperti:
*** buffer overflow detected ***: /xxx/xxx terminated
Namun, "siapa" yang bertanggung jawab atas pesan kesalahan ini? Di mana pesan-pesan ini dicatat? Apakah daemon syslog memilih pesan-pesan ini?
libssp
akan menampilkan pesannya dengan output stderr yang digunakan oleh nginx. Kemudian,libssp
mungkin mencoba untuk keluar dari proses (atau proses anak untuk nginx). Jika itu "tidak perlu" crash aplikasi, maka keluar logger abnormal tidak akan mengambil ini. Apakah ini interpretasi yang benar?__builtin_trap()
pertama, maka jika itu gagal, mencoba untuk memprovokasi pelanggaran segmen, dan hanya jika itu gagal, keluar dengan status 127.abort()
.).Distribusi Linux modern seperti CentOS / Fedora mengatur daemon penanganan gangguan (misalnya
systemd-coredump
atauabortd
), secara default.Dengan demikian, ketika program Anda berakhir dengan cara yang tidak normal (segfault, pengecualian tanpa tertangkap, dibatalkan, instruksi ilegal dll.) Acara ini terdaftar dan dicatat oleh daemon itu. Dengan demikian, Anda menemukan beberapa pesan dalam jurnal sistem dan mungkin referensi ke direktori dengan beberapa detail tambahan (misalnya file inti, log, dll.).
Contoh
Menyusun:
Menjalankan:
Status keluar adalah 134 yaitu 128 + 6, yaitu 128 ditambah nomor sinyal batalkan.
Jurnal sistem:
Itu berarti Anda mendapatkan log dari
auditd
daemon audit dan parasystemd-coredump
handler kecelakaan.Untuk memverifikasi apakah daemon penanganan gangguan dikonfigurasi, Anda dapat memeriksa
/proc
, misalnya:(semuanya diuji pada Fedora 26, x86-64)
sumber
abort()
yang menghasilkan sinyal batalkan, yaitu tidak ada kesalahan segmentasi yang terjadi. Hanya saja penangan sinyal default untuk batalkan / segmentasi kesalahan dll menghasilkan tindakan yang sama: menulis inti dan keluar dari proses dengan status keluar nol tidak sama yang juga menyandikan nomor sinyal. Penulisan inti dilakukan oleh kernel dan perilakunya dapat dikonfigurasi melalui/proc/.../core_pattern
. Dalam contoh di atas bantuan ruang pengguna dikonfigurasi dan dengan demikian disebut. Kernel juga memicu audit.abort()
, menggunakan kode SSP__builtin_trap()
(tetapi efeknya sama).abort()
namanya.__builtin_trap()
untuk menghindari ketergantungan secara eksplisit padaabort()
). Distribusi lain memiliki jejak tumpukan yang berbeda.