มีการเผยแพร่เวอร์ชันอันตรายของ Nx และปลั๊กอินที่รองรับบางตัว
(github.com/nrwl)- มีการเผยแพร่เวอร์ชันอันตรายของ แพ็กเกจ Nx และปลั๊กอิน ไปยัง npm โดยทำการสแกนระบบไฟล์ รวบรวม ข้อมูลรับรอง แล้วส่งไปยังรีโพซิทอรีในบัญชี Github ของผู้ใช้
- หากต้องการตรวจสอบว่าได้รับผลกระทบหรือไม่ ต้องตรวจสอบว่ามีการสร้าง รีโพซิทอรี s1ngularity-repository ในบัญชี Github หรือไม่
- หากติดเชื้อ จำเป็นต้อง เปลี่ยนโทเค็นและรหัสผ่าน ลบรีโพซิทอรีอันตราย และตรวจสอบไฟล์ตั้งค่าเชลล์ โดยทันที
- เวอร์ชันอันตรายส่งผลต่อระบบผ่าน สคริปต์ postinstall และมีความเสี่ยงที่จะถูกรันโดยไม่รู้ตัวเพิ่มขึ้น โดยเฉพาะเมื่อใช้งานปลั๊กอิน VSCode Nx Console
- ฝั่ง Nx ได้ดำเนินการ ป้องกันการเกิดซ้ำและเพิ่มมาตรการความปลอดภัย แล้ว และเวอร์ชันที่เกี่ยวข้องถูกลบออกจาก npm แล้ว
ภาพรวมและสรุป
- คำแนะนำด้านความปลอดภัยครั้งนี้เกี่ยวข้องกับการโจมตีแบบ supply chain ร้ายแรงต่อ แพ็กเกจ Nx และปลั๊กอินที่เกี่ยวข้องบางส่วน โดยมีการเผยแพร่โค้ดอันตรายผ่าน npm
- เวอร์ชันอันตรายดังกล่าวจะ สแกนระบบไฟล์ ของผู้ใช้เพื่อรวบรวมข้อมูลรับรอง พาธ และข้อมูลอื่น ๆ แล้วอัปโหลดไปยังรีโพซิทอรี Github (s1ngularity-repository)
- สคริปต์ postinstall อันตรายยังแก้ไขไฟล์ตั้งค่าเชลล์ของผู้ใช้ (.zshrc, .bashrc) เพื่อเพิ่มคำสั่งปิดระบบเข้าไป
- มีการสรุปอย่างละเอียดถึงช่องทางการโจมตีและลำดับการโจมตี เวอร์ชันที่ได้รับผลกระทบ มาตรการเร่งด่วนที่ผู้ใช้ควรทำ และแนวทางป้องกันไม่ให้เกิดซ้ำ
วิธีดำเนินการเร่งด่วน
สิ่งที่ทุกคนต้องตรวจสอบ
- ตรวจสอบในรายการรีโพซิทอรีของบัญชี Github ของตนว่ามีการสร้าง s1ngularity-repository หรือไม่
- ดาวน์โหลดไฟล์ที่อยู่ในรีโพซิทอรีนั้นเพื่อเก็บไว้เป็นหลักฐาน
- ลบรีโพซิทอรีออกจาก Github
- ส่งอีเมลไปที่ security@nrwl.io เพื่อขอคำแนะนำวิธีถอดรหัสข้อมูลที่รั่วไหล
- เปลี่ยนข้อมูลรับรองและโทเค็นของทุกบัญชีทันที
วิธีเปลี่ยน Github token
- ไปที่ https://github.com/settings/connections/…
- เพิกถอนสิทธิ์การเข้าถึงของแอปที่เชื่อมต่อเพื่อทำให้โทเค็นเดิมใช้งานไม่ได้
- หากใช้ gh CLI ให้ยืนยันตัวตนใหม่เพื่อสร้างโทเค็นใหม่
- หากไม่ดำเนินการ โทเค็นเดิมอาจถูกนำไปใช้ในทางที่ผิด
หยุดใช้และจัดการเวอร์ชัน Nx ที่เป็นอันตราย
- ตรวจสอบว่าเวอร์ชัน Nx ที่ใช้อยู่เป็นเวอร์ชันอันตรายหรือไม่ด้วยคำสั่ง
npm ls nx - หากเป็นเวอร์ชันที่ติดเชื้อ ให้อัปเดตด้วย
npm uninstall nx && npm install nx@latest - ล้างแคชด้วย
npm cache clean --force
ผู้ใช้ที่ติดเชื้อแล้ว
- เปลี่ยน npm และ Github token
- รีเซ็ตรหัสผ่านและข้อมูลรับรองทั้งหมดของ Github และบริการที่เกี่ยวข้อง
- ตรวจสอบไฟล์
.zshrc,.bashrcว่ามีการแทรกคำสั่งแปลกปลอมหรือไม่ แล้วลบออก
กรณีเป็นผู้ดูแลรีโพซิทอรีแพ็กเกจภายในองค์กร
- จำเป็นต้องลบเวอร์ชันอันตรายออกจาก proxy ใน registry ภายในองค์กรทันทีเพื่อป้องกันการแพร่กระจายเพิ่มเติม
เวอร์ชันที่ได้รับผลกระทบ
แพ็กเกจ Nx
- 21.5.0, 20.9.0, 20.10.0, 21.6.0, 20.11.0, 21.7.0, 21.8.0, 20.12.0
- ถูกลบออกจาก npm แล้ว ณ เวลา 10:44 PM EDT
@nx/devkit, @nx/js, @nx/workspace, @nx/node, @nx/eslint, @nx/key, @nx/enterprise-cloud
- ถูกลบออกจาก npm แล้ว ณ เวลา 10:44 PM, 6:20 AM EDT
รายละเอียดช่องทางการโจมตี
สาเหตุของ Workflow ที่มีช่องโหว่
- มีการนำ ช่องโหว่ที่ทำให้รันโค้ดตามอำเภอใจได้ เข้ามาใน workflow ของ Github Actions
- หากแทรก bash code บางอย่างลงในชื่อ PR จะเกิดช่องโหว่ที่ทำให้ workflow รันคำสั่งระบบได้ (Bash Injection)
- มีการนำไปใช้ผ่าน trigger
pull_request_targetซึ่งทำให้ได้สิทธิ์ที่สูงขึ้น เช่นGITHUB_TOKEN - ก่อนถูกลบ workflow ที่มีช่องโหว่ยังคงอยู่ใน branch เก่าที่ไม่ใช่ main ทำให้ผู้โจมตีสามารถรัน workflow ผ่าน PR อันตรายและขโมย secrets ได้สำเร็จ
กระบวนการขโมย npm token
- บังคับให้มีการรัน
publish.ymlผ่าน workflow ที่มีช่องโหว่ publish.ymlเก็บ npm token ไว้ใน Github Secrets และในขั้นตอนนี้มีการส่งโทเค็นออกไปยัง webhook ภายนอก- ท้ายที่สุดผู้โจมตีใช้โทเค็นนี้อัปโหลดเวอร์ชันอันตรายของ Nx และแพ็กเกจที่รองรับไปยัง npm
พฤติกรรมของแพ็กเกจอันตราย
รวบรวมข้อมูลรวมถึงข้อมูลรับรองและเผยแพร่ไปยังรีโพซิทอรี Github
- เมื่อสคริปต์ postinstall ของแพ็กเกจ Nx ที่ติดเชื้อทำงาน จะมีการรวบรวมตำแหน่งของไฟล์ข้อความต่าง ๆ และข้อมูลรับรอง
- เข้ารหัสเป็น base64 แล้วอัปโหลดไปยังรีโพซิทอรี Github ชื่อ s1ngularity-repository
- แม้รีโพซิทอรีจริงจะถูกลบไปแล้ว แต่ก่อนหน้านี้เคยเป็นสาธารณะ จึงต้องคำนึงถึงความเป็นไปได้ของข้อมูลรั่วไหล
การแก้ไข shell profile (.zshrc, .bashrc)
- postinstall แทรกคำสั่ง
sudo shutdown -h 0เพื่อทำให้ระบบปิดเมื่อเปิดเทอร์มินัล และอาจทำให้รหัสผ่านรั่วไหลได้
สถานการณ์หลากหลายที่ postinstall สามารถทำงานได้
-
นอกจากการรัน
npm install/yarn/pnpm installโดยตรงแล้ว ยังสามารถทำงานได้ในหลายสถานการณ์ เช่น transitive dependency, ส่วนขยาย editor, การรันสคริปต์ -
โดยเฉพาะส่วนขยาย Nx Console สำหรับ VSCode (เวอร์ชัน 18.6.30 ~ 18.65.1) อาจติดตั้ง
nx@latestอัตโนมัติเมื่อเปิด editor และทำให้ postinstall ทำงาน -
โดยพื้นฐานแล้วต้องระวังว่าอาจมีการติดตั้งโมดูล NPM ในหลายจุดแม้ไม่ได้ตั้งใจ
-
ตั้งแต่ Nx Console (18.66.0) เป็นต้นไป กระบวนการติดตั้ง latest nx ถูกลบออกแล้ว
ไทม์ไลน์การโจมตีและการตอบสนอง
21 สิงหาคม
- 4:31 PM: PR ที่มีช่องโหว่ Bash injection ถูก merge
- 10:48 PM: โพสต์ชี้ช่องโหว่ถูกเผยแพร่บน X (เดิมคือ Twitter)
22 สิงหาคม
- ช่วงบ่าย: เริ่มการสอบสวนภายใน และ rollback workflow ที่มีช่องโหว่ (ยังไม่สมบูรณ์)
- มีการนำ CodeQL มาใช้เพื่อตรวจจับช่องโหว่ลักษณะเดียวกันใน PR ต่อไป
24 สิงหาคม
- มี commit ใน fork ของผู้โจมตีที่บ่งชี้ว่ามีการรั่วไหลของ npm token
- มีการสร้างและลบ PR อันตราย และ
publish.ymlถูกรันโดย PR นี้
26 ~ 27 สิงหาคม (เผยแพร่เวอร์ชันอันตรายและตอบสนอง)
- มีการเผยแพร่เวอร์ชันอันตรายของ Nx และปลั๊กอินหลายเวอร์ชันไปยัง npm ตามลำดับ
- มีการรายงาน issue ไปยังชุมชน Github/NPM
- 10:44 PM: ฝั่ง NPM ดำเนินการลบเวอร์ชันดังกล่าวทั้งหมดและมาตรการอื่น ๆ
- 11:57 PM: โทเค็นสำหรับเผยแพร่แพ็กเกจที่เกี่ยวข้องกับ Nx ทั้งหมดถูกทำให้ใช้งานไม่ได้
- 27 สิงหาคม: ออกแพตช์ Nx Console, เปิดใช้ 2FA, เปลี่ยนไปใช้ Trusted Publisher และมาตรการเพิ่มเติมอื่น ๆ
มาตรการป้องกันล่วงหน้าและการตอบสนองหลังจากนี้
- บังคับใช้ 2FA กับ maintainer ทุกคนในองค์กร nrwl
- ใช้กลไก Trusted Publisher ห้าม deploy แบบใช้ npm token
- แพ็กเกจในอนาคตจะเผยแพร่หลังผ่านการตรวจสอบด้วย 2FA และกลไกความน่าเชื่อถือเท่านั้น
- จะทยอยเพิ่มมาตรการตรวจจับความเสี่ยงเพิ่มเติม การอนุมัติ PR การป้องกัน branch และขั้นตอนอื่น ๆ
บทเรียนและแผนในอนาคต
- เป็นการตอกย้ำความสำคัญทั้งในและต่างประเทศของ supply chain, CI/CD pipeline และการจำกัดสิทธิ์ของ workflow ให้เหลือน้อยที่สุด
- หลังทบทวนภายในทีมแล้ว มีแผนจะแชร์สิ่งที่ได้เรียนรู้กับชุมชน
ช่องทางติดต่อ
- สามารถติดต่อได้ที่ security@nrwl.io
อ้างอิงและภาคผนวก
- มี issue สำคัญของ Github, ไทม์ไลน์ และโพสต์ที่เกี่ยวข้อง
- มีตัวอย่างสคริปต์
telemetry.jsภายในแพ็กเกจที่ติดเชื้อ - สคริปต์นี้รวบรวมพาธของไฟล์ข้อความสำคัญในระบบไฟล์เพื่อสร้าง inventory
สรุปท้ายเรื่อง
- ควรอัปเดตและติดตั้งแพตช์ล่าสุดของ Nx และปลั๊กอินที่เกี่ยวข้อง
- แนะนำให้เปลี่ยนข้อมูลยืนยันตัวตนสำคัญ เช่น npm, Github ทันที
- เหตุการณ์นี้เตือนให้เห็นว่าความหละหลวมด้าน supply chain security และการจัดการสิทธิ์ของ workflow อาจนำไปสู่เหตุร้ายแรงขนาดใหญ่ได้
ยังไม่มีความคิดเห็น