ช่องโหว่ใน cdnjs ที่อนุญาตให้มีการเรียกใช้โค้ดบนเซิร์ฟเวอร์ Cloudflare

มีการระบุช่องโหว่ที่สำคัญในเครือข่ายการจัดส่งเนื้อหา cdnjs ของ Cloudflare ซึ่งได้รับการออกแบบมาเพื่อเพิ่มความเร็วในการจัดส่งไลบรารี JavaScript ซึ่งช่วยให้สามารถเรียกใช้โค้ดโดยอำเภอใจบนเซิร์ฟเวอร์ CDN อันตรายของปัญหานี้รุนแรงขึ้นจากข้อเท็จจริงที่ว่าประมาณ 12.7% ของไซต์ทั้งหมดบนอินเทอร์เน็ตใช้บริการนี้เพื่อดาวน์โหลดไลบรารี JavaScript และการประนีประนอมของโครงสร้างพื้นฐานทำให้สามารถแทนที่ไลบรารีที่จัดทำโดยไซต์เหล่านี้ได้

บริการ cdnjs ดาวน์โหลดแพ็คเกจจาก Git หรือพื้นที่เก็บข้อมูล NPM หลังจากนั้นจะอนุญาตให้ไซต์ใดๆ ใช้เครือข่ายการจัดส่งเนื้อหา Cloudflare ได้ฟรีเพื่อเพิ่มความเร็วในการโหลดไลบรารี JavaScript เมื่อศึกษาโค้ดของส่วนประกอบ cdnjs ที่เผยแพร่บน GitHub พบว่าในการคลายแพ็กเกจ NPM ในไฟล์เก็บถาวร tgz นั้น จะใช้โมดูลไฟล์เก็บถาวร/tar มาตรฐานในภาษา Go ซึ่งสร้างรายการไฟล์ตามที่เป็นอยู่ โดยไม่ต้องทำให้เส้นทางเป็นมาตรฐาน . ในกรณีที่สคริปต์คลายเนื้อหาตามรายการที่กำหนด การมีอยู่ของไฟล์เช่น “../../../../../../../tmp/test” ในไฟล์เก็บถาวรสามารถ นำไปสู่การเขียนทับไฟล์ตามอำเภอใจในระบบ เท่าที่สิทธิ์การเข้าถึงอนุญาต

แนะนำว่าผู้โจมตีสามารถเพิ่มไลบรารีของเขาลงใน cdnjs และอัปโหลดไฟล์เก็บถาวรที่ออกแบบมาเป็นพิเศษซึ่งมีไฟล์ที่มีอักขระ “../” ในเส้นทางไปยังที่เก็บ NPM บนเซิร์ฟเวอร์ cdnjs การดำเนินการ "อัปเดตอัตโนมัติ" จะดำเนินการเป็นระยะ โดยในระหว่างนั้นตัวจัดการจะดาวน์โหลดเวอร์ชันใหม่ของไลบรารีที่เสนอและคลายแพ็กเนื้อหา การใช้ไฟล์ที่มีพาธ “../” ผู้โจมตีสามารถเขียนทับไฟล์ด้วยสคริปต์บริการและรันโค้ดบนเซิร์ฟเวอร์ที่ทำการคลายแพ็ก

ในกรณีของการดาวน์โหลดการอัปเดตจาก Git พบว่าตัวจัดการการดาวน์โหลดการอัปเดตไม่ได้คำนึงถึงลิงก์สัญลักษณ์เมื่อทำการคัดลอกไฟล์จาก Git คุณลักษณะนี้ทำให้สามารถจัดระเบียบการอ่านไฟล์ใดๆ จากเซิร์ฟเวอร์ได้โดยการเพิ่มลิงก์สัญลักษณ์ลงใน Git

มีการตัดสินใจที่จะเริ่มการทดลองด้วยการสาธิตการแฮ็ก cdnjs เพื่อรับรางวัลที่ HackerOne โดยทดสอบสมมติฐานเกี่ยวกับการอ่านไฟล์ เพิ่มลิงก์สัญลักษณ์ test.js ลงในที่เก็บ Git ของไลบรารี JavaScript ที่ให้บริการผ่าน CDN โดยชี้ไปที่ไฟล์ /proc/self/maps หลังจากการเผยแพร่ไลบรารีเวอร์ชันใหม่ ตัวจัดการการอัปเดตจะประมวลผลพื้นที่เก็บข้อมูลนี้และเผยแพร่ไฟล์ที่ระบุใน cdnjs (test.js ถูกสร้างขึ้นเป็นลิงก์สัญลักษณ์ และเมื่อมีการร้องขอไฟล์นี้ เนื้อหาของ /proc/self/maps จะถูกส่งคืน ).

ผู้เขียนการศึกษาพบว่าข้อมูลที่ให้มีค่าของตัวแปรสภาพแวดล้อม GITHUB_REPO_API_KEY และ WORKERS_KV_API_TOKEN แทนลิงก์สัญลักษณ์ไปยังไฟล์ /proc/self/environ ตัวแปรแรกจัดเก็บคีย์ API สำหรับการเข้าถึงการเขียนไปยังที่เก็บ robocdnjs บน GitHub ตัวแปรตัวที่สองเก็บโทเค็นไว้ในที่เก็บข้อมูล KV ใน cdnjs ผู้โจมตีสามารถเปลี่ยนแปลง cdnjs และทำให้โครงสร้างพื้นฐานเสียหายได้โดยใช้ข้อมูลที่ได้รับ

ที่มา: opennet.ru

เพิ่มความคิดเห็น