Russ Cox วิศวกรกิตติมศักดิ์ (Distinguished Engineer) ของกูเกิล และทีมพัฒนาภาษา Go เขียนบล็อคถึงประเด็นที่นักพัฒนาโมดูล color.js และ faker.js ใส่โค้ดทำให้แอปอื่นๆ พังโดยจงใจ ว่ายังดีที่โค้ดนี้ไม่ได้ทำอะไรมุ่งร้ายมากไปกว่าทำให้แอปพังเพราะโค้ดพิมพ์ขยะจนเต็มหน้า แต่หลังจากเหตุการณ์นี้ NPM ควรปรับปรุงเพื่อรับมือปัญหาแบบนี้ในอนาคต
แนวทางของ Cox เสนอให้ NPM เลิกดึงเวอร์ชั่นล่าสุดของ dependency เป็นค่าเริ่มต้น เพราะพฤติกรรมแบบนี้จะทำให้เวอร์ชั่นใหม่สุดที่ยังไม่ได้ทดสอบเป็นวงกว้างถูกดาวน์โหลดไปใช้งานทันที ขณะที่ภาษาอื่นๆ เช่น ภาษา Go นั้นจะดึงเวอร์ชั่นที่ใหม่พอที่จะใช้งานได้เท่านั้น ทำให้เมื่อนักพัฒนาอัพโหลดเวอร์ชั่นใหม่เอี่ยมก็จะถูกใช้งานในวงจำกัดไปก่อน และโมดูลต่างๆ ค่อยอัพเดตเลขเวอร์ชั่นกันตามมาภายหลัง
เขายังระบุว่า NPM ไม่ต้องทำตาม Go เพราะโครงการที่ใช้ NPM ก็มีไฟล์ package-lock.json อยู่แล้ว ทำให้รู้ว่าแต่ละโครงการทดสอบกับ dependency เวอร์ชั่นอะไรบ้าง หาก NPM ดึงแพ็กเกจตามนั้นก็จะได้ dependency เวอร์ชั่นที่ทดสอบแล้วโดยแต่ละโครงการ เหตุการณ์เช่น AWS CDK รันไม่ได้ก็จะไม่เกิดขึ้นเอง นอกจาก NPM แล้ว Cox ก็ยังระบุว่าบริการ package manager อื่นๆ ก็ควรสำรวจว่าจะรับมือกับปัญหารูปแบบนี้อย่างไร เพราะในอนาคตการโจมตีรูปแบบเดียวกันนี้จะร้ายแรงกว่าครั้งนี้
ที่มา - research!rsc
Comments
แต่หลังจากเหตุการณ์นี้ NPM "ควร"ปรับปรุง
yarn จะมีปัญหาเดียวกันไหมครับ
มันก็มี convention ของการใส่เลข version ใน package.json อยู่แล้วนี่นา ใครไม่อยากเสี่ยงก็ล็อกเลขไปหรือให้อัพเกรดระดับ minor version อย่างเดียวก็ได้หนิ
จริงๆเป็นฝั่งนักพัฒนาเองด้วยมากกว่าที่ควรเพิ่ม pattern มาสำหรับ code ที่ยังไม่ stable ก่อน tag release เช่นใส่ suffix -beta หรืออะไรก็ว่าไป
คือ เค้าจะบอกว่า ระบบไม่ควรจะผลัก user ตกเหวเป็นค่ามาตรฐาน น่ะครับ
มันควรจะมีระดับของการเลือก upgrade บางคนอยากจะใช้เวอร์ชันที่ใหม่โดยที่ไม่อยากเสี่ยงมากจนเกินไปก็มี ถ้าล็อกแพ็กเกจแล้วลืม upgrade เจอปัญหา security อีก เท่าที่รู้ NPM ไม่มีตัวเลือกระดับการ upgrade ด้วย มนุษย์เป็นสิ่งมีชีวิตที่มีข้อบกพร่อง จะคาดหวังให้รอบคอบทุกอย่างเลยหรือยังไง
ยกตัวอย่างฝั่ง consumer เองก็ Manjaro เองยังต้องแยก repository ของตัวเองจาก Arch แล้วแยก stable branch/testing branch ต่ออีก ระบบที่ดีควรปกป้องผู้ใช้ตั้งแต่แรก
จะให้ทำไงล่ะครับ อารมณ์ประมาณ
มีตำรวจทำงานมา 10 ปี อยู่ดีๆ เป็นผู้ร้ายยิงกราดซะงั้น
จะกันยังไงล่ะ
สิ่งที่เค้าเสนอคือ "การป้องกันตำรวจกลายเป็นผู้ร้ายยิงกราด" เนี่ยแหละครับ
ซึ่งจากที่เสนอคือ lock version by default