Nicer Package Manager
บริษัทวิจัยความปลอดภัย Aqua Security เก็บสถิติแพ็กเกจยอดนิยมบน npm จำนวน 50,000 รายการแรกมาวิเคราะห์ แล้วพบว่าแพ็กเกจสัดส่วน 8.2% มีสถานะเป็นล้าสมัย (deprecated) อย่างเป็นทางการแล้ว (หมายถึงนักพัฒนาเจ้าของแพ็กเกจนั้นประกาศ deprecated อย่างชัดเจน)
อย่างไรก็ตาม ถ้านับแพ็กเกจอื่นที่อาจไม่ deprecated อย่างเป็นทางการ แต่มีสถานะคล้ายๆ กัน เช่น ตัว repository ทั้งอันบน GitHub ถูกปรับเป็น archived ไม่ใช้งานแล้ว, ตัว repository ถูกลบออกจาก GitHub แต่แพ็กเกจยังอยู่ใน npm, แพ็กเกจไม่ได้มีลิงก์ไปยัง repository ต้นทางด้วย สัดส่วนแพ็กเกจที่ล้าสมัย-ใช้งานไม่ได้จะเพิ่มเป็น 21% หรือราว 1/5 ของแพ็กเกจทั้งหมดเลยทีเดียว
นักพัฒนาที่ใช้ชื่อบัญชี PatrickJS ทดลองสร้างแพ็กเกจ "everything" โดยลากเอาทุกแพ็กเกจใน NPM เข้ามาเป็น dependency แล้วปล่อยแพ็กเกจนี้ขึ้นสู่ NPM ส่งผลให้นักพัฒนาทั้งระบบไม่สามารถลบหรือซ่อนแพ็กเกจออกไปได้
แนวทางของ PatrickJS คือสร้างแพ็กเกจย่อยจำนวน 5 แพ็กเกจ แต่ละตัวระบุว่าต้องใช้งานแพ็กเกจอื่นๆ ใน NPM ประมาณ 800 รายการ จากนั้นทุกตัวมารวมกันที่ everything ตัวหลัก หากผู้ใช้คนใดสั่ง npm install everything
ก็จะเป็นการลากทุกแพ็กเกจใน NPM ลงมาในเครื่องทันที โดยรวมน่าจะดาวน์โหลดแพ็กเกจทั้งหมดนับล้านรายการ
GitHub ปรับระบบแจ้งเตือนความปลอดภัยของโครงการต่างๆ ที่อาจจะดึงไลบรารีที่เกี่ยวข้อง และตัวไลบรารีมีรายงานว่ามีช่องโหว่ความปลอดภัย โดยเฉพาะในโครงการที่ใช้ไลบรารีจาก npm
ฟีเจอร์ใหม่นี้จะดูว่าโครงการแต่ละโครงการนั้นใช้ไลบรารีในรูปแบบใด เช่น ใช้เป็น devDependency ซึ่งใช้งานในโหมดพัฒนา และทางตรวจสอบจากกฎที่เตรียมไว้แล้วไม่กระทบกับโครงการปัจจุบันก็จะไม่ต้องแจ้งเตือนนักพัฒนา
ทาง GitHub เปิดใช้กับ npm ก่อนเพราะเป็น ecosystem ที่แต่ละโครงการดึง dependency จำนวนมาก และหลักจากเปิดใช้งานก็สามารถลดการแจ้งเดือนได้ประมาณ 15%
ตอนนี้ฟีเจอร์ auto-dismissal นี้จะเปิดใช้งานเป็นค่าเริ่มต้นให้กับโครงการสาธารณะทั้งหมด ขณะที่ repository แบบปิดนั้นเจ้าของต้องไปเปิดใช้งานเอง
GitHub ในฐานะเจ้าของระบบจัดการแพ็กเกจ npm ประกาศฟีเจอร์ด้านความปลอดภัยใหม่อีก 2 อย่างดังนี้
โครงการ Deno รันไทม์จาวาสคริปต์ ออกเวอร์ชัน 1.28 มีของใหม่ที่สำคัญคือรองรับโมดูล npm ของโครงการ Node.js ตามที่ประกาศไว้ ทำให้เราสามารถอิมพอร์ตโมดูล npm ที่มีมหาศาล 1.3 ล้านโมดูลมาใช้กับ Deno ได้
การใช้งาน npm ของ Deno ไม่จำเป็นต้องสั่ง npm install เพราะโมดูลจะถูกติดตั้งตอนรันโปรแกรมครั้งแรก, ไม่ต้องมีไฟล์ package.json และไม่ต้องมีโฟลเดอร์ node_modules เพราะโมดูลจะถูกแคชในไดเรคทอรี global แทน
Deno โครงการรันไทม์จาวาสคริปต์ประกาศแผนการพัฒนาเพิ่มเติม โดยจุดใหญ่ที่สุดคือการรองรับแพ็กเกจต่างๆ จาก npm ทำให้สามารถใช้แพ็กเกจแบบเดียวกับใน NodeJS ได้ แม้ว่าภายในแล้ว Deno จะต่างกับ NodeJS พอสมควร
GitHub รายงานข้อมูลเพิ่มเติมจากเหตุโทเค็น OAuth รั่วไหลเมื่อเดือนเมษายนที่ผ่านมา พบว่าคนร้ายได้รับข้อมูลมากกว่าซอร์สโค้ดของ npm เอง โดยคนร้ายได้ฐานข้อมูล ชื่อผู้ใช้, อีเมล, และค่าแฮชรหัสผ่าน ของผู้ใช้ประมาณ 100,000 คนไปด้วย
ข้อมูลที่หลุดไปอยู่ในไฟล์สำรองข้อมูลของเว็บ skimdb.npmjs.com
ที่สำรองไว้ตั้งแต่วันที่ 7 เมษายน 2021 ในไฟล์ข้อมูลยังมี metadata ของแพ็กเกจส่วนตัวทั้งหมด, และแพ็กเกจภายในขององค์กรสององค์กร
RIAEvangelist นักพัฒนาโมดูล node-ipc ที่ได้รับความนิยมสูง ใส่โค้ดเพื่อลบไฟล์ผู้ใช้หากตรวจสอบไอพีแล้วพบว่าผู้ใช้อยู่ในรัสเซียหรือเบลารุส ไม่ว่าผู้ใช้จะติดตั้งโมดูลโดยตรงหรือติดตั้งจาก dependency โมดูลอื่นๆ ก็ตาม
ทาง GitHub ออกมาประกาศว่าเวอร์ชั่น 10.1.1 และ 10.1.2 ที่ผู้ดูแลใส่โค้ดเข้ามานี้เป็นช่องโหว่ร้ายแรงระดับวิกฤติ ตอนนี้ทาง NPM ได้ลบเวอร์ชั่นเหล่านี้ออกแล้ว และมีการอัพเดตเป็นเวอร์ชั่น 10.1.3
GitHub ประกาศบังคับให้ผู้ดูแลแพ็กเกจ NPM ยอดนิยม 100 ตัวแรก ต้องล็อกอินแบบ 2FA เพื่อเพิ่มระดับความปลอดภัยจากการถูกแฮ็กบัญชี ตามที่เคยประกาศแนวทางไว้
การที่แพ็กเกจ NPM ยอดนิยมถูกใช้งานในวงกว้าง ทำให้เกิดปัญหาผู้ดูแลถูกแฮ็กบัญชี แล้วเปลี่ยนแพ็กเกจที่ยัดไส้มัลแวร์อยู่บ่อยครั้ง สร้างผลกระทบเป็นวงกว้าง หนึ่งในมาตรการของ GitHub คือเพิ่มความปลอดภัยของบัญชีผู้ดูแลก่อน โดยเริ่มจากกลุ่ม Top 100 และขั้นต่อไปคือ GitHub จะบังคับ 2FA กับแพ็กเกจที่มียอดดาวน์โหลดเกิน 1 ล้านครั้งต่อสัปดาห์ หรือมีโครงการอื่นเรียกใช้งานเกิน 500 โครงการ
Russ Cox วิศวกรกิตติมศักดิ์ (Distinguished Engineer) ของกูเกิล และทีมพัฒนาภาษา Go เขียนบล็อคถึงประเด็นที่นักพัฒนาโมดูล color.js และ faker.js ใส่โค้ดทำให้แอปอื่นๆ พังโดยจงใจ ว่ายังดีที่โค้ดนี้ไม่ได้ทำอะไรมุ่งร้ายมากไปกว่าทำให้แอปพังเพราะโค้ดพิมพ์ขยะจนเต็มหน้า แต่หลังจากเหตุการณ์นี้ NPM ควรปรับปรุงเพื่อรับมือปัญหาแบบนี้ในอนาคต
ผู้ใช้ GitHub ชื่อบัญชี Marak เป็นผู้ดูแลโครงการโอเพนซอร์สจำนวนมากและช่วงสัปดาห์ที่ผ่านมาเขาใส่โค้ดรัน infinite loop เข้าไปยังโครงการ color.js (4,300 stars) และ faker.js (795 stars) ส่งผลให้โมดูลและแอปอื่นๆ ที่ใส่โมดูลเหล่านี้เป็น dependency ไม่สามารถทำงานได้ หน้าจอจะค้างและพิมพ์ขยะออกมาไม่หยุด
Marak ไม่ได้แถลงบอกเหตุผลที่เขาทำแบบนี้ไว้โดยตรงแต่เขาแสดงภาพ Aaron Swartz โปรแกรมเมอร์นักกิจกรรมที่ฆ่าตัวตาย หลังถูกจับเนื่องจากเอาคอมพิวเตอร์ไปเชื่อมต่อเครือข่ายของ MIT เพื่อดาวน์โหลดรายงานวิทยาศาสตร์
ความนิยมของแพ็กเกจ npm ในโลก JavaScript กลายเป็นช่องโหว่ด้านความปลอดภัยหลายครั้ง เพราะแฮ็กเกอร์สามารถยึดบัญชีนักพัฒนาแพ็กเกจ npm ชื่อดัง แล้วอัพเดตแพ็กเกจที่ฝังมัลแวร์เพื่อแพร่กระจายในวงกว้างอย่างรวดเร็ว (กรณีของ ua-parser-js และ coa)
GitHub ซึ่งปัจจุบันเป็นเจ้าของบริษัท npm Inc. จึงออกมาประกาศมาตรการความปลอดภัยของ npm เพื่อป้องกันปัญหาเหล่านี้ ได้แก่
ไลบรารี coa หรือ Command-Option-Argument เป็นไลบรารีสำหรับอ่านคำสั่ง command line ยอดนิยมบน npm ถูกแฮกและคนร้ายสามารถปล่อยเวอร์ชั่นมุ่งร้าย 2.0.3, 2.0.4, 2.1.1, 2.1.3, และ 3.1.3 ให้เหยื่อดาวน์โหลดผ่าน npm ได้สั้นๆ ไม่กี่ชั่วโมง
อัตราการใช้งาน coa สูงมาก มียอดดาวน์โหลดเกือบ 9 ล้านครั้งต่อสัปดาห์ ช่วงเวลาไม่กี่ชั่วโมงก็อาจจะถูกดาวน์โหลดไปแล้วนับแสนครั้ง
ผู้ดูแลแพ็กเกจ ua-parser-js บน npm ถูกคนร้ายแฮกบัญชีและวางแพ็กเกจเวอร์ชั่น 0.7.29, 0.8.0, และ 1.0.0 เพื่อวางมัลแวร์ในเครื่องของเหยื่อ โดยนักพัฒนาที่โหลดแพ็กเกจนี้ไปควรถือว่าเครื่องของตัวเองถูกแฮก และรีเซ็ตรหัสผ่านหรือกุญแจที่เกี่ยวข้องทั้งหมดทันที
ตอนนี้ผลกระทบของมัลแวร์ที่แน่ชัดคือการขโมยรหัสผ่านในเครื่อง, ขโมย cookie ในเบราว์เซอร์, และขุดเงินคริปโตสกุล Monero
GitHub ออกประกาศแจ้งเตือนระดับวิกฤติ ระบุว่ากุญแจและรหัสผ่านควรสร้างใหม่บนเครื่องที่ไม่ได้ติดตั้งแพ็กเกจนี้ทันที และต่อให้ถอนการติดตั้งแพ็กเกจนี้ไปแล้วก็ไม่สามารถแน่ใจได้ว่ายังเหลือมัลแวร์ในเครื่องหรือไม่
หลังจาก Alex Birsan รายงานถึงการโจมตีด้วยการตั้งชื่อแพ็กเกจซ้ำกับแพ็กเกจภายในของบริษัทต่างๆ ทาง GitHub ก็ออกมาเรียกร้องให้นักพัฒนาที่ใช้งานแพ็กเกจภายในว่าควรใช้ scoped package ที่เป็นฟีเจอร์ของ npm
scoped package เป็นฟีเจอร์ของ npm ตั้งแต่ปี 2014 เมื่อประกาศแพ็กเกจแบบ scoped แล้วแพ็กเกจนั้นจะถูกล็อกเข้ากับรีจิสตรีที่นักพัฒนาระบุไว้ ซึ่งอาจจะเป็นเซิร์ฟเวอร์ในองค์กร หรือจะเป็น npm เองที่สามารถตั้งรีจิสตรีแยกสำหรับองค์กรได้
Alex Birsan รายงานถึงการโจมตีองค์กรขนาดใหญ่จำนวนมากด้วยการสร้างแพ็กเกจไลบรารีเลียนแบบชื่อไลบรารีในองค์กรแล้วไปวางตามบริการดาวน์โหลดไลบรารีไม่ว่าจะเป็น RubyGems, npm, หรือ PyPI
องค์กรขนาดใหญ่จำนวนมากมักมีไลบรารีเฉพาะทางของตัวเองใช้งานภายในเป็นเรื่องปกติ และหลายครั้งชื่อไลบรารีเหล่านี้ก็หลุดออกมาสู่โลกภายนอก เช่น Paypal เคยทำไฟล์ package.json ที่ใช้ภายในหลุดออกมาอยู่บน GitHub ทำให้รู้ว่าบริษัทมีการใช้งานไลบรารีภายในเช่น pplogger, auth-paypal, wurfl-paypal, analytics-paypal เป็นต้น หรือแม้แต่แอปเปิลก็เคยทำรายชื่อแพ็กเกจเหล่านี้หลุดออกมาเช่นกัน
วันนี้ตั้งแต่ช่วงก่อนสี่โมงที่ผ่านมาบริการ npmjs มีปัญหาทั้งเว็บไซต์และบริการดาวน์โหลดแพ็กเกจ ส่งผลให้สคริปต์หลายตัวไม่ทำงาน
GitHub เพิ่งเข้าซื้อ npm เมื่อเดือนมีนาคมที่ผ่านมา ทำให้ตอนนี้เจ้าของ npm กลายเป็นไมโครซอฟท์
ที่มา - npm status
โมดูล is-promise เป็นโมดูลง่ายๆ บน npm ที่ใช้ตรวจสอบว่าออปเจกต์ใดเป็น Promise บ้าง โดยตัวโมดูลเองมีความยาวเพียง 5 บรรทัดเท่านั้น (โค้ดอยู่ในภาพ) แต่การอัพเดตครั้งล่าสุดในเวอร์ชั่น 2.2.0 กลับทำให้โมดูลจำนวนมากไม่ทำงาน
ความผิดพลาดเกิดจากความพยายามซัพพอร์ต ES module แต่คอนฟิกที่ใส่มากลับไม่สมบูรณ์ ทำให้คำสั่งสำคัญๆ เช่น create-react-app
หรือ firebase-tools
ติดตั้งใหม่ไม่ได้
แพ็กเกจที่ติดตั้งไปก่อนแล้วยังคงทำงานได้ และคำแนะนำแรกๆ หลังมีปัญหานี้คือให้ย้อนกลับไปใช้เวอร์ชั่น 2.1.0 ส่วนตอนนี้ทาง is-promise ออกเวอร์ชั่น 2.2.1 ที่แก้ปัญหาแล้ว
GitHub ประกาศว่าลงนามข้อตกลงเข้าซื้อกับ npm เรียบร้อยแล้ว โดยสัญญาว่าบริการ npm จะฟรีตลอดไป แต่จะมีการปรับปรุง 3 ด้านได้แก่
นอกจากทั้งสามด้านแล้ว GitHub ยังระบุว่าการรวม npm เข้ามาจะทำให้โครงสร้างความมั่นคงปลอดภัยของโลกซอฟต์แวร์โอเพนซอร์สดีขึ้นจากการที่สามารถตรวจสอบได้ว่าแพ็กเกจเวอร์ชั่นใดมาจากโค้ดส่วนใด และยังใช้ความสามารถของ GitHub Security Lab ในการตรวจสอบความปลอดภัยได้
เมื่อกลางเดือนสิงหาคมที่ผ่านมา Feross Aboukhadijeh ผู้ดูแลแพ็กเกจ standard ใน npm ประกาศทดลองโมเดลรายได้ใหม่ ด้วยการสร้างแพ็กเกจ funding ที่จะแสดงโฆษณาบนเทอร์มินัลของผู้ที่ติดตั้งแพ็กเกจ เป็นรายได้เสริมอีกทางหนึ่งของนักพัฒนา
ผู้ใช้แพ็กเกจ standard แสดงความไม่พอใจเป็นวงกว้างหลังจากพบแบนเนอร์ข้อความเมื่อติดตั้งโมดูลบนในแอป โดยกระบวนการแสดงโฆษณาคือการดึงแพ็กเกจ funding เข้าเป็น dependency ของ standard และแบนเนอร์จะแสดงบนเทอร์มินัลในช่วง post install
npm แจ้งเตือนว่าแพ็กเกจ bb-builder มีโค้ดมุ่งร้ายที่มุ่งเป้าเหยื่อที่รันวินโดวส์ โดยพยายามอัพโหลดข้อมูลกลับไปยังเซิร์ฟเวอร์ของคนร้าย
ประกาศแจ้งว่าคอมพิวเตอร์ที่ติดตั้งแพ็กเกจนี้แล้วควรถือว่าถูกแฮกไปแล้ว และยกเลิกค่าความลับและกุญแจต่างๆ ที่อยู่บนเครื่องโดยเร็ว แม้แต่การลบแพ็กเกจไปแล้วก็ไม่รับประกันว่าคนร้ายติดตั้งโค้ดมุ่งร้ายอื่นลงบนเครื่องไปแล้วหรือไม่ โดยตอนนี้ bb-builder มีสถานะเป็น security holding ที่ทีมงาน npm ถือไว้เองไม่ให้ใครมาสร้างแพ็กเกจชื่อนี้
GitHub เปิดตัวบริการใหม่ GitHub Package Registry ที่ช่วยให้เราแปลงซอร์สโค้ดของซอฟต์แวร์บน GitHub ไปเป็นแพ็กเกจซอฟต์แวร์สำหรับแจกจ่าย (ทั้งภายในองค์กรหรือสาธารณะ) โดยโฮสต์อยู่บนเซิร์ฟเวอร์และ CDN ของ GitHub ด้วยเลยเสร็จสรรพ
บริการตัวนี้รองรับแพ็กเกจซอฟต์แวร์ยอดนิยมทั้ง JavaScript (npm), Java (Maven), Ruby (RubyGems), .NET (NuGet) และ Docker images จุดเด่นของมันคือความครบวงจร ทุกอย่างอยู่บน GitHub หมดแล้ว ไม่ว่าจะเป็นบัญชีผู้ใช้งาน หรือหน้าจออินเทอร์เฟซที่คุ้นเคย แถมยังเชื่อมต่อกับ GitHub Actions ระบบจัดการ workflow CI/CD ที่เพิ่งเปิดตัวเมื่อเร็วๆ นี้
แพ็กเกจ event-stream ใน npm ย้ายเจ้าของจากผู้ดูแลเดิมมาสู่ผู้ใช้ GitHub ที่ชื่อว่า right9ctrl และออกเวอร์ชั่นใหม่เมื่อไม่กี่วันที่ผ่านมา และพบว่าโค้ดที่เพิ่มเข้ามามีโค้ดมุ่งร้าย น่าจะใช้ขโมยเงินคริปโต
แพ็กเกจ event-stream มีจำนวนดาวน์โหลดเกือบสองล้านครั้งต่อสัปดาห์ โดย dominictarr ผู้ดูแลเดิมระบุว่าเขาไม่ได้ใช้โครงการนี้มานานแล้ว เมื่อ right9ctrl เข้ามาขอดูแลโครงการต่อจึงยกให้ไป
เวอร์ชั่นของแพ็กเกจที่ได้รับผลกระทบคือเวอร์ชั่น 3.3.6 ผู้ใช้ทุกคนควรตรวจสอบว่ามีโค้ดรันอยู่หรือไม่ ตอนนี้โค้ดถูกถอดออกจาก npm เรียบร้อยแล้วแต่อาจจะเหลืออยู่ในแคชของเครื่องผู้ใช้
ผู้ใช้รายงานบั๊กใน npm 5.7.0 หากรันด้วยสิทธิ์ root อาจจะทำให้ระบบไฟล์เสียหายถึงขั้นต้องติดตั้งระบบปฎิบัติการใหม่
บั๊กนี้เกิดจากแพตช์ที่เปลี่ยนแพ็กเกจจาก mkdirp เป็น correct-mkdir แต่เกิดผลข้างเคียงทำให้ความเป็นเจ้าของโฟลเดอร์เปลี่ยนไป กระทบโฟลเดอร์สำคัญๆ เช่น /etc /usr /boot
ปัญหานี้ไม่ได้กระทบลินุกซ์ทุกรุ่น และวินโดวส์ก็ไม่ได้รับผลกระทบ แต่มีผู้ใช้ FreeBSD รายงานว่าได้รับผลกระทบเช่นกัน อย่างไรก็ตามตอนนี้ npm 5.7.1 ออกมาแล้วก็ควรหันไปใช้รุ่นใหม่ก่อน
npm ออกประกาศเตือนผู้ใช้ หลังได้รับแจ้งว่าแพ็กเกจ crossenv
ที่ตั้งชื่อคล้ายกับแพ็กเกจ cross-env
มีพฤติกรรมอันตรายด้วยการเก็บค่า environment ของระบบที่ติดตั้งแล้วส่งกลับเซิร์ฟเวอร์
ผู้ใช้ที่สร้างแพ็กเกจนี้ใช้ชื่อว่า hacktask เริ่มเผยแพร่แพ็กเกจ crossenv มาตั้งแต่วันที่ 19 กรกฎาคมที่ผ่านมา จนตอนนี้มียอดดาวน์โหลดแล้วกว่า 600 ครั้ง แต่ทาง npm เชื่อว่ามียอดดาวน์โหลดไปติดตั้งจริงๆ ประมาณ 50 ครั้ง นอกจากแพ็กเกจนี้แล้วยังมีแพ็กเกจอื่นๆ แต่ที่มีพฤติกรรมชื่อคล้ายแพ็กเกจอื่นๆ อีกจำนวนหนึ่ง