2 คะแนน โดย GN⁺ 2024-05-26 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

ปัญหา

  • เมื่อคืน ขณะสำรวจเนื้อหาในฐานข้อมูล 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⁺

  1. ช่องโหว่ด้านความปลอดภัย: บทความนี้ชี้ให้เห็นว่าฐานข้อมูล checksum ของ Go มีช่องทางที่ทำให้เก็บข้อมูลตามอำเภอใจได้ ซึ่งอาจเปิดทางให้กระจายโค้ดอันตรายได้ง่ายขึ้น
  2. ความจำเป็นในการปรับปรุง: ควรปรับปรุงการควบคุมการเข้าถึงของฐานข้อมูล checksum และพร็อกซีเซิร์ฟเวอร์ เพื่อเสริมความปลอดภัยและความสมบูรณ์ของโครงสร้างพื้นฐาน Go
  3. การผสานกับภาษาอื่น: ควรทำให้ชัดเจนว่าเหตุใดโปรเจ็กต์ที่ไม่ใช่ Go จึงถูกรวมอยู่ในฐานข้อมูล checksum ของ Go และควรมีขั้นตอนตรวจสอบเพิ่มเติมเพื่อป้องกันสิ่งนี้
  4. การให้ความรู้แก่นักพัฒนา: จำเป็นต้องให้ความรู้แก่นักพัฒนาเพื่อให้ตระหนักถึงช่องโหว่ลักษณะนี้ และเข้าใจแนวทางปฏิบัติที่ดีที่สุดในการป้องกัน
  5. โซลูชันทางเลือก: สามารถเปรียบเทียบกับฐานข้อมูล checksum และพร็อกซีเซิร์ฟเวอร์ของภาษาอื่นที่ให้ความสามารถคล้ายกัน เพื่อนำมาใช้เป็นข้อมูลอ้างอิงในการปรับปรุงโครงสร้างพื้นฐานของ Go

1 ความคิดเห็น

 
GN⁺ 2024-05-26
ความคิดเห็นจาก Hacker News

สรุปรวมความคิดเห็นจาก Hacker News

  • ความเป็นไปได้ในการถูกนำบริการออนไลน์ไปใช้ในทางที่ผิด

    • บริการออนไลน์ทุกอย่างสุดท้ายแล้วก็อาจถูกนำไปใช้เป็นช่องทาง command and control, การละเมิดลิขสิทธิ์, หรือโฮสต์ CSAM ได้ ทั้ง Twitter, Telegram, และโครงสร้างพื้นฐานคีย์ PGP ก็มีกรณีแบบนี้มาแล้ว
  • ปัญหาการโฮสต์ไฟล์ของ Google

    • Google รับมือกับปัญหาการโฮสต์ไฟล์อันตรายอยู่บ่อยครั้ง จึงเป็นไปได้ว่าทีม Go อาจประสานงานกับ GCP และ Drive เรื่องนี้ ซึ่งก็ไม่ได้ต่างจากเอนด์พอยต์อื่น ๆ ที่ Google อนุญาตอยู่แล้วมากนัก
  • การเปรียบเทียบกับ GitHub

    • มีความเห็นว่าแทบไม่ต่างจากการอัปโหลดไฟล์ขึ้น GitHub เพราะ GitHub เองก็สามารถใช้เก็บข้อมูลตามอำเภอใจได้ถ้ามีแค่บัญชีผู้ใช้
  • โปรเจกต์ที่ไม่ใช่ Python บน PyPI

    • บน PyPI ก็มีโปรเจกต์ที่ไม่ใช่ Python อยู่ด้วย และจำเป็นต้องมีความสามารถในการแจกจ่าย wheel (ไบนารีที่คอมไพล์แล้ว) เผื่อกรณีที่ผู้ใช้คอมไพล์โค้ดไลบรารีเองไม่ได้ ซึ่งรวมถึงโค้ดที่เขียนด้วย C และ Golang ได้เช่นกัน
  • พร็อกซีของ Golang และบันทึกเช็กซัม

    • มีคนเคยลองใช้พร็อกซีของ Golang และ sumdb เพื่อบันทึกเช็กซัมของ URL ใด ๆ แบบโปร่งใส
  • การสำรวจโดเมน

    • เมื่อลองสำรวจโดเมนหนึ่ง พบว่ามีเนื้อหาส่วนใหญ่ตรงตามที่คาดไว้
  • ปัญหาที่ทราบอยู่แล้ว

    • มีการแชร์ลิงก์เกี่ยวกับปัญหาที่ทราบอยู่แล้วของ Golang
  • ระบบโมดูลของ CUE

    • ระบบโมดูลของ CUE กำลังเปิดตัว โดยแม้จะชอบ MVS ของ Go แต่ระบบนี้ถูกสร้างบนโครงสร้างพื้นฐาน OCI หากสนใจระบบจัดการ dependency ก็สามารถดูจากลิงก์ที่เกี่ยวข้องได้
  • ปัญหาเว็บแคช

    • มีข้อสงสัยว่าแม้ W3C จะทำให้ทุกอย่างบนเว็บสามารถแคชได้ แต่ทำไมพร็อกซีแคชแบบใช้งานทั่วไปถึงแทบไม่มีเลย เป็นเพราะผู้เผยแพร่ส่งค่า Cache-Control: max-age ที่สั้นเกินจำเป็นหรือ Vary: Cookie กลับมาหรือไม่ หรือเป็นเพราะมี ISP มากเกินไปที่ต้องจ่ายต้นทุนทรานซิต
  • ปัญหาพร็อกซีแคช

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