วิธีแก้ไขช่องโหว่ด้านความปลอดภัยด้วย NPM Overrides

จากคราวที่แล้ว ผมได้แนะนำ ขั้นตอนแก้ไขเบื้องต้นเมื่อเจอช่องโหว่ใน Dependency ของ Nodejs ไป

ขั้นตอนแก้ไขเบื้องต้นเมื่อเจอช่องโหว่ใน Dependency ของ Nodejs
เมื่อเราใช้ trivy scan หาช่องโหว่ Dependency ใน Nodejs เจอแล้ว ให้ดูว่า Library ไหนที่โดน ดูว่าติดตั้ง version ไหน และดูว่ามันได้รับการแก้ไขที่ version ไหนหรือยัง? จากนั้นกดไปดู Link รายละเอียดของ Vulnerability เพิ่มเติมได้ แล้วลองพิมพ์ npm audit

ซึ่งเราแค่ไปอัพเดท 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 อีกครั้งก็จะได้รับการแก้ไขแล้ว 😄