ปัญหา
- เมื่อคืน ขณะสำรวจเนื้อหาในฐานข้อมูล checksum ของ Go ก็พบผลลัพธ์ที่น่าสนใจ
- เมื่อรันคำสั่ง
sqlite> select path, count(path) from modules group by path order by count(path) desc; ได้ผลลัพธ์ดังนี้:
github.com/homebrew/homebrew-core|39438
github.com/Homebrew/homebrew-core|30896
github.com/concourse/concourse|25372
github.com/openshift/release|24065
github.com/cilium/cilium|22138
- เป็นที่รู้กันว่า Homebrew ใช้ Ruby จึงน่าสงสัยว่ามันเกี่ยวข้องกับ Go ได้อย่างไร
- สถิติภาษาใน GitHub ก็ยืนยันเรื่องนี้เช่นกัน
- จึงโคลน repository มาเพื่อตามหาไฟล์ที่เกี่ยวข้องกับ Go (
go.mod หรือไฟล์ซอร์ส Go) แต่ก็ไม่พบอะไรเลย
การศึกษา
- วันใหม่เริ่มต้นขึ้น และความสงสัยก็เรียกร้องคำตอบ
- หาก Git repository ไม่ได้เกี่ยวข้องกับโค้ด Go แล้วมันไปปรากฏอยู่ในฐานข้อมูล checksum ของ Go ได้อย่างไร จึงกลายเป็นคำถาม
- พบว่า
proxy.golang.org เป็นโมดูลพร็อกซีเริ่มต้น และ sum.golang.org คือฐานข้อมูล checksum
- หลังจากอ่านเอกสารของ Go ก็พบว่า หากเวอร์ชันของโมดูลยังไม่ได้ถูกบันทึกไว้ในล็อก ฐานข้อมูล checksum จะพยายามดึงโมดูลจากเซิร์ฟเวอร์ต้นทาง
- จึงลองเรียก endpoint
lookup เพื่อตรวจสอบว่า repository โมดูล Go ใหม่จะถูกเพิ่มเข้าไปในฐานข้อมูล checksum และพร็อกซีหรือไม่
- หลังจากสร้างโมดูล Go ใหม่และอัปโหลดไปยังบัญชี GitHub แล้ว ได้ลองใช้คำสั่ง
lookup สองรูปแบบ แต่ทั้งคู่เกิดข้อผิดพลาด
- จากนั้นสร้าง pseudo-version ที่ถูกต้อง และ query ฐานข้อมูล checksum อีกครั้งเพื่อตรวจสอบว่าโมดูลถูกดาวน์โหลดแล้วหรือไม่
- ได้พิสูจน์ว่าสามารถเก็บข้อมูลตามอำเภอใจไว้ในโครงสร้างพื้นฐานของ Go ได้ โดย query พร็อกซีและดาวน์โหลด
zip ของโมดูล
ความเป็นไปได้ในการนำไปใช้ในทางที่ผิด
- อาจถูกใช้เพื่อหลบเลี่ยงข้อจำกัดการดาวน์โหลดบนเครื่องนักพัฒนาและเซิร์ฟเวอร์ CI/CD
- มัลแวร์อาจใช้เก็บ payload ไว้และดึงมันกลับมาจากพร็อกซีเมื่อจำเป็น
- อาจเป็นไปได้ที่จะโจมตีแบบปฏิเสธการให้บริการ (DoS) ต่อ
proxy.golang.org
- สามารถสร้างระบบสั่งการและควบคุม (C2) ได้อย่างง่ายดาย
บทสรุป
- ทำให้เข้าใจการทำงานของกระบวนการในฐานข้อมูล checksum มากขึ้น
- ณ ตอนนี้ยังไม่ถือเป็นปัญหาร้ายแรงในโครงสร้างพื้นฐานของ Go แต่มีโอกาสถูกนำไปใช้ในทางที่ผิดได้
- ยังมีคำถามเพิ่มเติมว่าทำไมโปรเจ็กต์ที่ไม่ใช่ Go จึงอยู่ในฐานข้อมูลนี้
- การศึกษาครั้งนี้จุดประกายไอเดียหลายอย่าง และมีแผนจะสำรวจต่อไป
ความเห็นของ GN⁺
- ช่องโหว่ด้านความปลอดภัย: บทความนี้ชี้ให้เห็นว่าฐานข้อมูล checksum ของ Go มีช่องทางที่ทำให้เก็บข้อมูลตามอำเภอใจได้ ซึ่งอาจเปิดทางให้กระจายโค้ดอันตรายได้ง่ายขึ้น
- ความจำเป็นในการปรับปรุง: ควรปรับปรุงการควบคุมการเข้าถึงของฐานข้อมูล checksum และพร็อกซีเซิร์ฟเวอร์ เพื่อเสริมความปลอดภัยและความสมบูรณ์ของโครงสร้างพื้นฐาน Go
- การผสานกับภาษาอื่น: ควรทำให้ชัดเจนว่าเหตุใดโปรเจ็กต์ที่ไม่ใช่ Go จึงถูกรวมอยู่ในฐานข้อมูล checksum ของ Go และควรมีขั้นตอนตรวจสอบเพิ่มเติมเพื่อป้องกันสิ่งนี้
- การให้ความรู้แก่นักพัฒนา: จำเป็นต้องให้ความรู้แก่นักพัฒนาเพื่อให้ตระหนักถึงช่องโหว่ลักษณะนี้ และเข้าใจแนวทางปฏิบัติที่ดีที่สุดในการป้องกัน
- โซลูชันทางเลือก: สามารถเปรียบเทียบกับฐานข้อมูล checksum และพร็อกซีเซิร์ฟเวอร์ของภาษาอื่นที่ให้ความสามารถคล้ายกัน เพื่อนำมาใช้เป็นข้อมูลอ้างอิงในการปรับปรุงโครงสร้างพื้นฐานของ Go
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
สรุปรวมความคิดเห็นจาก Hacker News
ความเป็นไปได้ในการถูกนำบริการออนไลน์ไปใช้ในทางที่ผิด
ปัญหาการโฮสต์ไฟล์ของ Google
การเปรียบเทียบกับ GitHub
โปรเจกต์ที่ไม่ใช่ Python บน PyPI
พร็อกซีของ Golang และบันทึกเช็กซัม
การสำรวจโดเมน
ปัญหาที่ทราบอยู่แล้ว
ระบบโมดูลของ CUE
ปัญหาเว็บแคช
Cache-Control: max-ageที่สั้นเกินจำเป็นหรือVary: Cookieกลับมาหรือไม่ หรือเป็นเพราะมี ISP มากเกินไปที่ต้องจ่ายต้นทุนทรานซิตปัญหาพร็อกซีแคช