สรุปสั้น

GitHub ประกาศว่า npm เวอร์ชัน 12 ซึ่งคาดว่าจะเปิดตัวในเดือนกรกฎาคม 2569 จะเปลี่ยนพฤติกรรมสำคัญในการรันสคริปต์ โดยคำสั่ง npm install จะไม่รันสคริปต์ preinstall, install หรือ postinstall จาก dependency อีกต่อไป ยกเว้นได้รับอนุญาตอย่างชัดแจ้งจากนักพัฒนาในไฟล์ package.json การเปลี่ยนแปลงนี้เป็นการตอบโต้คลื่นการโจมตี supply chain ที่ถล่มอีโคซิสเต็ม npm ในช่วงหลายเดือนที่ผ่านมา โดยเฉพาะเหตุการณ์ที่เกี่ยวข้องกับ TeamPCP และเวิร์ม Shai-Hulud ที่แพร่กระจายตัวเองได้

การเปลี่ยนแปลงครอบคลุมถึง native node-gyp builds อย่างแพ็กเกจที่มี binding.gyp (ซึ่งเป็นช่องทางที่เวิร์ม Shai-Hulud Miasma ใช้โจมตี) รวมถึง prepare scripts จาก git, file และ link dependencies นอกจากนี้ Git dependencies จะไม่ถูก resolve ที่ npm install อีกต่อไป เพื่อปิดช่องทางที่ไฟล์ .npmrc ของ Git dependency อาจ override Git executable ได้ นักพัฒนาสามารถเตรียมตัวล่วงหน้าด้วย npm เวอร์ชัน 11.16.0 ขึ้นไป ซึ่งจะแสดงคำเตือนเมื่อมีการรันสคริปต์

รายละเอียดข่าว

เว็บไซต์ SecurityWeek รายงานเมื่อวันที่ 13 มิถุนายน พ.ศ. 2569 ว่า GitHub ประกาศการเปลี่ยนแปลงครั้งใหญ่ใน npm เวอร์ชัน 12 เพื่อรับมือกับการโจมตี supply chain ที่ทวีความรุนแรงในอีโคซิสเต็ม npm เหตุการณ์สำคัญหลายครั้งที่เกิดขึ้นเมื่อไม่นานมานี้ โดยเฉพาะกลุ่ม TeamPCP และเวิร์ม Shai-Hulud ที่แพร่กระจายตัวเองได้ ล้วนอาศัยพฤติกรรมเดิมของ npm ที่รันสคริปต์จาก dependency อัตโนมัติระหว่าง npm install เพื่อแพร่มัลแวร์ไปยังเครื่องนักพัฒนาหลายพันคน

ตั้งแต่ npm 12 เป็นต้นไป คำสั่ง npm install จะไม่รันสคริปต์ preinstall, install หรือ postinstall จาก dependency เว้นแต่ได้รับอนุญาตอย่างชัดแจ้ง การเปลี่ยนแปลงนี้ยังกระทบ native node-gyp builds รวมถึงแพ็กเกจที่มี binding.gyp โดยไม่มี install script อย่างชัดเจน ซึ่งเป็นช่องทางที่การโจมตี Shai-Hulud Miasma ใช้อาวุธ binding.gyp เป็นตัวนำ

GitHub แนะนำให้นักพัฒนาอัปเกรดเป็น npm 11.16.0 ขึ้นไป แล้วรันคำสั่ง npm approve-scripts --allow-scripts-pending เพื่อตรวจสอบว่าแพ็กเกจใดมีสคริปต์ จากนั้นอนุมัติเฉพาะที่เชื่อถือได้และบล็อกที่เหลือ โดย allowlist จะถูกเขียนลงใน package.json

รายละเอียดการเปลี่ยนแปลง

การเปลี่ยนแปลงใน npm 12 มีหลายด้าน ประการแรก สคริปต์ preinstall, install และ postinstall จาก dependency ทั้งหมดจะถูกบล็อกโดยค่าเริ่มต้น ประการที่สอง Git dependencies (ทั้ง direct และ transitive) จะไม่ถูก resolve ที่ npm install อีกต่อไป เว้นแต่ได้รับอนุญาตชัดแจ้ง ซึ่งปิดช่องทางที่ไฟล์ .npmrc ของ Git dependency อาจ override Git executable ได้แม้จะใช้ –ignore-scripts

ประการที่สาม dependency จาก remote URL (รวมถึง HTTPS tarballs ทั้ง direct และ transitive) จะไม่ถูก resolve เช่นกัน นักพัฒนาสามารถอนุญาตผ่าน flag –allow-remote ที่เปิดให้ใช้ตั้งแต่เวอร์ชัน 11.15.0 ทุกการเปลี่ยนแปลงมุ่งเป้าปิดช่องทาง code execution ที่ผู้โจมตีใช้ฝัง payload ในแพ็กเกจ npm

ผลกระทบต่อไทย

นักพัฒนาซอฟต์แวร์ไทยที่ใช้ npm เป็นตัวจัดการแพ็กเกจหลักจะได้รับผลกระทบโดยตรงจากการเปลี่ยนแปลงนี้ โปรเจกต์ที่พึ่งพาแพ็กเกจที่มี install script อาจเกิดปัญหาหลังอัปเกรดเป็น npm 12 หากไม่ได้เตรียมตัว อย่างไรก็ตามการเปลี่ยนแปลงนี้เป็นข่าวดีในแง่ความปลอดภัย เพราะช่วยป้องกันการโจมตี supply chain ที่เคยส่งผลกระทบกว้างขวาง รวมถึงเหตุการณ์ Miasma ที่ปนเปื้อนแพ็กเกจของ Red Hat และ Microsoft บน GitHub มาแล้ว

คำแนะนำ

  • อัปเกรดเป็น npm 11.16.0 ขึ้นไปทันทีเพื่อเริ่มเห็นคำเตือนเกี่ยวกับสคริปต์ที่รันอัตโนมัติ
  • รันคำสั่ง npm approve-scripts --allow-scripts-pending เพื่อตรวจสอบแพ็กเกจที่มีสคริปต์ แล้วอนุมัติเฉพาะที่เชื่อถือได้
  • commit ไฟล์ package.json ที่อัปเดต allowlist แล้วเพื่อให้ทีมใช้ร่วมกัน
  • ทดสอบ CI/CD pipeline กับ npm 12 ก่อนเปิดตัวจริงในเดือนกรกฎาคม เพื่อระบุแพ็กเกจที่อาจเกิดปัญหา

แหล่งอ้างอิง