現代軟體開發已經很少「從零開始」,大部分專案都依賴大量第三方套件(Libraries)、框架(Frameworks)、甚至整合工具(Toolchains)。
這樣雖然能大幅提升開發效率,但同時也帶來一個巨大的風險:供應鏈攻擊(Supply Chain Attack)。
換句話說,今天不一定是你的程式寫錯,而可能是你安裝的套件本身就有漏洞,甚至被惡意植入後門。
依賴掃描工具:
npm audit
(Node.js)pip-audit
(Python)safety
(Python)mvn dependency-check
(Java)snyk
(跨語言支援)最佳實踐:
🔸 鎖定套件版本(使用 lock file,如 package-lock.json
、poetry.lock
)。
🔸 定期更新依賴,避免長期停留在高風險版本。
🔸 使用 SBOM(Software Bill of Materials) 追蹤依賴來源。
🔸 套件來源驗證(如 Sigstore / Cosign 簽署)。
進階實務:
🔸PR Gate:若檢測到高風險漏洞,直接阻擋 PR 合併,確保問題不會流入主分支。
🔸分級策略:針對不同風險等級設定規則,例如低風險漏洞允許合併,但需加上提醒標籤。
🔸Artifact 安全:不只檢查程式依賴,還要確保建構出來的 Docker Image 同樣進行安全掃描。
name: Dependency Security Scan
on:
push:
pull_request:
jobs:
depsec:
runs-on: ubuntu-latest
env:
PIP_DISABLE_PIP_VERSION_CHECK: "1"
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install pip-audit
run: |
python -m pip install --upgrade pip
pip install pip-audit
# --- Gate:紅燈預期(這步故意讓有洞即失敗)---
- name: Run pip-audit on requirements.txt (Gate)
id: gate
run: pip-audit -r requirements.txt
# --- 產「排版好的」報告(就算 Gate 失敗也跑)---
- name: Generate pretty JSON report (vuln)
if: always()
run: |
pip-audit -r requirements.txt -f json -o - \
| python -c 'import sys,json; print(json.dumps(json.load(sys.stdin), indent=2, ensure_ascii=False))' \
> pip-audit.pretty.json || true
- name: Generate pretty CycloneDX SBOM (vuln)
if: always()
run: |
pip-audit -r requirements.txt -f cyclonedx-json -o - \
| python -c 'import sys,json; print(json.dumps(json.load(sys.stdin), indent=2, ensure_ascii=False))' \
> sbom-cyclonedx.pretty.json || true
- name: Upload artifacts (pretty only)
if: always()
uses: actions/upload-artifact@v4
with:
name: pip-audit-vuln-pretty
path: |
pip-audit.pretty.json
sbom-cyclonedx.pretty.json
# 綠燈對照;即使 depsec 失敗也會執行
depsec_fix_verify:
if: ${{ always() }}
needs: depsec
runs-on: ubuntu-latest
env:
PIP_DISABLE_PIP_VERSION_CHECK: "1"
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install pip-audit
run: |
python -m pip install --upgrade pip
pip install pip-audit
- name: Run pip-audit on requirements.patched.txt (Should pass)
run: pip-audit -r requirements.patched.txt
- name: Generate pretty JSON report (patched)
if: always()
run: |
pip-audit -r requirements.patched.txt -f json -o - \
| python -c 'import sys,json; print(json.dumps(json.load(sys.stdin), indent=2, ensure_ascii=False))' \
> pip-audit.patched.pretty.json || true
- name: Upload artifact (pretty only)
if: always()
uses: actions/upload-artifact@v4
with:
name: pip-audit-patched-pretty
path: |
pip-audit.patched.pretty.json
設計兩個Job,一個是故意讓他出錯失敗,另一個是讓他成功通過。
🔸pip-audit.pretty.json
dependencies: 被掃描到的套件清單。
每個套件有 name(套件名)、version(你現在的版本)、vulns(該版本命中的弱點)。
vulns 裡面每一筆:
🔸sbom-cyclonedx.pretty.json
依賴與套件安全是 DevSecOps 的基礎工,就像建築物的地基一樣重要。
再強大的應用程式,如果基礎依賴有漏洞,都可能被攻破。
因此:
1.使用 自動化工具 持續檢查依賴漏洞。
2.建立 版本管理與更新策略,避免停留在高風險版本。
3.推動 SBOM 與簽章驗證,確保軟體供應鏈可信。