เจาะลึก ‘sshole’: เมื่อช่องโหว่เล็กๆ สองจุด รวมกันสร้างหายนะให้ OpenSSH บนระบบ Musl

เจาะลึก ‘sshole’: เมื่อช่องโหว่เล็กๆ สองจุด รวมกันสร้างหายนะให้ OpenSSH บนระบบ Musl

รู้ไหมว่าบางครั้งช่องโหว่ทางความปลอดภัยก็ไม่ได้มาในรูปแบบที่ซับซ้อน หรือต้องอาศัยโค้ดเจาะระบบที่ยาวเหยียดเสมอไป

บางครั้งมันเกิดจากความผิดพลาดเล็กๆ น้อยๆ ที่ดูไม่เกี่ยวกันเลย แต่พอมาเจอกันกลับกลายเป็นหายนะอย่างไม่น่าเชื่อ

วันนี้จะมาเล่าถึงเรื่องราวของ “sshole” (CVE-2026-123158) ช่องโหว่สุดอันตรายที่อาศัยเพียง “สตริงสองตัว” ที่ดูธรรมดาๆ จนสามารถเจาะ OpenSSH บนระบบที่ใช้ musl libc ให้รันโค้ดจากระยะไกลได้เลยทีเดียว

จุดกำเนิดของหายนะ: การทำงานของ SSH ที่ซับซ้อน

OpenSSH คือเครื่องมือสำคัญที่ใช้ในการเชื่อมต่อและจัดการเซิร์ฟเวอร์อย่างปลอดภัย มันทำงานโดยมีส่วนประกอบย่อยๆ มากมาย และหนึ่งในนั้นคือ ssh_keysign ซึ่งเป็นโปรแกรมที่ทำหน้าที่เซ็นชื่อให้กับคีย์ SSH

โดยปกติแล้ว ssh_keysign จะถูกเรียกใช้โดย ssh-agent เพื่อให้สิทธิ์ในการเข้าถึงแก่ผู้ใช้ โดยจะอ่านค่าจาก environment variables หรือตัวแปรสภาพแวดล้อมที่กำหนดไว้ ซึ่งปกติก็ไม่มีปัญหาอะไร

แต่ในโลกของคอมพิวเตอร์ ไม่มีอะไรที่สมบูรณ์แบบเสมอไป

เมื่อ %c ธรรมดา กลายเป็นระเบิดเวลา

ปัญหาที่แท้จริงกลับอยู่ที่ sftp-server ซึ่งเป็นโปรแกรมที่ใช้สำหรับถ่ายโอนไฟล์ผ่าน SSH มันมีฟังก์ชันที่ประมวลผลสตริงที่ส่งมาจากไคลเอนต์ และในบางกรณี มันจะใช้คำสั่ง printf เพื่อแสดงผลข้อมูลเหล่านั้น

สิ่งที่น่าตกใจคือ หากมีใครส่งสตริงที่มีอักขระพิเศษอย่าง %c เข้าไปใน printf ที่ทำงานบนระบบที่ใช้ musl libc (ไลบรารี C ที่เบาและมักใช้ในระบบปฏิบัติการขนาดเล็ก เช่น Alpine Linux) มันจะสามารถถูกตีความผิดไปจากที่ควรจะเป็นได้

นี่คือ ช่องโหว่ Format String นั่นเอง

printf ใน musl มีข้อผิดพลาดในการจัดการตัวแปรที่รับเข้ามา หากเจอ %c โดยไม่มีการระบุอาร์กิวเมนต์ที่สอดคล้องกัน มันจะพยายามอ่านค่าจาก Stack ในหน่วยความจำ ซึ่งเป็นพื้นที่เก็บข้อมูลชั่วคราวของการทำงานของโปรแกรม

กลไกการโจมตี: เปลี่ยนข้อมูลสู่การรันโค้ด

แล้วช่องโหว่ printf ธรรมดาๆ จะกลายเป็นหายนะได้อย่างไร?

เมื่อผู้โจมตีสร้าง environment variable ที่มีสตริง %c ผสมอยู่ และเรียกใช้ ssh_keysign ผ่าน ssh-agent หรือ sftp-server ตัว printf ที่มีช่องโหว่ใน musl ก็จะถูกเรียกใช้งาน

ผลลัพธ์คือ ผู้โจมตีสามารถ อ่าน หรือ เขียน ข้อมูลไปยังตำแหน่งหน่วยความจำที่ต้องการได้ตามอำเภอใจ

ลองนึกภาพว่าถ้าสามารถอ่านหรือเขียนค่าในหน่วยความจำของโปรแกรมที่รันอยู่ด้วยสิทธิ์ระดับสูงได้ จะเกิดอะไรขึ้น? แน่นอนว่ามันคือประตูสู่การ Remote Code Execution (RCE) หรือการรันโค้ดจากระยะไกลนั่นเอง

หมายความว่าผู้โจมตีสามารถสั่งให้เครื่องของเราทำอะไรก็ได้ ไม่ว่าจะขโมยข้อมูล ติดตั้งมัลแวร์ หรือแม้กระทั่งควบคุมระบบได้ทั้งหมด

ใครได้รับผลกระทบและความร้ายแรง

ช่องโหว่ “sshole” นี้ส่งผลกระทบโดยตรงต่อระบบที่ใช้ musl libc โดยเฉพาะอย่างยิ่ง Alpine Linux ซึ่งเป็นระบบปฏิบัติการยอดนิยมสำหรับ Docker Containers และสภาพแวดล้อมที่มีข้อจำกัดด้านทรัพยากร

ความร้ายแรงของมันอยู่ในระดับ วิกฤต เพราะมันเปิดโอกาสให้ผู้โจมตีที่มีสิทธิ์ผู้ใช้ปกติ (หรือแม้กระทั่งผู้ที่เชื่อมต่อ SSH ได้) สามารถยกระดับสิทธิ์เป็น root ได้

นั่นหมายถึงการควบคุมระบบทั้งหมดได้อย่างสมบูรณ์แบบ

การป้องกันและแก้ไข

สิ่งสำคัญที่สุดคือการ อัปเดต ซอฟต์แวร์ให้เป็นเวอร์ชันล่าสุดอยู่เสมอ

  • อัปเดต OpenSSH: ตรวจสอบและอัปเดต OpenSSH ให้เป็นเวอร์ชันที่แก้ไขช่องโหว่นี้แล้ว
  • อัปเดต musl libc: ผู้พัฒนา musl ได้ออกแพตช์แก้ไขปัญหา printf นี้แล้ว การอัปเดตไลบรารีจึงเป็นสิ่งจำเป็น
  • ตรวจสอบระบบ: หากใช้ระบบปฏิบัติการอย่าง Alpine Linux หรือมีการใช้งาน musl libc ควรตรวจสอบอย่างเร่งด่วน

แม้ช่องโหว่บางอย่างจะดูเล็กน้อย แต่เมื่อมารวมกันก็อาจสร้างความเสียหายใหญ่หลวงได้ การใส่ใจในรายละเอียดและการอัปเดตระบบอย่างสม่ำเสมอจึงเป็นหัวใจสำคัญของการรักษาความปลอดภัยในโลกดิจิทัล