สรุปสั้น

นักวิจัยด้านความปลอดภัยจากบริษัท depthfirst เผยแพร่โค้ดโจมตี (exploit) ที่ใช้งานได้จริงเมื่อวันที่ 24 กรกฎาคม สำหรับช่องโหว่ใน GitLab ที่ทาง GitLab ได้แพตช์ไปแล้วก่อนหน้าราวหกสัปดาห์เมื่อวันที่ 10 มิถุนายน โดย exploit นี้สามารถรันคำสั่งในสิทธิ์บัญชี git บนเซิร์ฟเวอร์ GitLab แบบ self-managed เวอร์ชัน 18.11.3 ที่ยังไม่ได้อัปเดต จุดที่น่ากังวลคือผู้ใช้ที่ผ่านการยืนยันตัวตนแล้วและมีสิทธิ์ push เข้าโปรเจกต์ใดก็สามารถรันได้ โดยไม่ต้องมีสิทธิ์แอดมิน ไม่ต้องเข้าถึง CI หรือ runner ไม่ต้องอาศัยการโต้ตอบจากเหยื่อ และไม่ต้องเข้าถึงโปรเจกต์ของคนอื่น วิธีการคือผู้โจมตี commit ไฟล์ Jupyter notebook ที่สร้างขึ้นมาเป็นพิเศษแล้วเปิดดู commit diff ซึ่งจะทำให้ heap pointer รั่วออกมา เมื่อทำซ้ำหลายครั้งระบบอัตโนมัติจะสามารถระบุตำแหน่งไลบรารีในหน่วยความจำได้ แล้วจึงยิงเพย์โหลดด้วย notebook อีกสองไฟล์ ที่สำคัญคือ GitLab ไม่ได้จัดว่าการแก้ไขนี้เป็นการแก้ช่องโหว่ความปลอดภัย ไม่มีการกำหนดหมายเลข CVE ไม่มีคะแนน CVSS ทำให้ผู้ดูแลระบบที่ตรวจสอบเฉพาะรายการแก้ไขด้านความปลอดภัยไม่มีเหตุผลให้รีบอัปเดต

รายละเอียดข่าว

เว็บไซต์ The Hacker News รายงานเมื่อวันที่ 25 กรกฎาคม พ.ศ. 2569 ว่า บริษัท depthfirst ได้เผยแพร่โค้ดโจมตีสำหรับช่องโหว่รันโค้ดจากระยะไกล (RCE) ใน GitLab เมื่อวันที่ 24 กรกฎาคม โดยจากการตรวจสอบของ The Hacker News พบว่า GitLab ได้ระบุการอัปเดตไลบรารี Oj เป็นเวอร์ชัน 3.17.3 ไว้ในหมวด bug fixes ของแพตช์วันที่ 10 มิถุนายน ไม่ได้อยู่ในตารางการแก้ไขด้านความปลอดภัย และไม่มีการกล่าวถึงเชนการโจมตีผ่าน notebook-diff แต่อย่างใด

ต้นตอของช่องโหว่คือบั๊ก memory corruption สองจุดใน Oj ซึ่งเป็นตัวแปลง (parser) JSON ของภาษา Ruby ที่เขียนด้วยภาษา C เป็นส่วนใหญ่ โดย depthfirst ระบุว่าระบบของบริษัทตรวจพบบั๊กเหล่านี้ได้เองโดยอัตโนมัติ แล้วนักวิจัยจึงนำมาเชนต่อกันด้วยมือ ตัวเรนเดอร์ notebook ของ GitLab ซึ่งเป็น gem ภายในชื่อ ipynbdiff จะส่งข้อมูล JSON จากไฟล์ .ipynb ที่ควบคุมได้จาก repository เข้าสู่ฟังก์ชัน Oj::Parser.usual.parse ภายใน Puma worker ที่ทำงานต่อเนื่องยาวนาน ทำให้ไบต์ที่ผู้โจมตีควบคุมได้เข้าถึงหน่วยความจำ C ของ Oj ที่จัดการด้วยมือภายในโปรเซสของแอปพลิเคชัน

depthfirst รายงานบั๊กใน Oj ต่อผู้ดูแลเมื่อวันที่ 21 พฤษภาคม ผู้ดูแลรวมแพตช์เมื่อวันที่ 27 พฤษภาคม และ Oj 3.17.3 ออกเมื่อวันที่ 4 มิถุนายน จากนั้นเชนการโจมตี GitLab ถูกส่งให้ GitLab เมื่อวันที่ 5 มิถุนายน ยืนยันเมื่อวันที่ 8 มิถุนายน และแพตช์เมื่อวันที่ 10 มิถุนายน โดย depthfirst ระบุว่ายังไม่พบการโจมตีในสภาพจริง และ GitLab ได้จำลอง RCE ซ้ำได้ด้วยตัวเองอย่างอิสระ ทั้งนี้การตรวจสอบ Oj ในวงกว้างของบริษัทยังนำไปสู่การออก advisory CVE เพิ่มอีกเก้ารายการ แต่ไม่มีรายการใดเป็นเชนนี้

Researcher publishes GitLab RCE PoC letting authenticated users run commands as git

รายละเอียดช่องโหว่

เชนการโจมตีอาศัยบั๊ก memory corruption สองจุดใน Oj จุดแรกเป็นการเขียนข้อมูลเกินขอบเขต โดยเขียนทะลุ nesting stack ขนาดตายตัว 1,024 ไบต์ไปเรื่อยๆ จนสามารถควบคุม start callback ของ parser ได้ ส่วนจุดที่สองเป็นการตัดทอน object key ขนาด 65,565 ไบต์ให้เหลือ 29 ในฟิลด์ signed 16-bit แล้วคืนค่า heap pointer ที่ยังใช้งานอยู่ ซึ่ง GitLab จะนำไปเรนเดอร์แสดงใน diff การรั่วนี้ช่วยระบุตำแหน่งของ libc ขณะที่การเขียนข้อมูลจะชี้ callback ไปยังฟังก์ชัน system()

ช่องโหว่กระทบ GitLab ทุกระดับทั้ง CE และ EE ตั้งแต่รุ่น Free ไปจนถึง Ultimate โดยตัวภาษา Ruby เองไม่ได้รับผลกระทบ ทั้งนี้ exploit สาธารณะถูกสร้างมาสำหรับ GitLab 18.11.3 บนสถาปัตยกรรม x86-64 โดยเฉพาะ ค่า gadget offset สถานะ register และพฤติกรรม jemalloc ล้วนมาจากอิมเมจนั้น และตำแหน่งฐานของไลบรารีที่กู้คืนมาจะใช้ได้จนกว่า Puma master จะรีสตาร์ต จึงไม่ใช่ exploit ที่นำไปใช้กับเป้าหมายอื่นได้ทันที แต่บั๊กใน Oj เป็นแบบทั่วไป การพอร์ต exploit ไปใช้กับเป้าหมายอื่นทำได้จริงแม้ต้องใช้ความพยายาม โดย depthfirst วัดเวลาการค้นหาหน่วยความจำได้ราวห้าถึงสิบนาทีบนระบบติดตั้งใหม่ที่มีสอง worker และคาดว่าจะใช้เวลาหนึ่งถึงสองชั่วโมงบนระบบที่ทำงานมานาน

ตารางเวอร์ชันที่ได้รับผลกระทบและเวอร์ชันที่แก้ไขมีดังนี้:

คอมโพเนนต์เวอร์ชันที่กระทบแก้ไขครั้งแรกใน
GitLab CE/EE15.2.0 ถึง 18.10.718.10.8
GitLab CE/EE18.11.0 ถึง 18.11.418.11.5
GitLab CE/EE19.0.0 ถึง 19.0.119.0.2
Oj gem3.13.0 ถึง 3.17.13.17.3

ผลกระทบต่อไทย

GitLab เป็นแพลตฟอร์มจัดการซอร์สโค้ดและ CI/CD ที่องค์กรไทยจำนวนมากทั้งภาครัฐ เอกชน และสถาบันการศึกษาใช้แบบ self-managed บนเซิร์ฟเวอร์ของตัวเอง ความเสี่ยงของช่องโหว่นี้อยู่ที่การที่ผู้ใช้ภายในที่มีสิทธิ์ push เพียงเล็กน้อยก็สามารถยกระดับไปรันคำสั่งในสิทธิ์บัญชี git ได้ ซึ่งเข้าถึงซอร์สโค้ด, Rails secrets, ข้อมูลรับรองบริการ, ข้อมูล CI/CD และบริการภายในที่แอปพลิเคชันติดต่อได้ นั่นหมายถึงพนักงานภายในที่ไม่หวังดี หรือบัญชีนักพัฒนาที่ถูกเจาะ อาจกลายเป็นจุดเริ่มต้นของการเข้าถึงทรัพย์สินสำคัญทั้งหมดในระบบพัฒนาซอฟต์แวร์ ที่อันตรายเป็นพิเศษคือเพราะแพตช์ถูกจัดเป็นเพียง bug fix ธรรมดาไม่มี CVE องค์กรที่ตรวจสอบเฉพาะประกาศช่องโหว่ความปลอดภัยจึงอาจพลาดและปล่อยระบบทิ้งไว้โดยไม่รู้ตัว

คำแนะนำ

องค์กรควรอัปเดต GitLab เป็นเวอร์ชัน 18.10.8, 18.11.5 หรือ 19.0.2 โดยเร็ว เนื่องจากทั้ง GitLab และ depthfirst ไม่มี workaround สำหรับผู้ที่ยังอัปเดตไม่ได้ สำหรับผู้ที่ใช้ Helm หรือ Operator ต้องระวังกับดักคือให้ตรวจสอบเวอร์ชัน GitLab ภายในอิมเมจ Webservice ที่รัน Puma ไม่ใช่เวอร์ชันของ chart หรือ Operator ส่วนระบบที่รันรุ่น 15.2 ถึง 18.9 จะไม่ได้รับ backport เพราะอยู่นอกสายแพตช์ที่ยังดูแลด้านความปลอดภัย จึงต้องย้ายไปใช้รุ่นที่รองรับแทน นอกจากนี้ควรทบทวนสิทธิ์ push ของผู้ใช้ให้เหลือเท่าที่จำเป็น และเฝ้าระวังการเรียกดู commit diff ของไฟล์ notebook ที่ผิดปกติ

แหล่งอ้างอิง