4 คะแนน โดย GN⁺ 2024-04-16 | 4 ความคิดเห็น | แชร์ทาง WhatsApp

ช่องโหว่ในการสร้างลายเซ็นด้วยกุญแจส่วนตัว 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 ความคิดเห็น

 
tominam2 2024-04-16

อา..

 
kuroneko 2024-04-16

ผมคิดว่าไม่น่าเคยใช้คีย์ประเภทนี้มาก่อน แต่ก็อัปเดตไว้ก่อนแล้วครับ

 
dlehals2 2024-04-16

เห็นอันนี้แล้วก็อัปเดตเป็น 0.81 ทันทีเลย 555

 
GN⁺ 2024-04-16
ความคิดเห็นจาก Hacker News

ต่อไปนี้คือสรุปความคิดเห็นจากคอมเมนต์ใน Hacker News:

  • พบช่องโหว่ในวิธีสร้างคีย์ ECDSA P-521 ที่ PuTTY ใช้งานอยู่ เมื่อใช้โมดูลัส 521 บิต ค่า k ก็ควรเป็นค่าสุ่ม 521 บิตด้วยเช่นกัน แต่ PuTTY ใช้ค่าสุ่มเพียง 512 บิต ทำให้ 9 บิตบนสุดถูกเติมเป็น 0 ซึ่งอาจนำไปสู่การรั่วไหลของกุญแจส่วนตัวได้ผ่านวิธีทางพีชคณิตเชิงเส้น
  • หลายคนชื่นชมท่าทีการเปิดเผยช่องโหว่ของ Simon Tatham นักพัฒนา PuTTY ว่าตรงไปตรงมาและชัดเจน ถ่ายทอดข้อเท็จจริงตามจริงโดยไม่แก้ตัวหรือพยายามลดทอนความรุนแรง
  • ยังขาดคำอธิบายเบื้องหลังว่าช่องโหว่นี้ถูกค้นพบได้อย่างไร
  • Windows รุ่นใหม่มี OpenSSH ติดตั้งมาให้เป็นค่าเริ่มต้นแล้ว จึงไม่จำเป็นต้องใช้ PuTTY อีกต่อไป แม้กระนั้นก็ยังมีคนจำนวนมากที่ใช้งานต่อเพราะความเคยชินหรือแรงเฉื่อยจากพฤติกรรมเดิม
  • คนที่เลือกใช้คีย์ชนิดนี้แทนที่จะใช้ค่าปริยาย น่าจะมีไม่มากนัก
  • หากกำลังใช้ P521 host key อาจจำเป็นต้องเปลี่ยนคีย์หลังจากอัปเกรดไคลเอนต์แล้ว
  • อาจคุ้มค่าที่จะพิจารณาย้ายไปใช้ EdDSA ซึ่งไม่ต้องพึ่ง RNG หรือการคำนวณ modular
  • เพิ่งมารู้ทีหลังว่าชื่อ PuTTY มาจาก putty ที่ใช้ยึดกระจกหน้าต่าง
  • มีคนไม่เข้าใจว่าทำไม PuTTY ถึงนำผลแฮช SHA-512 ไปทำ modular ด้วย q โดยมองว่าการตัดใช้เฉพาะจำนวนบิตที่ต้องการ หรือการแฮชข้อความกับกุญแจส่วนตัวแยกกันแล้วค่อยนำมารวมกัน น่าจะดีกว่า
  • มีคนสงสัยหลักการว่าทำไมการใช้ตัวเลขที่ 9 บิตบนสุดเป็น 0 แทนตัวเลขสุ่ม 521 บิต จึงทำให้กุญแจส่วนตัวรั่วได้หลังเซ็นชื่อ 60 ครั้ง