พบช่องโหว่ใน Libsodium หลังใช้งานมา 13 ปี — แต่กระทบเฉพาะผู้ใช้ฟังก์ชันระดับล่าง

Libsodium ซึ่งเป็นไลบรารีเข้ารหัสยอดนิยมที่เน้นความง่ายและความปลอดภัย เพิ่งพบช่องโหว่สำคัญในฟังก์ชันตรวจสอบความถูกต้องของจุดบนเส้นโค้ง Edwards25519 โดยช่องโหว่นี้เกิดจากการลืมตรวจสอบเงื่อนไขหนึ่ง ทำให้จุดที่ไม่อยู่ใน main subgroup สามารถ “หลุดรอด” การตรวจสอบได้ แม้จะควรถูกปฏิเสธก็ตาม

ปัญหานี้เกิดขึ้นในฟังก์ชัน crypto_core_ed25519_is_valid_point() ซึ่งควรตรวจสอบว่าจุดที่รับเข้ามาอยู่ในกลุ่มหลัก (order L) หรือไม่ โดยปกติจะตรวจสอบว่าหลังคูณด้วย L แล้วต้องได้ identity point แต่โค้ดเดิมตรวจสอบเพียงว่า X = 0 แต่ลืมตรวจสอบว่า Y = Z ทำให้จุดบางประเภท เช่น Q + (0, -1) ผ่านการตรวจสอบได้แม้จะไม่ถูกต้อง

แม้ช่องโหว่นี้จะดูน่ากังวล แต่ผู้เขียนย้ำว่า ผู้ใช้ส่วนใหญ่ไม่ถูกกระทบ เพราะฟังก์ชันนี้เป็นฟังก์ชันระดับล่างที่ high‑level API เช่น crypto_sign_* ไม่ได้ใช้เลย อีกทั้ง public key ที่สร้างด้วยฟังก์ชันมาตรฐานของ Libsodium ก็ปลอดภัยอยู่แล้ว ปัญหานี้จะกระทบเฉพาะผู้ที่ใช้ฟังก์ชันดังกล่าวเพื่อตรวจสอบจุดจากแหล่งที่ไม่น่าเชื่อถือ หรือผู้ที่สร้างโปรโตคอลเข้ารหัสเองโดยตรง

การแก้ไขถูกปล่อยทันทีหลังพบปัญหา โดยเพิ่มการตรวจสอบ Y = Z เข้าไป และแพ็กเกจทั้งหมดที่ออกหลังวันที่ 30 ธันวาคม 2025 ได้รวมแพตช์นี้แล้ว ผู้เขียนยังแนะนำให้ผู้ที่ต้องการความปลอดภัยสูงใช้ Ristretto255 แทน Edwards25519 เพราะปลอดภัยกว่าในเรื่อง cofactor และไม่ต้องตรวจสอบ subgroup เพิ่มเติมเลย

ช่องโหว่เกิดจากอะไร?
ฟังก์ชัน crypto_core_ed25519_is_valid_point() ลืมตรวจสอบเงื่อนไข Y = Z
ทำให้จุดบางประเภทที่ไม่อยู่ใน main subgroup ผ่านการตรวจสอบได้
เกิดจากการลืมพอร์ตโค้ดจาก Zig มายัง Libsodium

ใครได้รับผลกระทบ?
ผู้ใช้ Libsodium เวอร์ชัน ≤ 1.0.20
ผู้ที่ใช้ฟังก์ชันตรวจสอบจุดระดับล่างกับข้อมูลจาก untrusted sources
ผู้ที่สร้างโปรโตคอลเข้ารหัสเองบน Edwards25519

ใคร “ไม่” ได้รับผลกระทบ?
ผู้ใช้ high‑level API เช่น crypto_sign_*
ผู้ใช้ public key ที่สร้างด้วยฟังก์ชันมาตรฐานของ Libsodium
ผู้ใช้ Ristretto255 ซึ่งปลอดภัยกว่าโดยออกแบบ

การแก้ไขและคำแนะนำ
แพตช์ถูกปล่อยแล้วในแพ็กเกจหลัง 30 ธ.ค. 2025
เพิ่มการตรวจสอบ Y = Z เพื่อปิดช่องโหว่
แนะนำให้ใช้ Ristretto255 สำหรับโปรโตคอลใหม่

https://00f.net/2025/12/30/libsodium-vulnerability/
🔐 พบช่องโหว่ใน Libsodium หลังใช้งานมา 13 ปี — แต่กระทบเฉพาะผู้ใช้ฟังก์ชันระดับล่าง Libsodium ซึ่งเป็นไลบรารีเข้ารหัสยอดนิยมที่เน้นความง่ายและความปลอดภัย เพิ่งพบช่องโหว่สำคัญในฟังก์ชันตรวจสอบความถูกต้องของจุดบนเส้นโค้ง Edwards25519 โดยช่องโหว่นี้เกิดจากการลืมตรวจสอบเงื่อนไขหนึ่ง ทำให้จุดที่ไม่อยู่ใน main subgroup สามารถ “หลุดรอด” การตรวจสอบได้ แม้จะควรถูกปฏิเสธก็ตาม ปัญหานี้เกิดขึ้นในฟังก์ชัน crypto_core_ed25519_is_valid_point() ซึ่งควรตรวจสอบว่าจุดที่รับเข้ามาอยู่ในกลุ่มหลัก (order L) หรือไม่ โดยปกติจะตรวจสอบว่าหลังคูณด้วย L แล้วต้องได้ identity point แต่โค้ดเดิมตรวจสอบเพียงว่า X = 0 แต่ลืมตรวจสอบว่า Y = Z ทำให้จุดบางประเภท เช่น Q + (0, -1) ผ่านการตรวจสอบได้แม้จะไม่ถูกต้อง แม้ช่องโหว่นี้จะดูน่ากังวล แต่ผู้เขียนย้ำว่า ผู้ใช้ส่วนใหญ่ไม่ถูกกระทบ เพราะฟังก์ชันนี้เป็นฟังก์ชันระดับล่างที่ high‑level API เช่น crypto_sign_* ไม่ได้ใช้เลย อีกทั้ง public key ที่สร้างด้วยฟังก์ชันมาตรฐานของ Libsodium ก็ปลอดภัยอยู่แล้ว ปัญหานี้จะกระทบเฉพาะผู้ที่ใช้ฟังก์ชันดังกล่าวเพื่อตรวจสอบจุดจากแหล่งที่ไม่น่าเชื่อถือ หรือผู้ที่สร้างโปรโตคอลเข้ารหัสเองโดยตรง การแก้ไขถูกปล่อยทันทีหลังพบปัญหา โดยเพิ่มการตรวจสอบ Y = Z เข้าไป และแพ็กเกจทั้งหมดที่ออกหลังวันที่ 30 ธันวาคม 2025 ได้รวมแพตช์นี้แล้ว ผู้เขียนยังแนะนำให้ผู้ที่ต้องการความปลอดภัยสูงใช้ Ristretto255 แทน Edwards25519 เพราะปลอดภัยกว่าในเรื่อง cofactor และไม่ต้องตรวจสอบ subgroup เพิ่มเติมเลย ✅ ช่องโหว่เกิดจากอะไร? ➡️ ฟังก์ชัน crypto_core_ed25519_is_valid_point() ลืมตรวจสอบเงื่อนไข Y = Z ➡️ ทำให้จุดบางประเภทที่ไม่อยู่ใน main subgroup ผ่านการตรวจสอบได้ ➡️ เกิดจากการลืมพอร์ตโค้ดจาก Zig มายัง Libsodium ✅ ใครได้รับผลกระทบ? ➡️ ผู้ใช้ Libsodium เวอร์ชัน ≤ 1.0.20 ➡️ ผู้ที่ใช้ฟังก์ชันตรวจสอบจุดระดับล่างกับข้อมูลจาก untrusted sources ➡️ ผู้ที่สร้างโปรโตคอลเข้ารหัสเองบน Edwards25519 ‼️ ใคร “ไม่” ได้รับผลกระทบ? ⛔ ผู้ใช้ high‑level API เช่น crypto_sign_* ⛔ ผู้ใช้ public key ที่สร้างด้วยฟังก์ชันมาตรฐานของ Libsodium ⛔ ผู้ใช้ Ristretto255 ซึ่งปลอดภัยกว่าโดยออกแบบ ✅ การแก้ไขและคำแนะนำ ➡️ แพตช์ถูกปล่อยแล้วในแพ็กเกจหลัง 30 ธ.ค. 2025 ➡️ เพิ่มการตรวจสอบ Y = Z เพื่อปิดช่องโหว่ ➡️ แนะนำให้ใช้ Ristretto255 สำหรับโปรโตคอลใหม่ https://00f.net/2025/12/30/libsodium-vulnerability/
00F.NET
A vulnerability in libsodium
Libsodium is now 13 years old!
0 ความคิดเห็น 0 การแบ่งปัน 58 มุมมอง 0 รีวิว