วิธีแก้ไขช่องโหว่ด้านความปลอดภัยด้วย NPM Overrides
จากคราวที่แล้ว ผมได้แนะนำ ขั้นตอนแก้ไขเบื้องต้นเมื่อเจอช่องโหว่ใน Dependency ของ Nodejs ไป
ซึ่งเราแค่ไปอัพเดท Library หลักที่ใช้ แล้วเดียวพวก Dependencies มันก็จะอัพเดทตาม
แต่บ้างครั้งเราเจ้ากรรม Library หลักที่ใช้ เขาไม่ได้อัพเดท Dependencies ให้ แต่เราดันไปตรวจเจอ ซึ่งต่อให้เราอัพเดท Library หลักไปแล้วตัว Dependencies มันก็ไม่อัพเดทให้อยู่ดี ซึ่งมันก็คือช่องโหว่ที่เราไม่สามารถแก้ไขได้เอง
ขอยกตัวอย่างมาให้อ่านกันจะได้เข้าใจมากขึ้น
$ npm audit
# npm audit report
phin <3.7.1
Severity: moderate
phin may include sensitive headers in subsequent requests after redirect - https://github.com/advisories/GHSA-x565-32qp-m3vf
fix available via `npm audit fix --force`
Will install jimp@0.3.11, which is a breaking change
node_modules/phin
load-bmfont >=1.4.0
Depends on vulnerable versions of phin
node_modules/load-bmfont
@jimp/plugin-print >=0.4.0
Depends on vulnerable versions of load-bmfont
node_modules/@jimp/plugin-print
@jimp/plugins >=0.4.0
Depends on vulnerable versions of @jimp/plugin-print
node_modules/@jimp/plugins
jimp >=0.4.0
Depends on vulnerable versions of @jimp/plugins
node_modules/jimp
จากการที่เราตรวจสอบด้วย npm audit
ทำให้เราเจอว่า phin นั้นมันมีช่องโหว่ที่ version ต่ำกว่า 3.7.1 ซึ่งดูจากรายงานเบื้องต้น มันถูกใช้งาน Dependencies ไปหลายส่วนมาก ซึ่งตัวบนสุด Library หลักที่เรานำมาใช้งานจริงก็คือ jimp
เมื่อเราไปตรวจสอบเพิ่มใน package-lock.json
ก็พบว่า jimp เป็น version ล่าสุดแล้ว แต่ในระดับ Dependencies ลึกลงไป อย่าง @jimp/plugins และ load-bmfont มันยังเรียกใช้งาน phin ที่ต่ำกว่า 3.7.1 อยู่ดี
ซึ่งเราถ้าเราจะรอให้เจ้าของเขาอัพเดท phin ให้เราก็ไม่รู้เมื่อไร ฉะนั้นพระเอกของเราที่จะมาแก้ไขให้เราอัพเดท phin ได้เองก็คือ...
NPM Overrides
NPM overeides เป็นวิธีในการแทนที่ Library ในแอพของเราด้วยเวอร์ชันอื่น โดยเขียนลงใน package.json
เช่น
"overrides": {
"phin": "^3.7.1"
},
จากโค็ดด้านบนเราสามารถกำหนดเวอร์ชั่นไปได้ จากนั้น npm i
ใหม่อีกรอบเพื่อให้มันอัพเดท package-lock.json
ให้เรา เมื่อเราตรวจสอบ npm audit
อีกครั้งก็จะได้รับการแก้ไขแล้ว 😄