Dependency Security(相依套件安全)
是什麼?
Dependency Security 是確保你的專案所使用的第三方套件(library、package、module)沒有已知漏洞、沒有被惡意篡改的安全實踐。
ℹ️觸目驚心的數字
現代應用程式中,70-90% 的程式碼來自第三方套件。2021 年的 Log4Shell(CVE-2021-44228)影響了全球數百萬個 Java 應用程式,就是相依套件漏洞的典型案例。
核心觀念
常見威脅
| 威脅 | 說明 | 案例 |
|------|------|------|
| 已知漏洞(CVE) | 套件中存在已被發現的安全漏洞 | Log4Shell、Lodash Prototype Pollution |
| 惡意套件 | 攻擊者上傳偽裝成合法的套件 | event-stream 事件(2018) |
| Typosquatting | 套件名稱與知名套件只差一個字 | crossenv 偽裝 cross-env |
| Dependency Confusion | 利用 private/public registry 的解析順序 | Alex Birsan 研究(2021) |
| Abandoned Package | 不再維護的套件累積未修補漏洞 | left-pad 事件後的連鎖效應 |
防禦工具
| 工具 | 語言/平台 | 功能 |
|------|-----------|------|
| npm audit | JavaScript | 掃描 node_modules 中的已知漏洞 |
| dotnet list package --vulnerable | C# | 列出有漏洞的 NuGet 套件 |
| pip-audit | Python | 掃描 Python 套件漏洞 |
| Dependabot | GitHub | 自動建立更新 PR |
| Snyk | 多語言 | 漏洞掃描 + 修復建議 |
| Renovate | 多語言 | 自動更新依賴 + 高度可設定 |
Lock File 的重要性
package-lock.json(npm)、yarn.lock、pnpm-lock.yamlpackages.lock.json(NuGet)poetry.lock(Python)
Lock file 鎖定每個套件的確切版本和 integrity hash,確保每次安裝都得到相同的程式碼。
常見誤區
⚠️常犯錯誤
- Lock file 不 commit 到 Git(導致不同環境安裝不同版本)
- 盲目執行
npm audit fix --force(可能引入 breaking change) - 以為「用了知名套件就安全」(知名套件也會有漏洞)
- 忽略 dev dependency 的漏洞(build 階段的漏洞也可能被利用)
執行流程
開發時掃描
安裝套件前用 npm audit / pip-audit 檢查
Lock File 鎖版
commit lock file 確保版本一致性
CI 自動檢查
Pipeline 中加入漏洞掃描步驟
自動更新 PR
Dependabot/Renovate 自動建立更新 PR
定期審查
每月檢視依賴清單,移除不再使用的套件
流程解讀:相依套件安全是一個持續的過程,不是一次性的檢查。開發時就要養成掃描的習慣,CI Pipeline 自動化確保沒有漏洞的套件進入 production。Dependabot 或 Renovate 會自動監控已知漏洞資料庫,發現問題時自動建立更新 PR。定期審查則清除技術債和不必要的依賴。
程式碼範例
C# 版本
// .csproj — 啟用 NuGet Audit
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<NuGetAudit>true</NuGetAudit>
<NuGetAuditLevel>moderate</NuGetAuditLevel>
<!-- build 時自動檢查漏洞 -->
</PropertyGroup>
</Project>
// CLI 檢查漏洞
// dotnet list package --vulnerable --include-transitive
// Directory.Packages.props — 集中管理套件版本
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="Serilog" Version="3.1.1" />
</ItemGroup>
</Project>TypeScript 版本
// package.json — 設定允許的版本範圍
{
"dependencies": {
"express": "^4.18.2", // ^ 允許 minor 更新
"lodash": "4.17.21" // 精確鎖定版本
},
"overrides": {
// 強制覆蓋 transitive dependency 的版本
"glob-parent": ">=5.1.2"
}
}
// .npmrc — 安全設定
// audit=true # 安裝時自動 audit
// fund=false # 關閉贊助提示
// ignore-scripts=true # 防止 postinstall 腳本執行惡意程式
// CI 腳本中使用
// npm ci # 嚴格按照 lock file 安裝
// npm audit --audit-level=moderate
// npx lockfile-lint --path package-lock.json \
// --type npm --allowed-hosts npmPython 版本
# requirements.txt — 鎖定精確版本 + hash 驗證
# pip install --require-hashes -r requirements.txt
requests==2.31.0 \
--hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003eb
# pyproject.toml — 使用 pip-audit
# [tool.pip-audit]
# desc = "Audit Python dependencies for known vulnerabilities"
# CI 中執行
# pip-audit --strict --desc on
# safety check --full-report
# 使用 Poetry 管理依賴
# poetry.lock 自動鎖定所有 transitive dependency
# poetry audit # 檢查漏洞結構圖
圖中 Developer 從 Package Registry 安裝套件,Lock File 鎖定確切版本。CI Pipeline 使用 Lock File 進行可重現的建置,並在 audit step 中用 Vulnerability Scanner 掃描漏洞。Dependabot/Renovate 持續監控並自動建立更新 PR 通知 Developer。
面試常見問題
Q: 什麼是 Supply Chain Attack?如何防禦?
A: 攻擊者不直接攻擊你的應用程式,而是攻擊你依賴的第三方套件。防禦方式包括:使用 lock file 鎖定版本、啟用 integrity hash 驗證、設定 private registry 優先(防 Dependency Confusion)、定期掃描漏洞、限制 postinstall script 執行。
Q: Dependabot 和 Renovate 有什麼差別?
A: Dependabot 是 GitHub 原生整合,設定簡單但自訂性較低。Renovate 支援更多平台(GitLab、Bitbucket)、更細緻的更新策略(group updates、schedule、automerge),適合大型專案。兩者都能自動建立依賴更新 PR。
Q: 遇到無法升級的漏洞套件怎麼辦?
A: 先評估漏洞是否在你的使用情境中可被利用(不是所有 CVE 都影響你的程式碼路徑)。如果確實有風險:嘗試用 patch-package 局部修補、尋找替代套件、用 wrapper 隔離風險、在 WAF 層面阻擋攻擊向量。記錄風險接受(risk acceptance)的決策理由。
理解測驗
🤔 Lock file 的主要作用是什麼?
🤔 什麼是 Typosquatting 攻擊?
🤔 CI Pipeline 中應該用哪個指令安裝 npm 套件?
重點整理
💡一句話記住
Dependency Security = 鎖版本 + 掃漏洞 + 自動更新。 口訣:「Lock file 要 commit,CI 要 audit,更新靠 bot」
| 概念 | 說明 | |------|------| | Lock File | 鎖定每個套件的確切版本和 hash | | npm audit / pip-audit | 掃描已知漏洞的 CLI 工具 | | Dependabot | GitHub 原生的自動更新服務 | | Supply Chain Attack | 攻擊第三方依賴來間接入侵應用 | | 核心原則 | 信任但驗證,持續監控,最小依賴 |