guest@websec: ~/websec/17-dependencies-and-cves/th — zsh — 100×40 เขียนโดย SaKKo ENTH โค้ด:

guest@websec ~ % npm audit

17 · Dependency และ CVE

แอปหนึ่งดึงไลบรารีมาเป็นร้อย ทุกตัวรันด้วยสิทธิ์เต็ม เมื่อตัวใดมีช่องโหว่ที่เปิดเผย ผู้โจมตีเริ่มสแกนภายในไม่กี่วัน

ไม่มีใครอัปเดต dependency ให้คุณ

เมื่อไลบรารีออกตัวแก้ช่องโหว่ แอปเราจะยังไม่เปลี่ยนอะไรจนกว่า เรา จะอัปเดตเอง ระหว่างนั้น lockfile จะติดตั้งเวอร์ชันเก่าที่มีช่องโหว่ต่อไป

รัน bundler-audit และ brakeman เปิด Dependabot และใช้เวอร์ชัน Rails ที่ยังได้แพตช์ความปลอดภัย

CVE และ advisory โดยย่อ

  • CVE คือรหัสของช่องโหว่ที่รู้จักหนึ่งตัว
  • ฐานข้อมูล advisory บอกว่าเวอร์ชันไหนได้รับผลกระทบ
  • คะแนนความรุนแรงช่วยได้ แต่ที่สำคัญคือเราใช้โค้ดส่วนที่มีปัญหาจริงไหม

อัปเดตอย่างปลอดภัย: เปลี่ยนให้น้อยที่สุด

อัปเดตเฉพาะแพ็กเกจที่มีปัญหา ไม่ใช่ทั้งหมด การเปลี่ยนเล็กๆ ขึ้นได้วันนี้ การเปลี่ยนใหญ่อาจกลายเป็นการแก้ของพังที่ไม่เกี่ยวข้องทั้งสัปดาห์

ecosystemหาแพ็กเกจที่มีช่องโหว่อัปเดตแพ็กเกจเดียวแบบระมัดระวัง
Ruby / Bundlerbundle auditbundle update --conservative rack
Node / npmnpm auditnpm update lodash หรือ npm install lodash@4.17.21
Node / pnpm, yarnpnpm audit, yarn npm auditpnpm update lodash, yarn up lodash
Python / pippip-auditpip install -U "jinja2>=3.1.4" แล้ว freeze ใหม่
Python / Poetry, uvpip-auditpoetry update jinja2, uv lock --upgrade-package jinja2
PHP / Composercomposer auditcomposer update guzzlehttp/guzzle --with-dependencies
ทุกตัวOSV-Scanner, Snyk, TrivyDependabot / Renovate เปิด PR หนึ่งอันต่อการอัปเดต
sim: แพตช์ CVE ใน dependency ทางอ้อมเวอร์ชันและ advisory สมมติเพื่อการอธิบาย

ช่วงเวอร์ชันกำหนดว่า "อัปเดต" หมายถึงอะไร

เวอร์ชันเป็น MAJOR.MINOR.PATCH patch แก้บั๊ก major อาจทำให้พัง ช่วงเวอร์ชันที่ตั้งไว้กำหนดว่าอัปเดตไปได้ไกลแค่ไหน:

sim: ช่วงนี้อนุญาตเวอร์ชันไหนบ้าง?ความหมายแบบ npm / Composer / Cargo

~> 4.17 ของ Bundler ทำงานเหมือน ^4.17 ของ npm

เช็กลิสต์สุขอนามัยของ dependency

  • commit lockfile
  • ทำให้อัตโนมัติ: Dependabot และขั้นตอน audit ใน CI
  • ติดตามประกาศความปลอดภัยของ Rails
  • อัปเดตทีละน้อยแต่บ่อย ถ้าตามหลังเป็นปี จะแพตช์เร่งด่วนได้ยาก
  • เลือก gem ใหม่อย่างระวัง ระวังชื่อที่สะกดคล้ายกัน
  • ติดตั้งจาก lockfile ใน CI และ production