guest@websec ~ % npm audit
17 · Dependency และ CVE
แอปหนึ่งดึงไลบรารีมาเป็นร้อย ทุกตัวรันด้วยสิทธิ์เต็ม เมื่อตัวใดมีช่องโหว่ที่เปิดเผย ผู้โจมตีเริ่มสแกนภายในไม่กี่วัน
ไม่มีใครอัปเดต dependency ให้คุณ
เมื่อไลบรารีออกตัวแก้ช่องโหว่ แอปเราจะยังไม่เปลี่ยนอะไรจนกว่า เรา จะอัปเดตเอง ระหว่างนั้น lockfile จะติดตั้งเวอร์ชันเก่าที่มีช่องโหว่ต่อไป
รัน
bundler-audit และ brakeman เปิด Dependabot และใช้เวอร์ชัน Rails ที่ยังได้แพตช์ความปลอดภัยCVE และ advisory โดยย่อ
- CVE คือรหัสของช่องโหว่ที่รู้จักหนึ่งตัว
- ฐานข้อมูล advisory บอกว่าเวอร์ชันไหนได้รับผลกระทบ
- คะแนนความรุนแรงช่วยได้ แต่ที่สำคัญคือเราใช้โค้ดส่วนที่มีปัญหาจริงไหม
อัปเดตอย่างปลอดภัย: เปลี่ยนให้น้อยที่สุด
อัปเดตเฉพาะแพ็กเกจที่มีปัญหา ไม่ใช่ทั้งหมด การเปลี่ยนเล็กๆ ขึ้นได้วันนี้ การเปลี่ยนใหญ่อาจกลายเป็นการแก้ของพังที่ไม่เกี่ยวข้องทั้งสัปดาห์
| ecosystem | หาแพ็กเกจที่มีช่องโหว่ | อัปเดตแพ็กเกจเดียวแบบระมัดระวัง |
|---|---|---|
| Ruby / Bundler | bundle audit | bundle update --conservative rack |
| Node / npm | npm audit | npm update lodash หรือ npm install lodash@4.17.21 |
| Node / pnpm, yarn | pnpm audit, yarn npm audit | pnpm update lodash, yarn up lodash |
| Python / pip | pip-audit | pip install -U "jinja2>=3.1.4" แล้ว freeze ใหม่ |
| Python / Poetry, uv | pip-audit | poetry update jinja2, uv lock --upgrade-package jinja2 |
| PHP / Composer | composer audit | composer update guzzlehttp/guzzle --with-dependencies |
| ทุกตัว | OSV-Scanner, Snyk, Trivy | Dependabot / Renovate เปิด PR หนึ่งอันต่อการอัปเดต |
ช่วงเวอร์ชันกำหนดว่า "อัปเดต" หมายถึงอะไร
เวอร์ชันเป็น MAJOR.MINOR.PATCH patch แก้บั๊ก major อาจทำให้พัง ช่วงเวอร์ชันที่ตั้งไว้กำหนดว่าอัปเดตไปได้ไกลแค่ไหน:
~> 4.17 ของ Bundler ทำงานเหมือน ^4.17 ของ npm
เช็กลิสต์สุขอนามัยของ dependency
- commit lockfile
- ทำให้อัตโนมัติ: Dependabot และขั้นตอน audit ใน CI
- ติดตามประกาศความปลอดภัยของ Rails
- อัปเดตทีละน้อยแต่บ่อย ถ้าตามหลังเป็นปี จะแพตช์เร่งด่วนได้ยาก
- เลือก gem ใหม่อย่างระวัง ระวังชื่อที่สะกดคล้ายกัน
- ติดตั้งจาก lockfile ใน CI และ production