Skip to content

session-start.sh 不重驗常駐 binary — 姊妹 wrapper 已有此防護 #161

Description

@kiki830621

Problem

plugins/macdoc/hooks/session-start.sh 的 sha256 + Developer ID 閘只保護新下載的候選檔;已經住在 ~/bin/macdoc 的常駐 binary 每個 session 被無條件執行,從不重驗簽章。

#(原文此行以 5 秒 alarm 執行 "$BINARY" --version 並將輸出寫入 $PROBE;因含 perl 特殊變數、會誤觸 issue 派送的 mention 防護,改以說明取代,語義不變)
HAVE=$(head -1 "$PROBE" 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)
...
[ "$HAVE" = "$WANT" ] && exit 0   # fast path: version matches, zero network

fast path 只比對版本字串就 exit 0,之後的 codesign 檢查完全不會跑到。而版本字串是常駐 binary 自己印的——被替換過的 binary 只要印出正確版本就永遠通過。下方的 loop-guard sidecar(.macdoc.installed_version)同理。

同 repo 的姊妹 wrapper 已經做了這件事,且註解直指同一威脅:

plugins/che-word-mcp/bin/che-word-mcp-wrapper.sh

# Exec-time re-verification: never exec an unverified binary, even one whose
# sidecar version matches (covers binaries installed by pre-hardening wrappers
# and post-install ~/bin tampering). Failure forces one re-download attempt.
if ! verify_binary "$BINARY"; then

macdoc 的 hook 缺少它姊妹已具備並明文說明的防護。

Type

bug

Expected

--version 探測之前(或至少在兩個 fast-path exit 之前)對常駐 $BINARY 重跑
codesign --verify --strict -R "$REQUIREMENT",與 che-word-mcp wrapper 一致。若判斷每 session 跑太貴,至少採較長的重驗週期,而非永不重驗。

Actual

「驗證過一次 → 從此無條件信任並執行」。檔案 header 宣稱的 fail-closed 契約對安裝成立,對執行不成立。

Impact

需要攻擊者已具備 ~/bin 的本機寫入權,因此不是遠端漏洞——但這是該檔自己宣告的契約沒有真正關上的缺口,且每個 session 都會靜默執行一次未經重驗的 binary。

macdoc CLI v0.6.0 剛透過這條 hook 發布並安裝,因此屬於同一批驗證範圍。

來源:5-reviewer ensemble verification of #158(security lens),已人工比對兩份 wrapper 原始碼確認差異屬實。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions