
ช่องโหว่ที่พึ่งถูกค้นพบใน 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

You must be logged in to post a comment.