- มีเหตุการณ์ที่แพ็กเกจ npm จำนวนมากซึ่งมี @ctrl/tinycolor แบบโอเพนซอร์สรวมอยู่ ถูกติดมัลแวร์เวอร์ชันอันตราย โดยสาเหตุมาจากการ ขโมย npm token ผ่าน GitHub Actions workflow ในรีโพซิทอรีที่ใช้ทำงานร่วมกัน
- ผู้โจมตีใช้ npm token ที่มีสิทธิ์กว้างในการเผยแพร่โค้ดอันตรายไปยังประมาณ 20 แพ็กเกจ และในนั้น @ctrl/tinycolor มีจำนวนดาวน์โหลดรายสัปดาห์สูงถึง 2 ล้านครั้ง จึงมีผลกระทบสูง
- เวอร์ชันที่ติดมัลแวร์จะรันเพย์โหลดอันตรายในขั้นตอน postinstall และทีมความปลอดภัยของ GitHub กับ npm ได้ตอบสนองอย่างรวดเร็วด้วยการลบและจัดการกู้คืน
- ผู้เขียนได้จัดทำแผนยกระดับความปลอดภัยเพื่อป้องกันการเกิดซ้ำ เช่น การย้ายไปใช้ Trusted Publishing(OIDC), การลดสิทธิ์ของโทเค็นให้เหลือน้อยที่สุด, การบังคับใช้ 2FA และการใช้ความสามารถของ pnpm
- เหตุการณ์ครั้งนี้แสดงให้เห็นถึง ความเปราะบางของความปลอดภัยซัพพลายเชนซอฟต์แวร์ และเป็นกรณีตัวอย่างที่ชี้ถึงความจำเป็นในการปรับปรุงฟีเจอร์ด้านความปลอดภัยและแนวปฏิบัติด้านความปลอดภัยของระบบนิเวศ npm โดยรวม
TL;DR
- เกิดเหตุ GitHub Actions workflow อันตรายถูกพุชเข้าไปยังรีโพซิทอรีที่ใช้ร่วมกันเพื่อ ขโมย npm token
- ผู้โจมตีใช้โทเค็นดังกล่าวเผยแพร่ เวอร์ชันอันตรายของ 20 แพ็กเกจ และในนั้น @ctrl/tinycolor มีจำนวนดาวน์โหลดสูงจึงมีผลกระทบในวงกว้าง
- ไม่มีการเจาะบัญชีส่วนตัวหรือรีโพซิทอรีโดยตรง และไม่มีการฟิชชิงหรือการติดตั้งมัลแวร์ในเครื่องของผู้เขียน
- ด้วยการตอบสนองอย่างรวดเร็วของทีมความปลอดภัย GitHub/npm เวอร์ชันอันตรายจึงถูกลบออก และหลังจากนั้นได้เผยแพร่เวอร์ชันสะอาดใหม่อีกครั้งเพื่อจัดการแคช
ลำดับการค้นพบเหตุการณ์ (How I Found Out)
- ช่วงบ่ายของวันที่ 15 กันยายน สมาชิกชุมชน Wes Todd แจ้งปัญหาผ่าน Bluesky DM
- ตอนนั้นทีมความปลอดภัยของ GitHub/npm ได้เริ่มรวบรวมรายชื่อแพ็กเกจที่ได้รับผลกระทบและดำเนินการลบแล้ว
- เบาะแสแรกที่ถูกแชร์คือชื่อแบรนช์อันตรายว่า 'Shai-Hulud' ซึ่งเป็นชื่อ sandworm จากจักรวาล Dune
สิ่งที่เกิดขึ้นจริง (What Actually Happened)
- มีผู้ร่วมงานจากรีโพซิทอรี angulartics2 ที่เคยทำงานร่วมกันมานานแล้วและยังคงมีสิทธิ์ระดับแอดมินอยู่
- npm token ที่เก็บไว้ในรีโพซิทอรีนั้นถูกขโมยโดย GitHub Actions workflow อันตราย
- ผู้โจมตีใช้โทเค็นนี้เผยแพร่แพ็กเกจประมาณ 20 รายการ รวมถึง @ctrl/tinycolor
- ทีมความปลอดภัย GitHub/npm ลบเวอร์ชันอันตรายอย่างรวดเร็ว และผู้เขียนก็เผยแพร่เวอร์ชันใหม่ที่เชื่อถือได้อีกครั้ง
ผลกระทบ (Impact)
- เมื่อติดตั้งเวอร์ชันอันตราย สคริปต์ postinstall จะถูกรันและก่อให้เกิดความเสี่ยงด้านความปลอดภัย
- แนะนำให้ผู้ใช้ที่ได้รับผลกระทบอ้างอิง แนวทางตอบสนองทันที ของ StepSecurity
สภาพแวดล้อมการเผยแพร่และแผนรับมือ (Publishing Setup & Interim Plan)
- เดิมใช้การเผยแพร่อัตโนมัติด้วยชุด semantic-release + GitHub Actions
- แม้จะใช้ฟีเจอร์ npm provenance แต่ก็ไม่สามารถหยุดผู้โจมตีที่มีโทเค็นถูกต้องได้
- ต่อจากนี้มีแผนจะนำ Trusted Publishing(OIDC) มาใช้เพื่อตัด static token ออก
- ขณะนี้ได้เพิกถอนโทเค็นทั้งหมดแล้ว และกำลังใช้มาตรการความปลอดภัยเพิ่มเติม เช่น บังคับ 2FA, อนุญาตเฉพาะโทเค็นสิทธิ์แบบ granular และพิจารณาฟีเจอร์ minimumReleaseAge ของ pnpm
แนวทางปรับปรุงที่อยากเห็น (Publishing Wishlist)
- ควรมีตัวเลือกบังคับใช้ OIDC-based Trusted Publishing ในระดับบัญชี npm
- ต้องมีความสามารถในการบล็อกการเผยแพร่เมื่อไม่มี provenance และรองรับการผสาน semantic-release กับ OIDC อย่างสมบูรณ์
- อยากให้ GitHub UI มีฟีเจอร์ การอนุมัติการเผยแพร่แบบแมนนวลด้วย 2FA
- ควรสามารถใช้การป้องกันระดับ GitHub Environments ได้แม้ไม่มีการสมัคร Pro
- ในหน้าของแพ็กเกจ npm ควรมี การแสดงว่ามีสคริปต์ postinstall หรือไม่ และเปิดเผยเหตุผลของเวอร์ชันที่ถูกลบ
ยังไม่มีความคิดเห็น