needhelp
← Back to blog

ssh-keysign-pwn: Membaca File Milik Root melalui Bug Logika ptrace

by xingwangzhe
Linux
Kernel
Security
Qualys
ptrace
CVE

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-31e62c2ebbfd terkena.


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:

  1. Sebuah proses memanggil do_exit() untuk berhenti
  2. do_exit() menjalankan exit_mm() terlebih dahulu — ini menghancurkan deskriptor memori (mm)
  3. Lalu menjalankan exit_files() — tapi file descriptor masih hidup pada titik ini
  4. Dengan task->mm == NULL tapi 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

Terminal window
# Periksa apakah kernel Anda memiliki perbaikan
uname -r
# Kernel yang diperbaiki memiliki commit 31e62c2ebbfd
# Semua kernel sebelum 14 Mei 2026 rentan

Apa yang Menarik dari Ini

Tiga hal menonjol:

  1. 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.

  2. 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.

  3. Targetnya kuno. Pola fd-leaving ssh-keysign berasal dari 2002. Urutan spw_open + setreuid chage juga 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

Share this page