ช่องโหว่ระดับ Critical ใน vBulletin Forum ทำให้ผู้โจมตีสามารถรันโค้ดที่เป็นอันตรายจากระยะไกลได้

ช่องโหว่ที่พึ่งถูกค้นพบใน vBulletin ซึ่งเป็นหนึ่งใน platform กระดานสนทนาที่ได้รับความนิยมมากที่สุดในโลก ส่งผลให้ platform ออนไลน์หลายพันแห่งเสี่ยงต่อการถูกโจมตีด้วยการเรียกใช้โค้ดที่เป็นอันตรายจากระยะไกล (RCE) โดยไม่ต้องผ่านการยืนยันตัวตน

ช่องโหว่นี้อยู่ใน vBulletin เวอร์ชัน 5.x และ 6.x ที่ทำงานบน PHP 8.1 หรือใหม่กว่า โดยทำให้ผู้โจมตีสามารถเรียกใช้ method ภายในที่ควรได้รับการป้องกัน, ทำลายขอบเขตความปลอดภัยพื้นฐาน และทำให้ระบบถูกเข้าควบคุมได้อย่างสมบูรณ์โดยไม่ต้องผ่านการยืนยันตัวตน

หัวใจสำคัญของช่องโหว่นี้คือการที่ vBulletin พึ่งพา Reflection API ของ PHP สำหรับโครงสร้าง Model-View-Controller (MVC) และ API ภายในที่กำหนดเอง

Reflection API และการกำหนดเส้นทางแบบไดนามิก

สถาปัตยกรรมของ platform นี้ใช้การกำหนดเส้นทางแบบไดนามิก โดยที่ API endpoints จะถูกแมปไปยัง method ของ controller ตาม HTTP request ที่เข้ามา เช่น AJAX call ไปยัง /ajax/api/user/fetchProfileInfo จะถูกแมปไปยัง vB_Api_User::fetchProfileInfo() method

ปัญหาหลักเกิดจากวิธีการที่ vBulletin ใช้ function ReflectionMethod::invoke() และ ReflectionMethod::invokeArgs() ซึ่งตั้งแต่ PHP 8.1 เป็นต้นไป function เหล่านี้อนุญาตให้เรียกใช้ method ที่ได้รับการ protected และเป็น private ได้โดยไม่ต้องใช้ setAccessible(true) ต่างจาก PHP เวอร์ชันก่อนหน้า

การเปลี่ยนแปลงเล็กน้อยนี้หมายความว่า method ที่ตั้งใจให้เป็นตัวช่วยภายใน และไม่ควรถูกเรียกจากภายนอก สามารถถูกเรียกใช้โดยตรงจากผู้โจมตีภายนอกได้ หากแอปพลิเคชันไม่ได้บังคับการตรวจสอบ visibility อย่างเข้มงวด

ตัวอย่างรูปแบบโค้ดที่เสี่ยงได้แก่

การ request ไปยัง /api.php?method=protectedMethod ซึ่งสามารถเรียกใช้ method ที่ได้รับการ protected บน PHP 8.1+ ได้โดยข้ามการ bypass access controls แบบเดิม

เส้นทางการโจมตี และผลกระทบ

แม้ว่าการเรียกใช้ method ที่ได้รับการป้องกันจะเป็นอันตรายอยู่แล้ว แต่ภัยคุกคามร้ายแรงจะเกิดขึ้นเมื่อหนึ่งใน method เหล่านั้นสามารถนำไปสู่การรันโค้ดได้โดยตรงใน vBulletin method vB_Api_Ad::replaceAdTemplate() เป็น function ที่ได้รับการป้องกันซึ่งออกแบบมาเพื่อแทรก หรืออัปเดต template โฆษณา

ผู้โจมตีค้นพบว่าสามารถแทรกโค้ด template ที่เป็นอันตรายเข้าไปได้ โดยการเรียกใช้ method นี้ผ่าน HTTP POST request ที่สร้างขึ้นอย่างเจาะจง

เนื่องจาก engine template ของ vBulletin รองรับ conditional logic (เช่น แท็ก <vb:if>) และยังมีช่องโหว่แยกในกระบวนการกรองอินพุตของ template parser ทำให้ผู้โจมตีสามารถฝังโค้ด PHP ได้

เมื่อ template นี้ถูกแทรกแล้ว จะช่วยให้ผู้โจมตีสามารถรันคำสั่งระบบตามที่ต้องการผ่าน POST request ได้ ซึ่งเท่ากับการสร้าง webshell ขึ้นบนเซิร์ฟเวอร์

จากตัวอย่างการโจมตี (proof-of-concept) แสดงให้เห็นว่าผู้โจมตีสามารถเข้าถึง shell, รันคำสั่งตามอำเภอใจ และยึดระบบได้อย่างสมบูรณ์ โดยไม่ต้องผ่านการยืนยันตัวตนแม้แต่น้อย

การโจมตีนี้ยืนยันแล้วว่าใช้ได้กับ vBulletin 5.1.0, 5.7.5, 6.0.1 และ 6.0.3 บน PHP 8.1+ โดยช่องโหว่นี้ได้รับการแก้ไขแล้วใน vBulletin 6.0.4

ช่องโหว่นี้เป็นคำเตือนสำหรับนักพัฒนา เนื่องจากการพึ่งพา method visibility (public, protected, private) เพียงอย่างเดียวไม่สามารถรับประกันความปลอดภัยได้ โดยเฉพาะเมื่อระบบใช้การส่งข้อมูลแบบไดนามิก และ reflection

การที่ PHP 8.1 เปลี่ยนพฤติกรรมให้ ReflectionMethod สามารถเรียกใช้ method ที่ได้รับการ protected และเป็น private ได้โดยไม่ต้องเปิดสิทธิ์ หมายความว่าแอปพลิเคชันต้องมีการตรวจสอบสิทธิ์ และการควบคุมการเข้าถึงในระดับแอปพลิเคชันอย่างเข้มงวด

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

ที่มา : cybersecuritynews