ssh-keysign-pwn - PoC ของช่องโหว่ 0-day บน Linux ที่ทำให้ผู้ใช้ไม่มีสิทธิ์อ่านไฟล์ที่ root เป็นเจ้าของได้
(github.com/0xdeadbeefnetwork)- ssh-keysign-pwn เป็น PoC ของช่องโหว่บน Linux ที่ทำให้ผู้ใช้ไม่มีสิทธิ์สามารถอ่านไฟล์ที่ root เป็นเจ้าของได้ โดยระบุว่าเคอร์เนลก่อน
31e62c2ebbfdได้รับผลกระทบ - บั๊กหลักคือ
__ptrace_may_access()จะข้ามการตรวจสอบ dumpable เมื่อtask->mm == NULLและdo_exit()เรียกexit_mm()ก่อนexit_files()ทำให้เกิดช่วงเวลาที่ file descriptor ยังเปิดค้างอยู่ - ในช่วงเวลานี้ หาก uid ของผู้เรียกตรงกับโปรเซสเป้าหมาย
pidfd_getfd(2)จะสำเร็จ ทำให้สามารถดึง file descriptor ที่เปิดอยู่ของโปรเซสที่กำลังปิดตัวลงมาได้ sshkeysign_pwnดึง/etc/ssh/ssh_host_{ecdsa,ed25519,rsa}_keyโดยอาศัยลำดับการทำงานที่ssh-keysign.cเปิดคีย์ที่มีสิทธิ์ 0600 แล้วจบการทำงานด้วยEnableSSHKeysign=noก่อนpermanently_set_uid()ส่งผลให้ fd ที่เปิดอยู่ยังค้างไว้chage_pwnดึง/etc/shadowโดยอาศัย race ตอนจบการทำงานในลำดับที่chage -l <user>เรียกspw_open(O_RDONLY)แล้วลดสิทธิ์ลงทั้งหมดด้วยsetreuid(ruid, ruid)- วิธีรันคือ
makeจากนั้นใช้./sshkeysign_pwnเพื่อดึง host key และใช้./chage_pwn rootเพื่อพิมพ์เนื้อหา/etc/shadowออกทาง standard output โดยระบุว่ามักสำเร็จภายใน 100~2000 ครั้งของการสปอน - สภาพแวดล้อมที่ยืนยันแล้วคือ Raspberry Pi OS Bookworm 6.12.75, Debian 13, Ubuntu 22.04 / 24.04 / 26.04, Arch และ CentOS 9
- สำหรับ PoC เป้าหมายแบบควบคุมได้
vuln_target.cจะเปิด/etc/shadowแล้วลดสิทธิ์ลง ส่วนexploit_vuln_target.cแสดงให้เห็นทั้งEPERMระหว่างโปรเซสยังมีชีวิตอยู่ และการขโมย fd หลังSIGKILL - ระบุว่า Qualys เป็นผู้รายงานช่องโหว่, Linus แก้ไขเมื่อ 2026-05-14 และ Jann Horn เคยชี้ประเด็นรูปแบบการ ขโมย FD ไว้ตั้งแต่เดือนตุลาคม 2020
- README ระบุรายการ NVD ที่
https://nvd.nist.gov/vuln/detail/CVE-2026-46333
1 ความคิดเห็น
ความคิดเห็นจาก Lobste.rs
แค่ ปิด ptrace อย่างเดียวไม่เพียงพอ แม้จะเข้าใจผิดได้ง่ายจากข้อความคอมมิตและชื่อฟังก์ชัน แต่
ptrace_may_accessถูกเรียกใช้จากหลายเส้นทาง และ PoC นี้ก็ไม่ได้ใช้ ptrace จริง ๆดูเหมือนจะไม่มีมาตรการบรรเทาที่ดีนัก ตอนนี้จึงน่าจะมีแค่ 1) เอาบิต execute ออกจาก
/usr/lib64/misc/ssh-keysignทั้งหมดเพื่อรับมือแบบเฉพาะกับ PoC นี้อย่างอ่อน ๆ หรือ 2) ใช้ eBPF หรือ systemtap อะไรทำนองนั้นเพื่อ บล็อกpidfd_getfdอย่างแรกนี่คงพิจารณาเฉพาะตอนที่ยังแพตช์เคอร์เนลหรือปิดเครื่องไม่ได้และต้องไปนอนเดี๋ยวนั้นยังไม่ได้ตรวจ PoC และก็เหมือนทุกครั้ง ควรระวังเสมอเมื่อรัน PoC สุ่มที่โหลดมาจากอินเทอร์เน็ต
คำแนะนำของ Qualys ยังไม่ถูกเผยแพร่ และก่อนหน้านี้ก็เคยบอกว่าจะยุติการเผยแพร่ผ่าน linux-distros ด้วยความไม่เต็มใจอย่างยิ่งเพราะนโยบายความปลอดภัยของ Linux kernel เมื่อ LLM สามารถสร้าง PoC ได้อย่างรวดเร็วจากคอมมิตแก้ไขที่ดูน่าสงสัย สถานการณ์ก็รุนแรงขึ้น และถ้าเป็นเมื่อก่อนคงยังรอได้อีกไม่กี่วัน
Qualys เป็นทีมที่ยอดเยี่ยมจริง ๆ แต่ก็น่าเสียดายที่ครั้งนี้พวกเขาไม่ได้มีจังหวะเหมาะ ๆ ในการประกาศเรื่องนี้ด้วยตัวเอง พอเผยแพร่ออกมาเมื่อไร ก็คงเป็นคำแนะนำที่ยอดเยี่ยมแน่นอน
openssh เป็นเพียงเป้าหมายที่สะดวกสำหรับการโจมตีนี้ ไม่ได้เป็นฝ่ายผิด และไบนารี setuid ตัวอื่นก็น่าจะถูกเลือกเป็นเป้าหมายได้เช่นกัน
/proc/sys/kernel/yama/ptrace_scopeเป็น 2 (admin-only attach) หรือ 3 (no attach) จะป้องกัน exploit ที่รู้จักทั้งหมดได้ แต่ในทางทฤษฎีก็อาจยังมีวิธีโจมตีแบบอื่นได้pidfd_getfdและผลลัพธ์อยู่ที่นี่ ต้องรันด้วยstap -g block_pidfd_getfd.stpและเช่นเดียวกับทุกอย่างที่ได้มาจากอินเทอร์เน็ต ควรตรวจสคริปต์ก่อนรันเสมออยากให้เคอร์เนลเลิก เปิดเผย 0-day เอง ด้วยการคอมมิตแพตช์ลงเมนบรันช์แบบสาธารณะ คอมมิต ถึงกับเขียนว่า “Reported-by: Qualys” เลย จึงชัดเจนว่าเป็นการแก้ช่องโหว่ความปลอดภัย
Greg K-H เขียนว่าทีมความปลอดภัยของเคอร์เนลไม่สามารถเลือกได้ว่าจะเปิดเผยแพตช์ความปลอดภัยล่วงหน้าให้ใครบ้าง ดังนั้นผลลัพธ์คือไม่มีใครได้รับการเปิดเผยล่วงหน้าเลย
นี่ไม่ใช่ปัญหา ssh แต่เป็น ปัญหาของ Linux ชื่อก็ควรสื่อแบบนั้น
ssh-keysignตรวจEnableSSHKeysign=yesก่อนเปิด host key ส่วนตัว ระบบที่ปิดออปชันนี้ไว้ตามค่าเริ่มต้นก็คงไม่เสี่ยงต่อ การขโมย host key จุดที่น่าแปลกใจคือssh-keysignไม่ได้เช็กออปชันนี้เป็นอย่างแรกPoC สั้นจนน่าพอใจ และเครื่องของฉันก็มีช่องโหว่จริง
ดูเหมือนว่ามันทำให้เข้าถึง file descriptor ที่โปรแกรม setuid เปิดไว้ได้ในบางเงื่อนไข ฉันไม่เห็นเหตุผลว่าทำไมมันจะจำกัดแค่อ่านอย่างเดียว และน่าจะดัดเป็น local privilege escalation (LPE) ที่ไม่ต้องไปแคร็กแฮชได้
อย่างน้อย PoC นี้ทำให้ใช้ไม่ได้ด้วย
chmod -x /usr/lib/openssh/ssh-keysign /usr/bin/chageอาจต้องเปลี่ยนพาธของssh-keysignและดูman pageประกอบด้วย แต่ก็ไม่ได้แก้ปัญหาหลัก และน่าจะมีทางเลี่ยงได้ เท่าที่รู้ก็ยังไม่มีมาตรการบรรเทาอื่นปัญหานี้ถูกแก้ใน ptrace: slightly saner 'get_dumpable()' logic และนั่นเองที่ทำให้มันถูกเปิดเผยไปแล้ว เรื่องเพิ่งเกิดขึ้นเมื่อ 10 ชั่วโมงก่อนเท่านั้น
ยังมีประกาศเปิดเผยของ Qualys ที่ส่งไปยัง oss-security ด้วย โดยบอกว่ายังไม่เผยแพร่คำแนะนำอย่างเป็นทางการเพื่อให้ดิสโทรและผู้ใช้มีเวลาแพตช์ก่อน ดูน่าจะเป็นเนื้อหาที่น่าสนใจมาก และระหว่างนี้ให้อ่านคำอธิบายของ Brad Spengler จาก grsecurityไปก่อน ทวีตนี้ดูเหมือนจะเป็นตัวจุดชนวนให้เกิดการพัฒนา PoC ครั้งนี้
exploit_vuln_target/vuln_targetทำงานได้ดี ซึ่งไม่ค่อยดีเท่าไรในทางปฏิบัติดูเหมือนว่าจะกระทบระบบที่มีผู้ใช้ บัญชีไม่มีสิทธิพิเศษ อยู่แล้ว นั่นคือ ถ้าไม่มีล็อกอินที่ใช้งานได้จริง ก็คงยังไม่ใช่ว่าจะใช้สิ่งนี้ทำ remote code execution บนเซิร์ฟเวอร์ SSH ที่เปิดออกอินเทอร์เน็ตได้ตรง ๆ ใช่ไหม?