現代軟體開發已經很少「從零開始」,大部分專案都依賴大量第三方套件(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 與簽章驗證,確保軟體供應鏈可信。