ภัยคุกคามการพึ่งพาที่ซ่อนเร้นของ NPM เผยให้เห็นวิกฤตความปลอดภัยในซัพพลายเชน

ทีมชุมชน BigGo
ภัยคุกคามการพึ่งพาที่ซ่อนเร้นของ NPM เผยให้เห็นวิกฤตความปลอดภัยในซัพพลายเชน

ชุมชนนักพัฒนา JavaScript กำลังเผชิญกับวิกฤตความปลอดภัยที่โจมตีหัวใจของแนวทางการพัฒนาซอฟต์แวร์สมัยใหม่ แคมเปญล่าสุดที่มีชื่อว่า PhantomRaven ได้เปิดเผยช่องโหว่ร้ายแรงในระบบการจัดการการพึ่งพาของ NPM ทำให้เกิดคำถามเร่งด่วนเกี่ยวกับความปลอดภัยของระบบนิเวศ JavaScript ทั้งหมด ขณะที่นักพัฒนากำลังต่อสู้กับผลกระทบที่ตามมา เหตุการณ์นี้ได้เผยให้เห็นปัญหาทางระบบที่ลึกซึ้งยิ่งกว่าการตรวจจับมัลแวร์ทั่วไป

เทคนิคการโจมตีของ PhantomRaven

ผู้โจมตี PhantomRaven ค้นพบและใช้ประโยชน์จากคุณลักษณะของ NPM ที่รู้จักกันน้อยชื่อว่า Remote Dynamic Dependencies (RDD) ซึ่งอนุญาตให้แพ็กเกจสามารถดาวน์โหลดและรันโค้ดจากแหล่งภายนอกที่ไม่ได้ผ่านการตรวจสอบโดยอัตโนมัติระหว่างการติดตั้ง สิ่งนี้สร้างเวกเตอร์การโจมตีที่มองไม่เห็นซึ่งเลี่ยงเครื่องมือสแกนความปลอดภัยแบบดั้งเดิม แพ็กเกจที่เป็นอันตรายจะไม่แสดงการพึ่งพาใดๆ ในไฟล์ package.json ทำให้พวกมันดูสะอาดสำหรับเครื่องมือวิเคราะห์แบบสถิต แต่แทนที่พวกมันจะไปดึงข้อมูลที่เป็นเป้าหมายการโจมตีจากเซิร์ฟเวอร์ระยะไกลในเวลาติดตั้ง สร้างสิ่งที่นักวิจัยความปลอดภัยอธิบายว่าจุดบอดในการจัดการการพึ่งพา

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

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

เวกเตอร์การโจมตีทั่วไปในระบบนิเวศของแพ็กเกจ

  • Remote Dynamic Dependencies (RDD)
  • การรันสคริปต์ในวงจรชีวิต (preinstall, postinstall)
  • Typosquatting และ dependency confusion
  • ชื่อแพ็กเกจที่ถูกสร้างขึ้นโดย AI
  • บัญชีผู้ดูแลระบบที่ถูกบุกรุก
  • การอัปเดตที่เป็นอันตรายต่อแพ็กเกจที่ถูกต้องตามกฎหมาย

การตอบสนองของชุมชนและกลยุทธ์การลดความเสี่ยง

นักพัฒนากำลังตอบสนองด้วยทั้งการแก้ไขปัญหาเฉพาะหน้าและการเปลี่ยนแปลงเชิงกลยุทธ์ระยะยาว หลายคนกำลังนำแนวทางการใช้คอนเทนเนอร์มาใช้ โดยรันคำสั่ง NPM ภายใน Docker containers เพื่อจำกัดความเสียหายที่อาจเกิดขึ้นจากแพ็กเกจที่เป็นอันตราย แนวทางนี้จำกัดการติดตั้งแพ็กเกจให้อยู่เฉพาะในไดเรกทอรีปัจจุบันเท่านั้น ป้องกันการเข้าถึงไฟล์ระบบ, ตัวแปรสภาพแวดล้อม และข้อมูลรับรอง บางคนเปลี่ยนไปใช้ตัวจัดการแพ็กเกจทางเลือกเช่น pnpm ซึ่งปิดใช้งานสคริปต์วงจรชีวิตโดยค่าเริ่มต้นและต้องการการอนุญาตอย่างชัดเจนสำหรับแพ็กเกจที่เชื่อถือได้

การอภิปรายเผยให้เห็นความตึงเครียดพื้นฐานระหว่างความสะดวกสบายและความปลอดภัย นักพัฒนาบางคนสนับสนุนการลดการพึ่งพาในระดับรากฐาน โดยตั้งคำถามว่าทำไมโปรเจกต์จึงต้องการแพ็กเกจภายนอกหลายร้อยหรือหลายพันแพ็กเกจ บางคนชี้ให้เห็นถึงความเป็นจริงในทางปฏิบัติที่เวิร์กโฟลว์การพัฒนาสมัยใหม่ทำให้การใช้งานการพึ่งพาอย่างกว้างขวางเป็นสิ่งที่หลีกเลี่ยงไม่ได้ การสนทนาได้ขยายเกินกว่าการปฏิบัติส่วนบุคคลไปสู่นโยบายขององค์กร โดยทีมต่างๆ กำลังถกเถียงกันว่าจะบังคับใช้การเปลี่ยนแปลงด้านความปลอดภัย across all developers และ CI systems หรือมุ่งเน้นไปที่มาตรการป้องกันส่วนบุคคล

การเปรียบเทียบฟีเจอร์ด้านความปลอดภัยของ Package Manager

Manager Lifecycle Scripts Default Sandboxing Trust Whitelisting
npm เปิดใช้งานโดยค่าเริ่มต้น ไม่มี ไม่มี
pnpm ปิดใช้งานโดยค่าเริ่มต้น ไม่มี มี
Bun ปิดใช้งานโดยค่าเริ่มต้น บางส่วน มี
Docker approach แตกต่างกันไป แยกส่วนอย่างสมบูรณ์ ตั้งค่าด้วยตนเอง

ผลกระทบในระดับระบบนิเวศ

เหตุการณ์ PhantomRaven เน้นย้ำถึงช่องโหว่ที่ส่งผลกระทบไม่เพียงแต่ NPM เท่านั้น แต่ยังอาจส่งผลต่อระบบนิเวศของแพ็กเกจใดๆ ที่อนุญาตให้เผยแพร่โค้ดที่ไม่ได้ผ่านการตรวจสอบ อย่างไรก็ตาม ลักษณะเฉพาะของระบบนิเวศ JavaScript — การใช้ไมโครดีเพนเดนซีอย่างแพร่หลาย, การรันสคริปต์อัตโนมัติ, และต้นไม้การพึ่งพาขนาดใหญ่ — ทำให้มันมีความเสี่ยงเป็นพิเศษ นักพัฒนาชี้ให้เห็นว่าความเสี่ยงที่คล้ายกันมีอยู่ในระบบนิเวศอื่นๆ เช่น PyPI และ Cargo แต่ความนิยมและการตัดสินใจในการออกแบบของ NPM ทำให้ภัยคุกคามทวีความรุนแรงมากขึ้น

การโจมตีโดยใช้ชื่อแพ็กเกจที่ AI สร้างขึ้นแบบมโนภาพเพิ่มความกังวลในอีกระดับหนึ่ง เมื่อนักพัฒนาพึ่งพาผู้ช่วย AI มากขึ้นเพื่อขอความช่วยเหลือในการเขียนโค้ด พวกเขาอาจติดตั้งแพ็กเกจที่ไม่มีอยู่จริงในรูปแบบที่ถูกต้องแต่ถูกแนะนำโดยโมเดล AI โดยไม่รู้ตัว สิ่งนี้สร้างพื้นผิวการโจมตีใหม่ที่ผู้โจมตีที่เป็นอันตรายสามารถทำนายและลงทะเบียนชื่อแพ็กเกจที่เครื่องมือ AI มีแนวโน้มจะแนะนำ จากนั้นทำให้พวกมันเป็นอาวุธผ่านเทคนิคต่างๆ เช่น ระบบการพึ่งพาระยะไกลของ PhantomRaven

สถิติแคมเปญ PhantomRaven

  • ตระหนักพบแพ็คเกจที่เป็นอันตราย 126 แพ็คเกจ
  • มีการดาวน์โหลดมากกว่า 86,000 ครั้ง
  • แพ็คเกจที่ยังคงพร้อมใช้งาน ณ เวลาที่ตรวจพบ 80 แพ็คเกจ
  • ระยะเวลาการโจมตี: ตั้งแต่เดือนสิงหาคม 2024
  • เทคนิคหลัก: Remote Dynamic Dependencies (RDD)
  • เป้าหมาย: ข้อมูลรับรองของนักพัฒนาและสภาพแวดล้อม CI/CD

อนาคตของความปลอดภัยในซัพพลายเชน

เมื่อมองไปข้างหน้า ชุมชนกำลังสำรวจแนวทางหลายๆ ด้านเพื่อเสริมสร้างความปลอดภัยของซัพพลายเชน บางคนสนับสนุนให้มีการใช้แซนด์บ็อกซ์อย่างครอบคลุมสำหรับกิจกรรมการพัฒนาทั้งหมด โดยรันทุกอย่างในคอนเทนเนอร์หรือเครื่องเสมือน บางคนผลักดันให้มีการเปลี่ยนแปลงพื้นฐานในการออกแบบตัวจัดการแพ็กเกจ โดยยกเลิกการรันสคริปต์อัตโนมัติทั้งหมด หรือต้องการการอนุมัติจากผู้ใช้อย่างชัดเจนสำหรับการรันโค้ดใดๆ ระหว่างการติดตั้ง มีความสนใจเพิ่มมากขึ้นในการเก็บ dependencies ไว้ในที่จัดเก็บ (vendoring dependencies) — การจัดเก็บโค้ดของบุคคลที่สามทั้งหมดโดยตรงในระบบควบคุมเวอร์ชัน — แม้ว่าแนวทางนี้จะมาพร้อมกับความท้าทายในการบำรุงรักษาของมันเอง

เหตุการณ์นี้ทำหน้าที่เป็นสัญญาณเตือนสำหรับอุตสาหกรรมซอฟต์แวร์ทั้งหมด ดังที่นักพัฒนาคนหนึ่งระบุว่า เราเคยอยู่ในยุคที่การไว้วางใจแบบมืดบอดก็ดีพอแล้ว และการเขียนโปรแกรมก็เป็นเรื่องเฉพาะกลุ่มพอแล้ว ยุคสมัยนั้นดูเหมือนจะสิ้นสุดลงแล้ว บังคับให้นักพัฒนา องค์กร และผู้สร้างเครื่องมือต้องทบทวนสมมติฐานพื้นฐานเกี่ยวกับการจัดการการพึ่งพาและความปลอดภัยของซัพพลายเชนอีกครั้ง วิธีแก้ปัญหาน่าจะเกี่ยวข้องกับการรวมกันของการควบคุมทางเทคนิค การเปลี่ยนแปลงกระบวนการ และการเปลี่ยนแปลงทางวัฒนธรรมไปสู่แนวทางปฏิบัติการพัฒนาที่ตระหนักถึงความปลอดภัยมากขึ้น

แคมเปญ PhantomRaven เป็นมากกว่าแค่อีกหนึ่งเหตุการณ์มัลแวร์ — มันเผยให้เห็นจุดอ่อนพื้นฐานในวิธีการที่ซอฟต์แวร์สมัยใหม่จัดการกับการพึ่งพา ขณะที่ชุมชนกำลังทำงานเพื่อจัดการกับความท้าทายเหล่านี้ การสนทนายังคงพัฒนาต่อไป โดยสร้างสมดุลระหว่างความต้องการด้านความปลอดภัยกับความเป็นจริงในทางปฏิบัติของเวิร์กโฟลว์การพัฒนาสมัยใหม่ ผลลัพธ์จะไม่เพียงแต่กำหนดรูปร่างการพัฒนา JavaScript เท่านั้น แต่ยังรวมถึงแนวทางปฏิบัติทางวิศวกรรมซอฟต์แวร์ across all languages และ ecosystems

อ้างอิง: NPM flooded with malicious packages downloaded more than 86,000 times