ช่องโหว่ในการสร้างลายเซ็นด้วยกุญแจส่วนตัว ECDSA บนเส้นโค้ง NIST P521 ของเครื่องมือ PuTTY
- PuTTY ทุกเวอร์ชันตั้งแต่ 0.68 ถึง 0.80 มีช่องโหว่ร้ายแรงในโค้ดที่สร้างลายเซ็นจากกุญแจส่วนตัว ECDSA ที่ใช้เส้นโค้ง NIST P521
- เกิดขึ้นเมื่อ PuTTY หรือ Pageant สร้างลายเซ็นจากกุญแจเพื่อยืนยันตัวตนกับเซิร์ฟเวอร์ SSH
- ช่องโหว่นี้ได้รับรหัส CVE-2024-31497
- ค้นพบโดย Fabian Bäumer และ Marcus Brinkmann จาก Ruhr University Bochum
ผลกระทบของช่องโหว่
- ผลกระทบของช่องโหว่นี้คือกุญแจส่วนตัวอาจรั่วไหล
- หากผู้โจมตีมีข้อความที่ถูกลงลายเซ็นแล้วหลายสิบข้อความและกุญแจสาธารณะ ก็จะมีข้อมูลเพียงพอสำหรับกู้คืนกุญแจส่วนตัวได้
- จากนั้นสามารถปลอมลายเซ็นราวกับเป็นผู้ใช้คนนั้น และเข้าสู่ระบบเซิร์ฟเวอร์ทุกเครื่องที่ใช้กุญแจดังกล่าวได้
- เพื่อให้ได้ลายเซ็นเหล่านี้ ผู้โจมตีเพียงแค่ต้องเจาะระบบเซิร์ฟเวอร์ที่ใช้กุญแจนี้ในการยืนยันตัวตนชั่วคราว หรือเข้าถึงสำเนา Pageant ที่เก็บกุญแจไว้ได้ชั่วคราวเท่านั้น
- อย่างไรก็ตาม ลายเซ็นเหล่านี้จะไม่ถูกเปิดเผยต่อผู้ดักฟังการเชื่อมต่อ SSH แบบ passive
- หากมีกุญแจประเภทนี้ แนะนำให้ยกเลิกการใช้งานทันที
- ควรลบกุญแจสาธารณะเดิมออกจากไฟล์ OpenSSH
authorized_keys ทั้งหมด และไฟล์เดียวกันบนเซิร์ฟเวอร์ SSH อื่น ๆ เพื่อให้ลายเซ็นของกุญแจที่รั่วไหลไม่มีค่าอีกต่อไป
- จากนั้นสร้างคู่กุญแจใหม่มาใช้แทน
ประเภทกุญแจที่ได้รับผลกระทบ
- ประเภทกุญแจเพียงชนิดเดียวที่ได้รับผลกระทบคือ ECDSA 521 บิต
- คือกุญแจที่ใน PuTTYgen บน Windows แสดง
ecdsa-sha2-nistp521 ตอนต้นของช่อง 'Key fingerprint', หรือเมื่อโหลดเข้า Pageant บน Windows แล้วมีคำอธิบายเป็น 'NIST p521', หรือเป็นกุญแจที่มี ID ขึ้นต้นด้วย ecdsa-sha2-nistp521 ในโปรโตคอล SSH หรือไฟล์กุญแจ
- ECDSA ขนาดอื่นและอัลกอริทึมกุญแจแบบอื่นไม่ได้รับผลกระทบ
- โดยเฉพาะ Ed25519 ไม่ได้รับผลกระทบ
รายละเอียดของข้อผิดพลาด
- ระบบลายเซ็นแบบ DSA ทั้งหมดต้องสร้างค่าสุ่มระหว่างการลงลายเซ็น
- ค่านี้เรียกว่า
nonce (คำศัพท์ทางคริปโตกราฟีที่หมายถึงค่าที่ใช้เพียงครั้งเดียว) หรือรู้จักกันในชื่ออักษร k
- เป็นที่ทราบกันดีว่าหากผู้โจมตีเดาค่า k ที่ใช้ได้ หรือพบลายเซ็น 2 ชุดที่สร้างด้วยค่า k เดียวกัน ก็จะกู้คืนกุญแจส่วนตัวได้ทันที
- ดังนั้น การสร้างลายเซ็น DSA บนระบบที่ไม่มีแหล่งสุ่มคุณภาพสูงจึงมีความเสี่ยง
- เนื่องจาก PuTTY ถูกพัฒนาบน Windows จึงเดิมทีไม่มีตัวสร้างเลขสุ่มเชิงคริปโตเลย
- ดังนั้น PuTTY จึงใช้วิธีแบบกำหนดแน่นอนในการสร้างค่า k โดยไม่ใช้เลขสุ่มเลย
- เทคนิคหลักคือการคำนวณ secure hash ที่รวมทั้งข้อความที่จะลงลายเซ็นและกุญแจส่วนตัวไว้ในอินพุตของแฮช
- ปัจจุบันเทคนิคนี้เป็นแนวทางกระแสหลัก และ RFC 6979 ก็อธิบายวิธีที่ชัดเจนและเป็นที่รู้จักสำหรับทำสิ่งนี้
- แต่ PuTTY ใช้วิธีลักษณะเดียวกันมาตั้งแต่ปี 2001 และ RFC ดังกล่าวเพิ่งเผยแพร่ในปี 2013 จึงไม่ได้ทำตามสเปกนั้น
สาเหตุที่ทำให้เกิดช่องโหว่
- เทคนิคของ PuTTY ทำงานโดยสร้างแฮช SHA-512 แล้วลดค่าแบบ modulo ด้วย q ซึ่งเป็นลำดับกลุ่มที่ใช้ในระบบ DSA
- ในทุกกรณียกเว้น P521 อคติที่เกิดจากการลดเลข 512 บิตด้วย q นั้นเล็กมากจนละเลยได้
- แต่ในกรณีของ P521 นั้น q มีขนาด 521 บิต (กล่าวคือมากกว่า 512 บิต) ดังนั้นการลดเลข 512 บิตด้วย q จึงไม่เกิดผลใด ๆ
- ทำให้ได้ค่า k ที่บิตบนสุด 9 บิตเป็น 0 เสมอ
- อคตินี้เองที่ทำให้เกิดการโจมตีกู้คืนกุญแจได้
การแก้ไขช่องโหว่
- เพื่อแก้ปัญหานี้ PuTTY ได้ยกเลิกระบบสร้างค่า k แบบเดิมทั้งหมดสำหรับกุญแจ DSA และ ECDSA ทุกประเภท และเปลี่ยนไปใช้เทคนิค RFC 6979
- กุญแจ EdDSA เช่น Ed25519 ใช้ระบบอื่นอยู่แล้ว จึงไม่มีการเปลี่ยนแปลง
- อย่างไรก็ตาม เรื่องนี้ไม่ได้เปลี่ยนข้อเท็จจริงที่ว่าข้อมูลของกุญแจส่วนตัว P521 เดิมได้รั่วไหลไปแล้วทุกครั้งที่มีการสร้างลายเซ็นด้วยตัวสร้าง k แบบเก่า
ความเห็นของ GN⁺
- แม้จะเป็นช่องโหว่ที่เพิ่งถูกค้นพบไม่นาน แต่ดูเหมือนสาเหตุจะมาจากปัญหาในวิธีการที่ใช้งานมาตั้งแต่ปี 2001 ถือเป็นกรณีตัวอย่างที่แสดงให้เห็นถึงความเสี่ยงของการทำ implementation แบบ custom ที่ไม่ได้ยึดตามมาตรฐานตั้งแต่ต้น
- ช่องโหว่นี้กระทบเฉพาะกุญแจบางประเภท แต่หากเคยใช้กุญแจชนิดนี้มาก่อนก็อาจเป็นปัญหาร้ายแรงได้ จึงสำคัญมากที่จะต้องยกเลิกกุญแจที่ได้รับผลกระทบทันที
- สำหรับส่วนที่เกี่ยวข้องกับคริปโตในโครงการโอเพนซอร์ส ดูเหมือนว่าควรยึดตามมาตรฐานและผ่านการตรวจสอบจากภายนอกด้วย โดยเฉพาะส่วนการสร้างเลขสุ่มซึ่งมีความสำคัญมาก จึงน่าจะปลอดภัยกว่าหากพึ่งพาระบบปฏิบัติการหรือไลบรารีที่ผ่านการตรวจสอบแล้ว
- PuTTY เป็นโอเพนซอร์สเทอร์มินัลอีมูเลเตอร์ที่ใช้งานอย่างแพร่หลาย รองรับโปรโตคอล SSH, Telnet และ Rlogin และใช้งานได้สะดวกด้วยฟังก์ชันบันทึกข้อมูลการเชื่อมต่อ จึงดูจำเป็นที่จะต้องตอบสนองต่อแพตช์ช่องโหว่ในอนาคตอย่างจริงจัง
- บน macOS หรือ Linux เทอร์มินัลทางเลือกแทน PuTTY อาจเป็นแอป Terminal ที่มีมาให้หรือ iTerm2 ส่วนบน Windows อาจพิจารณา Windows Terminal, PowerShell หรือ Cmder เป็นทางเลือกได้
4 ความคิดเห็น
อา..
ผมคิดว่าไม่น่าเคยใช้คีย์ประเภทนี้มาก่อน แต่ก็อัปเดตไว้ก่อนแล้วครับ
เห็นอันนี้แล้วก็อัปเดตเป็น 0.81 ทันทีเลย 555
ความคิดเห็นจาก Hacker News
ต่อไปนี้คือสรุปความคิดเห็นจากคอมเมนต์ใน Hacker News: