- ใน npm v12 ค่าดีฟอลต์ด้านความปลอดภัย ของ
npm installจะเปลี่ยนจากการรันและตีความอัตโนมัติไปเป็นรูปแบบที่ต้องอนุญาตอย่างชัดเจน และสามารถตรวจสอบล่วงหน้าได้ผ่านคำเตือนใน npm 11.16.0 ขึ้นไป - ค่าดีฟอลต์ของ
allowScriptsจะเปลี่ยนเป็นปิด ทำให้บล็อกการรันสคริปต์preinstall,install,postinstallของ dependency ที่ไม่ได้รับอนุญาตอย่างชัดเจน รวมถึงบล็อกnode-gyp rebuildแบบโดยปริยาย และสคริปต์prepareของ dependency แบบ git·file·link - สามารถใช้
npm approve-scripts --allow-scripts-pendingเพื่อตรวจสอบแพ็กเกจที่จะถูกบล็อก จากนั้นกำหนดการอนุญาตหรือบล็อกด้วยnpm approve-scriptsและnpm deny-scriptsแล้ว commit allowlist ที่สร้างขึ้นไว้ในpackage.json - ค่าดีฟอลต์ของ
--allow-gitจะเปลี่ยนเป็นnoneทำให้หยุดการตีความ direct และ transitive Git dependency ที่ไม่ได้รับอนุญาตอย่างชัดเจนด้วย--allow-git - ปิดกั้นเส้นทางการรันโค้ดที่
.npmrcของ Git dependency สามารถใช้เพื่อเขียนทับไฟล์ปฏิบัติการ Git ได้ แม้จะใช้--ignore-scriptsอยู่ก็ตาม - ค่าดีฟอลต์ของ
--allow-remoteจะเปลี่ยนเป็นnoneทำให้หยุดการตีความ dependency จาก remote URL เช่น https tarball ที่ไม่ได้รับอนุญาตอย่างชัดเจนด้วย--allow-remote - ค่าดีฟอลต์ของ
--allow-fileและ--allow-directoryจะไม่มีการเปลี่ยนแปลงใน npm v12 - ขั้นตอนการเตรียมพร้อมคืออัปเกรดเป็น npm 11.16.0 ขึ้นไป แล้วรันการติดตั้งตามปกติเพื่อตรวจสอบคำเตือน อนุมัติเฉพาะแพ็กเกจที่เชื่อถือได้ และหลังอัปเกรดจะมีเพียงสคริปต์ที่ได้รับอนุมัติเท่านั้นที่ยังคงรันต่อไป
- เอกสารที่เกี่ยวข้อง:
npm approve-scripts,npm deny-scripts,allow-scriptsconfig
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ไม่รู้เลยว่าพลาดเรื่องที่ npm ถูก GitHub เข้าซื้อกิจการไปได้ยังไง แต่จู่ๆ หลายอย่างก็เริ่มเข้าใจขึ้นมา
นึกแทบไม่ออกว่าจะมีบ้านไหนที่แย่กว่านี้สำหรับส่วนที่สำคัญขนาดนี้ของ ecosystem ของ Node
https://github.blog/news-insights/company-news/npm-is-joinin...
นี่คือ “embrace, extend, extinguish”
https://en.wikipedia.org/wiki/Embrace,_extend,_and_extinguis...
สคริปต์ postinstall ควรถูกถอดออกไปนานแล้ว และเป็นเหมือนมะเร็งของแพ็กเกจ NPM
เวลาดึงอะไรสักอย่างเข้ามา มักจะมี postinstall ที่ซ้อนลึกและไร้การควบคุมไปรันแบบสุ่มเต็มไปหมด
ไม่รู้เลยว่าใครเคยมองว่านี่เป็นความคิดที่ดี
ปกติแล้วคุณก็ต้องรันโค้ด dependency ที่แพ็กมาอยู่ดีในสักจุดหนึ่ง และส่วนใหญ่ก็รันด้วยสิทธิ์เดียวกับขั้นตอนติดตั้ง
งั้นสคริปต์ตั้งค่าแบบนี้ ต่อให้ดีหรือแย่ ก็แค่ย้ายจุดเริ่มจาก npm ไปอยู่ตรงที่เกิด
importหรือrequireถ้าทั้ง ecosystem ไม่ได้ย้ายไปสู่ สภาพแวดล้อม sandbox แบบ Deno กันหมด มันก็ดูเป็นแค่สิ่งกีดขวางเล็กๆ เท่านั้น อาจจะเป็นแผนก็ได้
ตัวอย่างที่นึกออกทันทีคือ https://www.npmjs.com/package/patch-package
หวังว่ากระแสตื่นตูมตอนนี้จะไม่จบลงด้วยการตัดสินใจไร้ประโยชน์แบบนี้
เรื่องนี้น่าจะถูก ถกกันภายใน NPM เป็นร้อยครั้ง ตั้งแต่ถูกเปิดเผยเมื่อ 10 ปีก่อน
เพราะ Shai Halud ตอนนี้มันใหญ่เกินกว่าจะเมินได้แล้ว
“เดี๋ยวค่อยแก้” แทบจะกลายเป็น “บ้าเอ๊ย ตอนนี้ต้องแก้แล้ว” เสมอ
สงสัยว่า Node เวอร์ชัน LTS ปัจจุบัน เท่าที่จำได้คือ 22, 24, 26 จะอัปเกรด npm ที่ bundle มาเป็น v12 เพื่อให้ได้ประโยชน์จากการแก้ด้านความปลอดภัยนี้ไหม
ตอนนี้ทุกตัวมากับ npm v11
ใน v18.19.0[1] และ v20.10.0[2] มีการอัปเกรด npm จาก 9 เป็น 10
[1]: https://nodejs.org/en/blog/release/v18.19.0#npm-updated-to-v...
[2]: https://nodejs.org/en/blog/release/v20.10.0
ก็แค่ตั้งค่าดีฟอลต์ให้เหมาะสมตามที่บทความบอก
ข้อดีสุดของการเปลี่ยนนี้คือ เมื่อค่าดีฟอลต์เปลี่ยน นักพัฒนาใหม่ๆ จะเห็นทันทีว่าแพ็กเกจที่น่ารำคาญซึ่งตั้งสมมติฐานว่าแค่รัน install แล้วการตั้งค่านี้จะเปิดอยู่ กลับพังทันที
เช่น อาจช่วยหยุดธรรมเนียมที่คาดหวังว่าสคริปต์จะต้องรันได้
จากบทความยังไม่ชัดเจน แต่ดูเหมือนว่า allowlist ของสคริปต์จะรองรับ การอนุญาตเป็นรายแพ็กเกจ ไม่ใช่การตั้งค่าระดับ global
น่าจะทำให้รักษานโยบายระดับองค์กรที่อนุญาตสคริปต์เฉพาะบางแพ็กเกจได้ง่ายขึ้น
สงสัยว่ามี linter ที่ใช้บล็อกค่าดีฟอลต์ไม่ปลอดภัยในคอนฟิกของ package manager แบบนี้ได้ไหม
grepก็พอไม่ใช่เหรอ?สงสัยว่ายังมี เหตุผลให้ใช้ Yarn อยู่ไหม
ไม่รู้ว่า Yarn เองก็ทำกลไกป้องกัน supply chain attack ไว้หรือเปล่า
ก่อนหน้านี้ผมรู้จักแค่ pnpm แต่ก็ดีที่ npm ตามมาทัน
Yarn รีลีสล่าสุด 4.x รับประกัน พฤติกรรมแบบกำหนดได้แน่นอน มากเสียจนแทบเกินไป และคุณคาดหวังพฤติกรรมที่สม่ำเสมอได้ทั้งทีม
ในแง่ฟีเจอร์มีรายละเอียดเล็กๆ เยอะมาก ซึ่งพอคุ้นแล้วมันรวมกันจนเห็นความต่างชัด
รีลีสเมเจอร์ถัดไปก็จะเดินแนวทางเดิมต่อ ทั้งประสิทธิภาพที่ดีกว่า และฟีเจอร์ที่ก่อนหน้านี้ทำไม่ได้เพราะต้องพึ่งการปรับปรุงด้านประสิทธิภาพนั้น
เพื่อความโปร่งใส ผมคือ maintainer หลักของ Yarn
มันก็มีฟีเจอร์ป้องกัน supply chain ด้วย
สุดท้ายทนไม่ไหวเลยย้ายไป pnpm แล้วการติดตั้งเร็วขึ้นมากทั้งใน CI และบนเครื่องพัฒนาโลคัล
ใช้ความช่วยเหลือจาก LLM แล้วใช้เวลาประมาณวันหนึ่งในการย้าย
node_modulesแต่ รันตรงจากไฟล์บีบอัด archive เลยhttps://yarnpkg.com/features/pnp
มันค่อนข้างคล้ายกับการใช้
.jarใน Java แทน directory tree ของไฟล์.classเพียงแต่มันออกจะแฮ็กๆ หน่อย และการรองรับจาก editor กับเครื่องมือต่างๆ ก็ไม่สม่ำเสมอ
เพราะจำนวนไฟล์ย่อยน้อยกว่ามาก มันเลยอาจเร็วกว่าโดยเฉพาะถ้าคุณจำเป็นต้องทำงานบน Windows
คุณยังเอา archive เข้า git repository ได้ด้วย จึงตัดการพึ่งพาอินเทอร์เน็ตและ package registry ออกไปได้
ผมไม่รู้คำตอบจริงๆ
ไม่เคยรู้มาก่อนว่า npm เป็นของ GitHub
แบบนี้หลายอย่างก็อธิบายได้เลย
บางส่วนพอกลับมาอ่านตอนนี้ก็น่าสนใจดี
คอมเมนต์บนสุดตอนนั้นคือ “Microsoft ไม่ได้ทำทุกอย่างได้ดีหมด แต่พูดตามตรง การเข้าซื้อ GitHub เป็นไปได้ดีกว่าที่คาดไว้มาก แทนที่จะบังคับนโยบายแบบ Microsoft-centric กับ GitHub กลับกลายเป็นว่า Microsoft รับเอาหลายอย่างของ GitHub ไปใช้ในมุมมองผลิตภัณฑ์มากกว่า GitHub ยังดำเนินงานเหมือนเป็นบริษัทแยกอยู่”
ได้เงินลงทุนแบบ venture มาก็จริง แต่หาธุรกิจที่ยั่งยืนไม่เจอ
GitHub เข้าซื้อเพื่อช่วยชีวิต ecosystem และดีลนี้ก็แทบไม่ได้สร้างประโยชน์ก้อนใหญ่ให้ GitHub เท่าไร
และ Microsoft ก็ย้าย GitHub ไปไว้บน Azure
สงสัยว่า allowlist ใน
package.jsonนี่ ล็อกถึงเวอร์ชันของแพ็กเกจ ด้วยไหม หรือแค่ล็อกชื่อแพ็กเกจอย่างเดียวดีเลยที่
allowScriptsปิดเป็นค่าดีฟอลต์[ดูนาฬิกา] แปลว่า npm ใช้เวลา 18 เดือน กว่าจะตาม pnpm ทันงั้นเหรอ?
ฝั่ง JavaScript เขาทำสิ่งนี้ไปเพื่ออะไร?