處理 AI review findings 並改寫 Node.js entrypoint #1

Merged
jiantw83 merged 58 commits from ai-review-resolve/20260624102518 into develop 2026-06-24 14:09:27 +00:00
Showing only changes of commit 571e3693da - Show all commits
+60 -58
View File
@@ -3,23 +3,16 @@
"level": "critical",
"role": "Assassin",
"location": "Dockerfile:13",
"problem": "直接將網際網路的腳本經由 pipe 傳送給 shell 執行 (curl | sh) 極度危險,若該網址遭受劫持或供應商被駭,攻擊者可輕易於建置期間取得容器完整控制權。",
"suggestion": "應先將腳本下載至本地,透過 sha256sum 驗證其完整性後,再以 `sh` 執行。",
"is_new": false
"problem": "直接將網際網路的腳本經由 pipe 傳送給 shell 執行 (curl | sh) 極度危險,且缺乏驗證,極易導致容器建置階段遭劫持或執行惡意代碼。",
"suggestion": "應先將腳本下載至本地,透過 sha256sum 或 gpg 驗證其完整性與來源可靠性後,再執行安裝。"
},
{
"level": "critical",
"role": "Assassin",
"location": "Dockerfile:16",
"problem": "從未經驗證的遠端 git 儲存庫安裝插件,或以不安全方式下載腳本,將導致任意程式碼執行風險及構建不一致。",
"suggestion": "必須鎖定特定 commit hash (SHA) 來引用插件,確保所安裝內容符合預期且未遭篡改;並應對下載腳本進行哈希驗證。"
},
{
"level": "critical",
"role": "Mage",
"location": "Dockerfile:17",
"problem": "在 Docker 構建階段直接執行插件安裝並嘗試同時啟用,若網路不穩或遠端服務不可用,構建會失敗,且可能導致環境處於損壞狀態。",
"suggestion": "建議將插件安裝邏輯移至 `entrypoint.sh`,或在 Dockerfile 中增加重試機制與錯誤捕獲(如 `set -o pipefail`)。"
"problem": "從未經驗證的遠端 git 儲存庫安裝插件,若儲存庫內容遭竄改,將導致任意程式碼執行風險。",
"suggestion": "必須鎖定特定 commit hash (SHA) 來引用插件,確保所安裝內容符合預期且未遭篡改。",
"is_new": false
},
{
"level": "critical",
@@ -33,98 +26,107 @@
"level": "critical",
"role": "Assassin",
"location": "entrypoint.sh:20",
"problem": "使用了 `--dangerously-bypass-approvals-and-sandbox` 參數,直接棄守了沙盒防禦機制。若輸入內容可被外部操縱,攻擊者可藉此執行任意指令。",
"suggestion": "移除此危險參數。必須落實沙盒隔離機制與人工審核流程,並對輸入進行嚴格驗證。"
"problem": "使用了 `--dangerously-bypass-approvals-and-sandbox` 參數,這會導致安全沙盒失效,若輸入內容可被操縱,攻擊者可執行任意指令。",
"suggestion": "必須移除此危險參數。應實作嚴格的指令白名單過濾與輸入驗證,並落實沙盒隔離。"
},
{
"level": "critical",
"role": "Maya",
"location": "entrypoint.sh:18",
"problem": "核心邏輯(如 base64 解碼、`codex exec`)缺乏測試案例,無法確保在環境變數缺失、內容損壞或命令執行失敗時的錯誤處理正確。",
"suggestion": "應為相關關鍵邏輯補上單元測試,模擬各種環境變數設定及 `codex exec` 的成功與失敗路徑,並驗證對應的退出碼與檔案處理。"
"problem": "修改了 `entrypoint.sh` 的核心邏輯以執行 `codex exec`,但缺乏驗證執行是否成功的測試案例(例如:當 `OAUTH` 錯誤、`MODEL` 無效或 `codex exec` 本身拋出錯誤時的處理)。",
"suggestion": "應為 `entrypoint.sh` 補上單元測試,模擬各種環境變數設定及 `codex exec` 的成功與失敗路徑,並驗證對應的退出碼。",
"is_new": false
},
{
"level": "critical",
"role": "Leo",
"role": "Assassin",
"location": "entrypoint.sh:17",
"problem": "敏感憑證 (OAUTH) 被直接以 base64 解碼後寫入檔案 (`/root/.codex/auth.json`),且未確保後續清理,導致憑證洩漏風險。",
"suggestion": "確保該目錄權限封閉(chmod 600),並使用 `trap` 指令在腳本結束時自動清除該憑證檔案。"
},
{
"level": "critical",
"role": "Mage",
"location": "entrypoint.sh:17",
"problem": "代碼使用 `base64 -d` 解碼並直接寫入檔案,未校驗該變數是否為合法格式,若失敗則無法確保建置或執行狀態正確。",
"suggestion": "在解碼操作後明確添加檢查機制,若失敗則報錯並中止。"
"problem": "將 `OAUTH` 解碼後直接寫入 `auth.json`,未對內容進行結構化驗證,若內容受污染可導致注入惡意身份驗證設定。",
"suggestion": "在寫入前應針對解碼後的內容進行 Schema Validation,確保其為符合預期的 JSON 格式。"
},
{
"level": "warning",
"role": "Assassin",
"location": "action.yaml:23",
"problem": "將包含認證資訊的 `OAUTH` 透過環境變數傳遞,這使得該敏感資訊易竊取。",
"suggestion": "應透過檔案掛載或專用的秘密管理服務(如 GitHub Secrets)注入,避免透過公開的 Input 或環境變數傳遞。"
"problem": "將包含認證資訊的 `OAUTH` 透過環境變數傳遞,這使得該敏感資訊在容器內的任何進程皆可透過環境變數(如 `/proc/self/environ`)輕易竊取。",
"suggestion": "應透過檔案掛載或將機密寫入至安全路徑後再讀取,避免直接透過環境變數傳遞敏感資訊。",
"is_new": false
},
{
"level": "warning",
"role": "Leo",
"location": "Dockerfile:20",
"problem": "在建置映像檔時直接安裝插件,增加建置時間與複雜度,並引入對遠端 Gitea 的網路依賴。",
"suggestion": "建議將常用的插件預先打包在映像檔中,或透過環境變數配置,減少建置期的網絡依賴。"
"problem": "在建置期透過網路安裝插件,增加建置複雜度、時間,且對外部網路依賴過高,不可重現。",
"suggestion": "建議將插件預先打包在映像檔中,或使用特定版本的 manifest 檔案管理相依性。"
},
{
"level": "warning",
"role": "Mage",
"location": "entrypoint.sh:17",
"problem": "直接將 `OAUTH` 環境變數內容解碼寫入,未校驗 Base64 格式,若格式錯誤會產生損壞的認證檔案。",
"suggestion": "增加對 Base64 格式的初步校驗,明確報錯並終止。"
"problem": "直接將 `OAUTH` 環境變數內容透過 `base64 -d` 寫入 `auth.json`,未校驗該變數是否為合法的 Base64 編碼,導致可能產生損壞檔案。",
"suggestion": "增加對 `OAUTH` 變數是否符合 Base64 格式的初步校驗,並在解碼失敗時明確報錯。"
},
{
"level": "warning",
"role": "Maya",
"location": "entrypoint.sh:22",
"problem": "對於 `GITHUB_OUTPUT` `codex exec` 的處理缺乏測試驗證,無法確保在各種輸入情況下的正確性與失敗處理。",
"suggestion": "應補測試案例驗證各變數狀態下腳本是否正常執行,確保錯誤發生時不發生預期外行為。"
"problem": "對於 `GITHUB_OUTPUT` 的處理與 `codex exec` 的執行結果缺乏測試驗證,導致失敗無法即時報告。",
"suggestion": "應補測試案例驗證各變數設定情況下的執行行為,並將 `codex exec` 的結果納入錯誤報告機制。"
},
{
"level": "warning",
"role": "Rogue",
"location": "Dockerfile:17",
"problem": "拆分為多個獨立的 `RUN` 指令安裝插件,會產生不必要的映像層,增加體積與建置時間。",
"suggestion": "將相關安裝指令透過 `&&` 合併為單一個 `RUN` 指令,以優化映像層數並提升效能。"
"problem": "將安裝插件拆分為多個獨立的 `RUN` 指令產生不必要的映像層,增加體積並減慢建置速度。",
"suggestion": "請將所有安裝插件的 `RUN` 指令透過 `&&` 合併為單一個 `RUN` 指令。"
},
{
"level": "warning",
"role": "Assassin",
"location": "entrypoint.sh:18",
"problem": "雖然有 `chmod 600`,但 `auth.json` 放在 `/root/.codex/` 目錄下,若發生容器逃逸,該敏感金鑰極易被讀取。",
"suggestion": "應使用外掛式秘密管理機制(如 Secret Store),而非將其寫入檔案。"
},
{
"level": "warning",
"role": "Bard",
"location": "action.yaml:4",
"problem": "輸入參數 `oauth` 實質為 base64 編碼的 json,命名易生誤解。",
"suggestion": "建議更名為 `auth_config` 或 `encoded_auth_json`。"
"location": "action.yaml:17",
"problem": "輸出欄位命名為 `text`,但賦值內容為「執行狀態(status)」,語義不符。",
"suggestion": "將欄位名稱改為 `status`,以保持命名與意圖一致。"
},
{
"level": "warning",
"role": "Bard",
"location": "entrypoint.sh:24",
"problem": "輸出變數名稱 `text` 與其賦值內容 `completed`(執行狀態)語義不合。",
"suggestion": "若已同步修改 `action.yaml`,此處應改為 `echo \"status=completed\" >> \"$GITHUB_OUTPUT\"`。"
},
{
"level": "warning",
"role": "Leo",
"location": "action.yaml:6",
"problem": "將 Base64 編碼的認證資訊設為 Action input,導致明文暴露在 Workflow 配置中,難以維護。",
"suggestion": "應改為直接使用 Action 的 Secrets 機制(如 `secrets.CODEX_AUTH`),將認證資訊與設定分離。"
},
{
"level": "warning",
"role": "Rogue",
"location": "Dockerfile:4",
"problem": "在 Dockerfile 中安裝了 git 且未清理,導致映像檔過大。",
"suggestion": "建議在同一層 RUN 指令中以 --virtual 安裝 git,完成後立即刪除。"
"location": "Dockerfile:14",
"problem": "在 Dockerfile 中使用 `curl | sh` 安裝腳本缺乏超時處理,容易導致 build 長時間掛起。",
"suggestion": "在 curl 指令加上 --max-time 與 --retry 參數來防範網路阻塞。"
},
{
"level": "warning",
"role": "Rogue",
"location": "entrypoint.sh:22",
"problem": "在腳本中頻繁進行 I/O 操作(重複寫入 auth.json),缺乏快取檢查。",
"suggestion": "檢查 `$CODEX_HOME/auth.json` 是否已存在且內容一致,避免重複寫入。"
},
{
"level": "info",
"role": "Bard",
"location": "entrypoint.sh:21",
"problem": "因參數過長導致指令行不易閱讀。",
"suggestion": "建議使用反斜線\\)將指令進行分行書寫。"
},
{
"level": "info",
"role": "Leo",
"location": "entrypoint.sh:22",
"problem": "使用 `--dangerously-bypass-approvals-and-sandbox` 屬於技術債,未來稽核難度大。",
"suggestion": "評估在生產環境下是否能移除該參數,或設計更細緻的審查機制。"
},
{
"level": "info",
"role": "Mage",
"location": "entrypoint.sh:22",
"problem": "執行 `codex exec` 後未顯式檢查其返回值,若失敗仍報告成功。",
"suggestion": "在命令後立即檢查退出狀態,確保只有成功時才執行後續邏輯。"
"problem": "`codex exec` 指令參數過多,單行過長,閱讀困難。",
"suggestion": "建議使用反斜線 `\\` 進行斷行,將指令與參數分層對齊。"
}
]