ssh-keysign-pwn: Membaca File Milik Root melalui Bug Logika ptrace
ssh-keysign-pwn: Bug logika berusia enam tahun di fungsi
__ptrace_may_access()kernel, dilaporkan oleh Qualys dan ditambal oleh Linus Torvalds pada 14 Mei 2026. Pengguna tidak terprivilege bisa membaca file milik root termasuk kunci privat SSH host dan/etc/shadow. Semua kernel pra-31e62c2ebbfdterkena.
Satu Lagi
Mei 2026 tidak ramah pada kernel Linux. Dirty Frag, Fragnesia, dan sekarang—ssh-keysign-pwn—diungkapkan oleh Qualys pada 14 Mei dan diperbaiki oleh Linus Torvalds di hari yang sama.
Yang ini berbeda dari keluarga “salin sesuatu ke page cache.” Ini bug logika murni di __ptrace_may_access(), fungsi kernel yang memutuskan apakah satu proses bisa memeriksa proses lain.
| Metrik | Nilai |
|---|---|
| Dilaporkan oleh | Qualys Security Advisory |
| Diperbaiki oleh | Linus Torvalds |
| Commit perbaikan | 31e62c2ebbfd |
| Bersembunyi selama | ~6 tahun |
| Pertama ditandai oleh | Jann Horn (Google), Oktober 2020 |
| PoC dipublikasikan oleh | _SiCk |
| Dampak | Baca file milik root sebagai pengguna tidak terprivilege |
| Kompleksitas exploit | 100–2000 spawns per pencurian berhasil |
Cara Kerja
Bug ada di __ptrace_may_access(). Fungsi ini adalah penjaga gerbang untuk introspeksi proses — ia memeriksa apakah suatu proses diizinkan mengutak-atik state proses lain.
Ada kasus khusus: ketika task->mm == NULL (proses target tidak memiliki deskriptor memori — terjadi ketika thread sedang keluar, atau untuk thread kernel), fungsi melewatkan pemeriksaan dumpable sepenuhnya.
Ini jalur kode yang membuatnya bisa dieksploitasi:
- Sebuah proses memanggil
do_exit()untuk berhenti do_exit()menjalankanexit_mm()terlebih dahulu — ini menghancurkan deskriptor memori (mm)- Lalu menjalankan
exit_files()— tapi file descriptor masih hidup pada titik ini - Dengan
task->mm == NULLtapi file descriptor masih terbuka,pidfd_getfd(2)bisa mencuri fd tersebut jika pemanggil memiliki uid yang cocok
Normalnya, pemeriksaan akses ptrace akan memblokir proses yang kurang terprivilege untuk menjangkau file handle terbuka proses root. Tapi bypass mm == NULL melumpuhkan pemeriksaan dumpable, dan pidfd_getfd(2) melakukan sisanya.
Ini adalah race TOCTOU textbook, tapi jendelanya cukup lebar sehingga PoC berhasil dalam 100–2000 percobaan.
Target Exploit
Dua alat dipublikasikan:
sshkeysign_pwn — menargetkan ssh-keysign, binary pembantu yang menandatangani tantangan autentikasi host. Binary ini membuka file kunci host SSH (/etc/ssh/ssh_host_{ecdsa,ed25519,rsa}_key, mode 0600) sebelum memanggil permanently_set_uid() untuk menurunkan privilege. Lalu ia memeriksa apakah EnableSSHKeysign diatur di sshd_config — jika tidak, ia keluar dengan kunci fd masih terbuka. Desain ini telah ada di OpenSSH sejak 2002.
chage_pwn — menargetkan chage -l <user>. Binary membuka /etc/shadow via spw_open(O_RDONLY), lalu memanggil setreuid(ruid, ruid) — menurunkan semua privilege karena kedua argumen adalah uid nyata. Di jendela race antara penurunan privilege dan penutupan file, fd bisa dicuri.
Timeline
| Tanggal | Kejadian |
|---|---|
| ~2020 | Jann Horn mengidentifikasi pola pencurian FD dan mengusulkan patch (tidak digabung) |
| 2026-05-14 | Qualys melaporkan kerentanan; Linus Torvalds melakukan commit perbaikan (31e62c2ebbfd) |
| 2026-05-14 | Brad Spengler (@spendergrsec) mempublikasikan analisis |
| 2026-05-14 | _SiCk mempublikasikan PoC exploit di GitHub |
| 2026-05-15 | Qualys mengirim pengungkapan ke oss-security |
Celah dari usulan patch Jann Horn 2020 ke laporan Qualys 2026 patut dicatat. Perbaikan telah dirancang lima tahun lalu tapi tidak pernah masuk upstream.
Perbaikannya
Linus melakukan commit perbaikan sebagai commit 31e62c2ebbfd. Pesan commit-nya mencatat:
“kita punya satu kasus khusus yang aneh: ptrace_may_access() menggunakan ‘dumpable’ untuk memeriksa berbagai hal lain yang sepenuhnya independen dari MM (biasanya secara eksplisit menggunakan flag seperti
PTRACE_MODE_READ_FSCREDS), termasuk untuk thread yang tidak lagi memiliki VM (dan mungkin tidak pernah punya, seperti kebanyakan thread kernel). Ini bukan tujuan flag ini dirancang, tapi begitulah adanya.”
Patch menyesuaikan perilaku ptrace untuk menangani kasus mm == NULL dengan benar. Ini secara efektif menutup jendela bypass.
Periksa Kernel Anda
# Periksa apakah kernel Anda memiliki perbaikanuname -r# Kernel yang diperbaiki memiliki commit 31e62c2ebbfd# Semua kernel sebelum 14 Mei 2026 rentanApa yang Menarik dari Ini
Tiga hal menonjol:
-
Diperbaiki di hari yang sama dengan laporan. Linus menyelesaikan ini dalam hitungan jam. Itu sangat cepat untuk perbaikan kernel, menandakan bahwa patchnya langsung setelah bug dipahami.
-
Jann Horn menemukan ini tahun 2020. Komunitas punya usulan patch yang duduk di arsip milis selama lima tahun. Bentuk pencurian FD sudah diketahui, tapi tidak ada yang mendorongnya.
-
Targetnya kuno. Pola fd-leaving
ssh-keysignberasal dari 2002. Urutanspw_open+setreuidchagejuga sudah lama. Ini bukan bug di SSH atau shadow-utils — ini bug kernel yang mempersenjatai pola penanganan fd yang sudah ada di binary terprivilege.
Ini juga kerentanan kernel Linux besar ketiga di Mei 2026, setelah Copy Fail dan Dirty Frag. Laju pengungkapan semakin cepat — sebagian karena alat auditing berbantuan AI menemukan bug lama lebih cepat, dan sebagian karena ekosistem pengungkapan terfragmentasi (embargo dilanggar, PoC dirilis sebelum patch).
Referensi
- Commit perbaikan kernel: 31e62c2ebbfd
- Laporan Phoronix: Linux’s Latest Vulnerability Allows Reading Root-Owned Files By Unprivileged Users
- GitHub PoC: 0xdeadbeefnetwork/ssh-keysign-pwn
- 9to5Linux: Six-Year-Old Linux Kernel Flaw Lets Unprivileged Users Read Root-Owned Files
- Posting Qualys oss-security: Logic bug in __ptrace_may_access()
- Patch Jann Horn 2020: lore.kernel.org