From 68da769c1b5874d262c4b3f0f7e5b6aa18a92bbe Mon Sep 17 00:00:00 2001 From: uncle6me-web Date: Sat, 6 Jun 2026 19:11:28 +0800 Subject: [PATCH] =?UTF-8?q?fix(harness):=20guard=20hook=20=E5=8D=80?= =?UTF-8?q?=E5=88=86=E3=80=8C=E5=9F=B7=E8=A1=8C=20acr=20push=E3=80=8Dvs?= =?UTF-8?q?=E3=80=8C=E5=B1=95=E7=A4=BA=E6=8C=87=E4=BB=A4=E3=80=8D=EF=BC=88?= =?UTF-8?q?=E5=A3=93=E6=B8=AC=20=C2=A79.5=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 舊版 grep "acr push" 連「在 echo/heredoc 裡提到 push 字串」都擋, 導致 CC 連「把可貼上的指令印給使用者看」都做不到 → 反而違反 user-cc-harness §0.5「擋下必須印出正路」自身鐵則(連選②都印不出)。 修法(啟發式,誠實標明非完美,mindset §7): - awk 抽掉 heredoc 主體 → 剩下「實際執行命令列」才看 push 是否在命令位置 (行首 / ; & | && ||)。真執行擋、純展示放行。 - block 訊息補上選②可貼指令(符合 §0.5)。 - shell 層無法 100% 區分執行/展示,偷渡(bash< --- cli/harness/hooks/arcrun-guard.sh | 42 ++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/cli/harness/hooks/arcrun-guard.sh b/cli/harness/hooks/arcrun-guard.sh index e279d31..cf7388a 100644 --- a/cli/harness/hooks/arcrun-guard.sh +++ b/cli/harness/hooks/arcrun-guard.sh @@ -28,10 +28,46 @@ block() { # ── 硬擋:未經人類同意的暴露動作(明確越界,mindset §5)────────────── # 非互動環境下 CC 自己跑「部署對外 webhook / push recipe」= 替人類決定公開。 +# +# 壓測 §9.5 修正(A6):舊版 grep "acr push" 連「在 echo/heredoc 裡**提到** push 字串」 +# 都擋 → CC 連「把可貼上的指令印給使用者看」都做不到,反而違反 §0.5「擋下必指正路」鐵則。 +# 故先判斷此命令是「展示指令」還是「真的執行 push」,只擋後者。 +# +# 誠實限制(mindset §7):shell 命令層**無法 100% 乾淨區分**「執行」與「展示」 +# (例:`echo "跑 acr push"` 與 `acr push` 對單純 grep 都命中)。以下是**啟發式**, +# 目的是降低誤殺、讓「印出正路指令」這條合法用途能通,不是完美防護。邊角情況可能漏判, +# 但漏判方向是「偏向放行展示」——而真正的暴露(執行)仍受 TTY/env 把關。 if echo "$CMD" | grep -qE "acr (push|recipe push)\b"; then - if [ ! -t 0 ] && [ "${ARCRUN_HUMAN_CONFIRMED:-}" != "1" ]; then - block "在非互動環境自動執行暴露動作(acr push / recipe push 會讓東西可被外部呼叫)" \ - "把這動作交給人類在終端機執行,或先讓使用者明示同意。不要替使用者決定公開。" + # 目標(壓測 §9.5):擋「真的執行 push」,放行「把 push 指令印給使用者看」。 + # + # 作法:把 heredoc 主體(cat/印出用的多行文字)先抽掉,剩下的才是「實際會被 shell 執行的命令列」, + # 再看 push 是否出現在那裡的「命令位置」(行首 / ; & | && || 之後)。 + # 執行 → 命中:`acr push x`、`cd f && acr push x`、`echo done; acr push x` + # 展示 → 不命中:`echo "跑 acr push x"`、`cat <\`。或使用者先在對話明示同意後親自於終端機執行。不要替使用者決定公開。" + fi fi fi