OWASP Top 10 - 軟體與資料完整性失效

OWASP Top 10 - Software and Data Integrity Failures

完整性失效概述

軟體與資料完整性失效(Software and Data Integrity Failures)是 OWASP Top 10 2021 中的第八項風險。此類漏洞發生在程式碼或基礎設施未能防止完整性違規時,包括不安全的反序列化、使用來自不受信任來源的套件、以及不安全的 CI/CD 管線。

攻擊者可透過以下方式利用完整性失效:

  • 注入惡意程式碼到軟體更新中
  • 竄改資料或序列化物件
  • 滲透 CI/CD 管線部署惡意程式

不安全的反序列化

反序列化是將序列化資料還原為物件的過程。當應用程式反序列化不受信任的資料時,可能導致遠端程式碼執行(RCE)。

攻擊範例 - Java 反序列化

1
2
3
4
5
// 危險:直接反序列化不受信任的輸入
ObjectInputStream ois = new ObjectInputStream(
    new ByteArrayInputStream(untrustedData)
);
Object obj = ois.readObject(); // 可能執行惡意程式碼

攻擊範例 - Python Pickle

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import pickle

# 危險:反序列化不受信任的資料
data = pickle.loads(untrusted_input)  # 可執行任意程式碼

# 惡意 payload 範例
class Exploit:
    def __reduce__(self):
        import os
        return (os.system, ('whoami',))

安全的反序列化實作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import json

# 安全:使用 JSON 而非 Pickle
def safe_deserialize(data):
    try:
        return json.loads(data)
    except json.JSONDecodeError:
        return None

# 若必須使用 Pickle,限制可反序列化的類別
import pickle
import io

class RestrictedUnpickler(pickle.Unpickler):
    ALLOWED_CLASSES = {'datetime.datetime', 'decimal.Decimal'}

    def find_class(self, module, name):
        full_name = f"{module}.{name}"
        if full_name not in self.ALLOWED_CLASSES:
            raise pickle.UnpicklingError(f"不允許的類別: {full_name}")
        return super().find_class(module, name)

供應鏈攻擊

供應鏈攻擊透過入侵軟體依賴項來散布惡意程式碼。著名案例包括 SolarWinds、event-stream 和 ua-parser-js 事件。

攻擊向量

  1. 依賴混淆攻擊:利用私有套件名稱在公開倉庫註冊惡意套件
  2. 套件劫持:取得現有套件的維護權限後植入惡意程式碼
  3. Typosquatting:註冊與熱門套件相似的名稱

防護措施

1
2
3
4
5
6
# .npmrc - 限制套件來源
registry=https://registry.npmjs.org/
@mycompany:registry=https://npm.mycompany.com/

# 啟用套件鎖定
package-lock=true
1
2
3
4
5
# 使用 npm audit 檢查已知漏洞
npm audit --audit-level=high

# 使用 Snyk 進行深度掃描
snyk test

CI/CD 管線安全

CI/CD 管線是攻擊者的高價值目標,一旦入侵可影響所有部署。

不安全的管線配置

1
2
3
4
# 危險:不驗證外部輸入
- name: Build
  run: |
    eval "${{ github.event.pull_request.title }}"  # 指令注入風險    

安全的管線配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# GitHub Actions 安全配置範例
name: Secure CI Pipeline

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

permissions:
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          persist-credentials: false

      - name: Verify dependencies
        run: |
          npm ci --ignore-scripts
          npm audit --audit-level=high          

      - name: Run security scan
        uses: github/codeql-action/analyze@v3

套件完整性驗證

確保下載的套件未被竄改是防護供應鏈攻擊的關鍵。

使用 Subresource Integrity (SRI)

1
2
3
4
5
6
<!-- 驗證外部資源完整性 -->
<script
  src="https://cdn.example.com/lib.js"
  integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
  crossorigin="anonymous">
</script>

npm 套件驗證

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 產生套件雜湊值
npm pack --dry-run
npm info <package> dist.integrity

# package-lock.json 自動包含完整性雜湊
{
  "packages": {
    "node_modules/lodash": {
      "integrity": "sha512-v2kDE..."
    }
  }
}

程式碼簽章

程式碼簽章可驗證軟體來源及完整性。

GPG 簽章驗證

1
2
3
4
5
6
7
8
# 產生 GPG 金鑰
gpg --full-generate-key

# 簽署發布檔案
gpg --armor --detach-sign release.tar.gz

# 驗證簽章
gpg --verify release.tar.gz.asc release.tar.gz

Git Commit 簽章

1
2
3
4
5
6
# 設定 Git 簽章
git config --global user.signingkey <KEY_ID>
git config --global commit.gpgsign true

# 驗證 commit 簽章
git log --show-signature

軟體物料清單(SBOM)

SBOM 記錄軟體中所有元件,有助於追蹤漏洞和授權問題。

產生 SBOM

1
2
3
4
5
# 使用 Syft 產生 SBOM
syft packages dir:. -o spdx-json > sbom.spdx.json

# 使用 CycloneDX 格式
syft packages dir:. -o cyclonedx-json > sbom.cdx.json

SBOM 範例結構

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
{
  "bomFormat": "CycloneDX",
  "specVersion": "1.4",
  "components": [
    {
      "type": "library",
      "name": "lodash",
      "version": "4.17.21",
      "purl": "pkg:npm/lodash@4.17.21",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "cc6b1..."
        }
      ]
    }
  ]
}

測試方法

手動測試

  1. 檢查是否使用不安全的反序列化函數
  2. 審查 CI/CD 配置檔案中的權限設定
  3. 驗證套件來源和完整性機制
  4. 檢查是否有未經驗證的自動更新機制

自動化工具

1
2
3
4
5
6
7
8
# 使用 Trivy 掃描容器映像
trivy image myapp:latest

# 使用 Grype 掃描 SBOM
grype sbom:sbom.cdx.json

# 使用 OWASP Dependency-Check
dependency-check --project MyApp --scan .

防護措施

完整性驗證清單

  1. 反序列化防護

    • 避免反序列化不受信任的資料
    • 使用安全的序列化格式(JSON、Protocol Buffers)
    • 實作類別白名單機制
  2. 供應鏈安全

    • 使用私有套件倉庫
    • 啟用依賴鎖定(lock files)
    • 定期執行漏洞掃描
  3. CI/CD 強化

    • 最小權限原則
    • 啟用分支保護
    • 要求程式碼審查
    • 使用可信任的基礎映像
  4. 完整性檢查

    • 實作程式碼簽章
    • 使用 SRI 驗證外部資源
    • 維護並定期更新 SBOM

參考資料

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy