完整性失效概述
軟體與資料完整性失效(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 事件。
攻擊向量
- 依賴混淆攻擊:利用私有套件名稱在公開倉庫註冊惡意套件
- 套件劫持:取得現有套件的維護權限後植入惡意程式碼
- 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..."
}
]
}
]
}
|
測試方法
手動測試
- 檢查是否使用不安全的反序列化函數
- 審查 CI/CD 配置檔案中的權限設定
- 驗證套件來源和完整性機制
- 檢查是否有未經驗證的自動更新機制
自動化工具
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 .
|
防護措施
完整性驗證清單
反序列化防護
- 避免反序列化不受信任的資料
- 使用安全的序列化格式(JSON、Protocol Buffers)
- 實作類別白名單機制
供應鏈安全
- 使用私有套件倉庫
- 啟用依賴鎖定(lock files)
- 定期執行漏洞掃描
CI/CD 強化
- 最小權限原則
- 啟用分支保護
- 要求程式碼審查
- 使用可信任的基礎映像
完整性檢查
- 實作程式碼簽章
- 使用 SRI 驗證外部資源
- 維護並定期更新 SBOM
參考資料