phpseclib เสี่ยง DoS จาก PBKDF — GHSA-w3p9-g4p2-h3rr
นักพัฒนาและผู้ดูแลระบบที่เปิดรับไฟล์กุญแจเข้ารหัสหรือ PFX จากภายนอกควรเร่งอัปเดต phpseclib ตามสายรุ่นที่ใช้
1-minute summary
- Symptom / problem
- ไฟล์เข้ารหัสที่กำหนดจำนวนรอบ PBKDF สูงผิดปกติทำให้ PHP ใช้ CPU ต่อเนื่องจนบริการไม่พร้อมใช้งาน
- Who should read
- นักพัฒนาและผู้ดูแลระบบของแอปที่ใช้ phpseclib อ่านกุญแจเข้ารหัส PFX หรือ CMS จากแหล่งที่ไม่เชื่อถือพร้อมรหัสผ่าน
- Fix in short
- อัปเดตเป็น 4.0.3, 3.0.58, 2.0.56 หรือ 1.0.31 ตามสายรุ่น และตรวจรุ่นที่นำขึ้นใช้งานจริง
พอดีไล่ฟีด Packagist เจอประกาศของ phpseclib ลงวันที่ 2 พฤศจิกายน 2026 เรื่องไฟล์เข้ารหัสที่ทำให้ PHP ใช้ CPU จนบริการล่มได้ หมายเลขประกาศคือ GHSA-w3p9-g4p2-h3rr แอปที่ต้องตรวจคือแอปที่ใช้ phpseclib/phpseclib เปิดกุญแจหรือข้อมูลเข้ารหัสจากภายนอกด้วยรหัสผ่าน
ใครต้องทำอะไร
- ผู้ดูแลระบบ: ถ้าแอปรับไฟล์เข้ารหัสจากภายนอก ให้ประสานทีมแอปติดตั้งรุ่นแก้โดยเร็ว
- นักพัฒนา: ถ้าโค้ดใช้ phpseclib เปิดไฟล์ที่ไม่เชื่อถือด้วยรหัสผ่าน ให้เร่งอัปเดตไลบรารีและทดสอบก่อนนำขึ้นใช้งาน
เกิดอะไรขึ้น
PBKDF ใช้สร้างกุญแจจากรหัสผ่าน โดยคำนวณซ้ำหลายรอบเพื่อให้เดารหัสผ่านได้ยากขึ้น ปัญหาคือ phpseclib อ่านจำนวนรอบ iterationCount จากข้อมูล ASN.1 ในไฟล์โดยไม่จำกัดค่าสูงสุด ผู้โจมตีเลยใส่จำนวนรอบสูงมากได้ PHP worker จะติดอยู่กับการคำนวณจนรับงานอื่นไม่ได้
ประกาศระบุไฟล์กุญแจส่วนตัว PKCS#8 ที่เข้ารหัส ไฟล์ PKCS#12 หรือ PFX และข้อมูล CMS แบบใช้รหัสผ่าน เงื่อนไขคือแอปส่งไฟล์จากผู้โจมตีเข้า loader พร้อมรหัสผ่านที่ไม่เป็น null ตัวไลบรารีคำนวณกุญแจก่อนลองถอดรหัส แม้ข้อมูลเข้ารหัสจะใช้ไม่ได้ ก็ยังเสียเวลาคำนวณเต็มจำนวนรอบ
ผลที่รายงานคือ denial of service หรือ DoS จากการใช้ CPU ต่อเนื่อง ไฟล์ขนาดเล็กก็ยึด worker ไว้ได้ และคำขอหลายรายการอาจใช้ worker จนหมด ประกาศระบุว่าไม่มีผลต่อความลับหรือความถูกต้องของข้อมูล จัดระดับ High และให้คะแนน CVSS 3.1 ที่ 7.5 ช่อง CVE ยังระบุว่าไม่มีหมายเลขที่ทราบ ตาม ประกาศความปลอดภัยของ phpseclib
ใครโดนและรุ่นที่แก้
ตาราง Affected versions และ Patched versions ในประกาศระบุรุ่นของแพ็กเกจ phpseclib/phpseclib ดังนี้
| สายรุ่น | รุ่นที่ได้รับผลกระทบ | รุ่นที่แก้ |
|---|---|---|
| 4.x | 4.0.0–4.0.2 | 4.0.3 |
| 3.x | 3.0.0–3.0.57 | 3.0.58 |
| 2.x | 2.0.0–2.0.55 | 2.0.56 |
| 1.x | 1.0.0–1.0.30 | 1.0.31 |
ข้อมูลในหน้าเดียวกันยังไม่ตรงกันทั้งหมด ส่วนรายละเอียดเก่ายังเขียนว่า “Fix status: not fixed” แต่ตารางด้านบนมีรุ่นแก้แล้ว Release note ของ 4.0.3, 3.0.58, 2.0.56 และ 1.0.31 ยืนยันว่าเพิ่มเพดานจำนวนรอบ PBKDF แล้ว ตารางนี้เลยยึดรุ่นแก้ตามข้อมูลดังกล่าว
ต้องทำอะไร
ตรวจรุ่นในโครงการ แล้วอัปเดตในสภาพแวดล้อมทดสอบก่อนนำขึ้นใช้งาน ตัวอย่างสำหรับโครงการ Composer ที่ติดตั้งแพ็กเกจนี้โดยตรงคือ
composer show phpseclib/phpseclib
composer update phpseclib/phpseclib --with-dependencies
composer show phpseclib/phpseclib
คำสั่ง update ของ Composer ยังเลือกได้เฉพาะรุ่นที่เงื่อนไขใน composer.json ยอมรับ ถ้าตรึงรุ่นเก่าไว้ ให้แก้เงื่อนไขเพื่อรับรุ่นแก้ในสายเดิม แล้วตรวจ composer.lock ทดสอบการนำเข้าไฟล์ตามปกติ โดยเฉพาะกุญแจ PFX หรือ CMS ที่แอปใช้งาน จากนั้นนำแอปพร้อมไลบรารีที่อัปเดตแล้วขึ้นใช้งานจริง
ประกาศเสนอให้จำกัด CPU หรือเวลาประมวลผลต่อคำขอเพื่อลดผลกระทบชั่วคราว แต่คำขอยังยึด worker จนถูกหยุด ขีดจำกัดของคำขอเว็บไม่ได้ป้องกันงาน CLI หรือ worker เบื้องหลังด้วย
ส่วนตัวผมให้เร่งแพตช์หากเปิดรับไฟล์เข้ารหัสจากภายนอก เพราะไฟล์ขนาดเล็กก็ทำให้ worker เสียเวลาคำนวณได้ ที่มา: phpseclib Security Advisory GHSA-w3p9-g4p2-h3rr (https://github.com/phpseclib/phpseclib/security/advisories/GHSA-w3p9-g4p2-h3rr) เดี๋ยวกลับมาแก้เพิ่มให้ภายหลังครับ
Want us to set this up?
Get help with server setup, configuration, migration, or troubleshooting. Save time for the work that matters.
Hit something like this? Stuck somewhere?
Come trade notes on the LinuxThai board



Comments 0
No comments yet — be the first