5 คะแนน โดย darjeeling 26 일 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

🔑 สรุปประเด็นสำคัญ

โทเค็น API ถูกขโมยผ่านช่องโหว่ใน dependency ของ Trivy และถูกใช้เป็นฐานในการเผยแพร่เวอร์ชันอันตรายของแพ็กเกจ litellm และ telnyx บน PyPI มัลแวร์จะทำงานทันทีหลังติดตั้ง รวบรวมข้อมูลรับรองและไฟล์ที่มีความอ่อนไหว แล้วส่งออกไปยังเซิร์ฟเวอร์ภายนอก


⚠️ ทำไมมัลแวร์ครั้งนี้ถึงพิเศษ

แพ็กเกจอันตรายบน PyPI ส่วนใหญ่ก่อนหน้านี้มักเป็น แพ็กเกจที่สร้างขึ้นใหม่ (เช่น typosquatting) แต่การโจมตีครั้งนี้ต่างออกไป เพราะเป็นการ ฉีดมัลแวร์เข้าไปในแพ็กเกจโอเพนซอร์สที่มีการใช้งานอย่างแพร่หลายอยู่แล้ว

เส้นทางการแทรกมี 2 แบบ:

  • โจมตีโครงการโอเพนซอร์สโดยตรงที่มี repository, release workflow หรือการยืนยันตัวตนที่อ่อนแอ
  • ขโมย API token และคีย์จากเครื่องนักพัฒนาที่ติดตั้งเวอร์ชันล่าสุด

เป็นโครงสร้างการโจมตีแบบลูกโซ่ที่ใช้ PyPI หรือ GitHub API token ที่ขโมยมา เพื่อเจาะแพ็กเกจโอเพนซอร์สอื่นเพิ่มเติม


📅 ไทม์ไลน์ของเหตุการณ์

LiteLLM

ในช่วงเวลาที่เวอร์ชันอันตรายถูกเผยแพร่ มีการดาวน์โหลดมากกว่า 119,000 ครั้ง
PyPI ได้รับรายงาน 13 รายการผ่านฟีเจอร์ "รายงานมัลแวร์"

ขั้นตอน ระยะเวลา
อัปโหลด → รายงานแรก 1 ชั่วโมง 19 นาที
รายงานแรก → กักกัน 1 ชั่วโมง 12 นาที
เวลาที่เปิดเผยรวม 2 ชั่วโมง 32 นาที

LiteLLM มีการติดตั้งราว 15–20 ล้านครั้งต่อสัปดาห์ และถูกติดตั้งประมาณ 1,700 ครั้งต่อนาที โดยในจำนวนนี้ราว 40–50% ไม่ได้ตรึงเวอร์ชัน ทำให้รับเวอร์ชันล่าสุดโดยอัตโนมัติ

Telnyx

แพ็กเกจ telnyx ถูกกักกันโดยอัตโนมัติด้วยระบบ trusted reporters ของ PyPI

ขั้นตอน ระยะเวลา
อัปโหลด → รายงานแรก 1 ชั่วโมง 45 นาที
รายงานแรก → กักกัน 1 ชั่วโมง 57 นาที
เวลาที่เปิดเผยรวม 3 ชั่วโมง 42 นาที

🛡️ คำแนะนำด้านความปลอดภัยสำหรับนักพัฒนา

1. Dependency cooldowns

เป็นกลยุทธ์ที่ตั้งค่าไม่ให้ติดตั้งแพ็กเกจที่เพิ่งเผยแพร่ในช่วงเวลาหนึ่ง เพื่อให้เวลานักวิจัยด้านความปลอดภัยและผู้ดูแล PyPI ได้ตอบสนองก่อน

uv — รองรับแล้วในปัจจุบัน:

# ~/.config/uv/uv.toml หรือ pyproject.toml  
[tool.uv]  
exclude-newer = "P3D"  # ยกเว้นแพ็กเกจที่เผยแพร่ภายใน 3 วัน  

pip v26.1 — มีกำหนดรองรับภายในเดือนเมษายน:

# ~/.config/pip/pip.conf  
[install]  
uploaded-prior-to = P3D  

> ⚠️ cooldown ไม่ใช่คำตอบสำหรับทุกอย่าง หากจำเป็นต้องติดตั้ง security patch ก็ควรติดตั้งทันที ดังนั้นควรใช้ร่วมกับเครื่องมือสแกนช่องโหว่อย่าง Dependabot หรือ Renovate

2. การล็อก dependency (Lock Files)

pip freeze ที่บันทึกแค่เวอร์ชัน ไม่ใช่ lock file เพื่อความปลอดภัย จำเป็นต้องใช้ lock file ที่แท้จริงซึ่ง มี checksum/hash รวมอยู่ด้วย

เครื่องมือที่แนะนำ:

  • uv lock
  • pip-compile --generate-hashes
  • pipenv

🔒 คำแนะนำด้านความปลอดภัยสำหรับผู้ดูแลโอเพนซอร์ส

1. เสริมความปลอดภัยให้ release workflow

  • ห้ามใช้ trigger ที่ไม่ปลอดภัยpull_request_target ของ GitHub Actions อันตรายเป็นพิเศษ
  • ทำให้พารามิเตอร์และค่าที่รับเข้าเป็นกลาง — ส่งผ่าน environment variable เพื่อป้องกัน template injection
  • ห้ามใช้ mutable reference — ใช้ commit SHA แทน Git tag และคง lock file ของ dependency ไว้
  • ตั้งค่าการเผยแพร่ให้ต้องมีการตรวจทาน — ใช้ Trusted Publishers ร่วมกับ GitHub Environments เพื่อให้ต้องมีการอนุมัติเพิ่มเติมตอนเผยแพร่

หากใช้ GitHub Actions แนะนำให้ตรวจสอบช่องโหว่ของ workflow ด้วยเครื่องมือ Zizmor

2. ใช้ Trusted Publishers แทน API token

  • API token มีอายุ ยาวนาน ทำให้หากถูกขโมยจะตรวจจับได้ยากในทันที
  • Trusted Publishers ใช้ โทเค็นอายุสั้น จึงมีความเสี่ยงต่ำกว่า เพราะแม้ถูกขโมยก็ต้องถูกนำไปใช้ทันที
  • ผ่าน Digital Attestations ผู้ใช้ปลายทางสามารถตรวจจับการเผยแพร่ที่ไม่ได้ผ่าน release workflow ที่ถูกต้องได้

3. บังคับใช้ 2FA

PyPI บังคับให้ใช้ 2FA สำหรับการเผยแพร่แพ็กเกจตั้งแต่ปี 2024 แต่ควรใช้ 2FA (หากเป็นไปได้ให้ใช้ hardware key) กับ ทุกบัญชี ที่เกี่ยวข้องกับการพัฒนาโอเพนซอร์ส ไม่ใช่แค่ บัญชี PyPI เท่านั้น แต่รวมถึง GitHub, GitLab, อีเมล และอื่น ๆ


💰 หากต้องการสนับสนุนกิจกรรมนี้

งานด้านความปลอดภัยของ PyPI เกิดขึ้นได้ด้วยการสนับสนุนจาก Python Software Foundation(PSF) สามารถสนับสนุนผ่านโปรแกรมสปอนเซอร์ของ PSF, บริจาคโดยตรง หรือสอบถามได้ที่ sponsors@python.org

> ตำแหน่งวิศวกรความปลอดภัย PyPI ของ Mike Fiedler และ Seth Larson ได้รับการสนับสนุนจาก Alpha-Omega

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

 
yjcho9317 21 일 전

ผมลองทำเซิร์ฟเวอร์ MCP แล้วอัปขึ้น npm ดู พอมาอ่านรายงานเหตุการณ์นี้แล้วรู้สึกขนลุกเหมือนกันครับ。

สุดท้ายแล้วเซิร์ฟเวอร์ MCP ก็ถูกอัปขึ้น npm, PyPI ตรง ๆ อยู่ดี และก็มีไม่น้อยเลยที่ติดตั้งกันแบบไม่ตรึงเวอร์ชัน แถมระบบแจ้งรายงานหรืออะไรอย่าง trusted publisher ก็ยังไม่มีด้วย ถึง LiteLLM จะเปิดช่องอยู่แค่สองชั่วโมงนิด ๆ แต่ถ้ายอดดาวน์โหลดได้ขนาดนั้น ก็ทำให้รู้สึกว่าฝั่งนี้ถ้าโดนเจาะเข้ามาครั้งหนึ่งแล้วคงอยู่ได้นานพอสมควรเลยครับ。

ฝั่ง Claude Code เองพอดูแล้วก็เห็นว่าตอน pip install บางทีก็ไม่ได้เปิดการตั้งค่าป้องกันพวกนี้ไว้อย่างถูกต้องเหมือนกัน ถ้าเป็นโฟลว์ที่เอเจนต์ติดตั้งแพ็กเกจให้เองเลย ก็ยังไม่ชัดว่าควรไปบล็อกกันตรงไหนครับ。