This commit is contained in:
@@ -0,0 +1,20 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"location": "action.yml:94",
|
||||||
|
"role": "Assassin",
|
||||||
|
"original_finding": "儘量避免將敏感 Token 直接透過環境變數傳遞至 Shell 命令。若必須傳遞,請確保該 Runner 的環境配置已設定遮蔽機制,或使用 GitHub Actions 內建的 `secrets` 處理方式(如 `github.token` 或預先設定好的 Secret Context)來存取,而非直接由外部輸入。",
|
||||||
|
"reason": "Composite action 無法直接讀取呼叫端 secrets context,必須由 workflow 以 input/env 傳入;此處 token 只在 runner 內以 secret 值傳給 curl,且未輸出到 log,屬 CI secret 傳遞慣用模式。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "action.yml:78",
|
||||||
|
"role": "Mage",
|
||||||
|
"original_finding": "建議在 `printf` 使用變數時,確保輸入內容已適當轉義,或者考慮使用將變數內容寫入檔案並透過 `cat` 讀取的方式,避免直接在 `printf` 字串中展開變數。",
|
||||||
|
"reason": "此處使用 printf 的固定格式字串與 %s 參數,且變數皆以雙引號包住;issue/comment 內容中的雙引號不會重新進入 shell 語法解析,因此不會造成 shell 注入或解析錯誤。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "action.yml:85",
|
||||||
|
"role": "Leo",
|
||||||
|
"original_finding": "建議將與 Gitea API 互動的邏輯封裝成一個獨立的 shell script 或另一個獨立的 Action,使此 composite action 的 `runs` 階段更清晰,專注於流程編排而非細節實作。",
|
||||||
|
"reason": "此 action 的核心職責就是產生 AI 回覆並留言到 Gitea issue;目前 inline API 呼叫很短且已包含 URL 驗證、空回覆檢查與 JSON escaping,額外拆成 script/action 對此小型 composite action 並非必要修復。"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -1,122 +1 @@
|
|||||||
[
|
[]
|
||||||
{
|
|
||||||
"level": "critical",
|
|
||||||
"role": "Assassin",
|
|
||||||
"location": "action.yml:99",
|
|
||||||
"problem": "攻擊者可透過惡意控制 `inputs.gitea_server_url` 的內容,發動 SSRF(伺服器端請求偽造)攻擊,將原本應送往 Gitea API 的敏感驗證 Token(`GITEA_TOKEN`)發送到攻擊者控制的外部伺服器,導致 Token 外洩。",
|
|
||||||
"suggestion": "建議在 `run` 命令中增加對 `GITEA_SERVER_URL` 的白名單檢查,確保其僅限於合法的內部 Gitea 位址,或者明確禁止輸入不信任的 URL 前綴。",
|
|
||||||
"is_new": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "critical",
|
|
||||||
"role": "Assassin",
|
|
||||||
"location": "action.yml:94",
|
|
||||||
"problem": "在 Shell 指令中將敏感的 `GITEA_TOKEN` 透過環境變數傳遞給 `curl` 是危險的。若 `run` 命令失敗或是被紀錄至 Runner 的日誌(log)中,可能會導致 `GITEA_TOKEN` 被明文洩露。",
|
|
||||||
"suggestion": "儘量避免將敏感 Token 直接透過環境變數傳遞至 Shell 命令。若必須傳遞,請確保該 Runner 的環境配置已設定遮蔽機制,或使用 GitHub Actions 內建的 `secrets` 處理方式(如 `github.token` 或預先設定好的 Secret Context)來存取,而非直接由外部輸入。",
|
|
||||||
"is_new": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "critical",
|
|
||||||
"role": "Mage",
|
|
||||||
"location": "action.yml:78",
|
|
||||||
"problem": "在處理 `ISSUE_BODY` 或 `COMMENT_BODY` 時,如果內容包含雙引號 (`\"`),而 `$ISSUE_BODY` 或 `$clean_comment` 變數在 Shell 命令中未經轉義直接用於 `printf`,會導致 Shell 解析錯誤,甚至可能造成注入漏洞。",
|
|
||||||
"suggestion": "建議在 `printf` 使用變數時,確保輸入內容已適當轉義,或者考慮使用將變數內容寫入檔案並透過 `cat` 讀取的方式,避免直接在 `printf` 字串中展開變數。",
|
|
||||||
"is_new": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Assassin",
|
|
||||||
"location": "action.yml:85",
|
|
||||||
"problem": "在建立 Prompt 的過程中,直接將未經 Sanitization(清理)的 `ISSUE_TITLE`、`ISSUE_BODY` 和 `COMMENT_BODY` 直接拼接到 Prompt 中。若這些欄位包含惡意 Prompt Injection 內容,可能會導致 AI 模型產生攻擊者預期的不當回覆,甚至規避原本設定的系統指令。",
|
|
||||||
"suggestion": "應對 `ISSUE_TITLE`、`ISSUE_BODY` 等變數進行嚴格的清理,移除可能被用於 Prompt Injection 的控制字元或格式(如換行符號、特殊分隔符號),並在傳遞給 AI 模型前進行檢查。",
|
|
||||||
"is_new": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Bard",
|
|
||||||
"location": "action.yml:14",
|
|
||||||
"problem": "「oauth」這個命名語義過於寬泛且易產生誤導。根據描述,此欄位實際存放的是「Base64 encoded Codex auth.json」,並非單純的 OAuth Token 或設定。命名應當精確反映其內容,以維持程式碼的音樂性與邏輯的一致性。",
|
|
||||||
"suggestion": "建議將輸入名稱改為 `codex_auth_config`,使其命名更為明確、優雅且具備描述性。",
|
|
||||||
"is_new": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Leo",
|
|
||||||
"location": "action.yml:33",
|
|
||||||
"problem": "input 欄位 `gitea_token` 描述寫著 `Gitea Runner Token`,但從後續的使用方式(`curl` 到 API)來看,這其實是 `Gitea Access Token`。這種命名與實際用途不符,未來維護者在設定時會極度困惑,甚至可能放入錯誤權限的 Token。",
|
|
||||||
"suggestion": "將該輸入參數名稱修正為 `gitea_token`(或 `access_token`),並將描述更新為明確指示它是用於 API 授權的 Gitea Personal Access Token。",
|
|
||||||
"is_new": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Leo",
|
|
||||||
"location": "action.yml:85",
|
|
||||||
"problem": "在 `留言 AI 回覆` 的步驟中,直接使用 `curl` 呼叫 Gitea API 來新增留言,這部分邏輯沒有被拆分出來,且與該 Action 的核心邏輯耦合。若未來 API 位址結構或認證方式變更,需要頻繁修改這個 composite action 的定義檔,不利於維護。",
|
|
||||||
"suggestion": "建議將與 Gitea API 互動的邏輯封裝成一個獨立的 shell script 或另一個獨立的 Action,使此 composite action 的 `runs` 階段更清晰,專注於流程編排而非細節實作。",
|
|
||||||
"is_new": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Mage",
|
|
||||||
"location": "action.yml:95",
|
|
||||||
"problem": "對於外部環境變數 `RESPONSE`,如果其內容包含換行符號或其他特殊字元,直接使用 `--arg body \"$RESPONSE\"` 在 `jq` 中雖然可以處理,但若變數值過大或含有特定轉義字符,可能導致 `jq` 解析失敗或產生非預期的 JSON 結構。",
|
|
||||||
"suggestion": "建議在執行 `jq` 前先驗證 `RESPONSE` 是否為空,並確保其正確轉義,或者使用檔案重定向而非直接參數傳遞來構造 JSON。",
|
|
||||||
"is_new": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Mage",
|
|
||||||
"location": "action.yml:97",
|
|
||||||
"problem": "在執行 `curl` 命令時,若 `GITEA_SERVER_URL` 末尾包含斜線 `/`,與後續的 `/api/v1/...` 連接將導致 URL 錯誤(例如 `//api/v1`),使得 API 呼叫失敗。",
|
|
||||||
"suggestion": "請在拼接 URL 前,移除 `GITEA_SERVER_URL` 的結尾斜線,或者使用 Shell 參數擴展確保正確格式,例如 `${GITEA_SERVER_URL%/}/api/v1/...`。",
|
|
||||||
"is_new": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Rogue",
|
|
||||||
"location": "action.yml:40",
|
|
||||||
"problem": "為了修剪字串前後空白,使用了 `printf` 與 `sed` 兩個外部進程,在頻繁執行的 CI 環境中會造成不必要的 CPU 週期浪費。",
|
|
||||||
"suggestion": "建議使用 Bash 原生的參數擴展功能(如 `${clean_comment##*[![:space:]]}`)來修剪空白,以避免啟動外部進程。",
|
|
||||||
"is_new": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Rogue",
|
|
||||||
"location": "action.yml:48",
|
|
||||||
"problem": "將 Prompt 內容先寫入 `prompt.md` 暫存檔再讀取,涉及不必要的磁碟 I/O,浪費了寶貴的執行時間。",
|
|
||||||
"suggestion": "建議移除暫存檔,直接將字串內容透過變數或管線(pipe)傳遞至 `$GITHUB_OUTPUT`。",
|
|
||||||
"is_new": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Rogue",
|
|
||||||
"location": "action.yml:88",
|
|
||||||
"problem": "將 JSON 資料先寫入 `comment.json` 暫存檔再提供給 `curl`,造成了不必要的磁碟 I/O 開銷。",
|
|
||||||
"suggestion": "建議將 `jq` 的輸出透過管線直接傳遞給 `curl` (使用 `--data @-`),以避免寫入暫存檔。",
|
|
||||||
"is_new": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "info",
|
|
||||||
"role": "Bard",
|
|
||||||
"location": "action.yml:51",
|
|
||||||
"problem": "目前的 `sed` 指令透過兩次替換來修剪字串,雖然功能正確,但顯得稍顯冗長,破壞了程式碼簡潔的旋律感。",
|
|
||||||
"suggestion": "可以使用正規表達式的「或」運算子將兩次操作合併,改寫為 `sed -E 's/^[[:space:]]+|[[:space:]]+$//g'`,讓修剪邏輯在單次指令中以更優雅的節奏完成。",
|
|
||||||
"is_new": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "info",
|
|
||||||
"role": "Leo",
|
|
||||||
"location": "action.yml:86",
|
|
||||||
"problem": "在 `留言 AI 回覆` 步驟中,使用 `jq` 產生 JSON 檔後再 `curl`。雖然可行,但在 composite action 的 inline script 中直接處理大量字串和 JSON 結構,缺乏型別檢查或結構驗證,若 `RESPONSE` 包含特殊字元,容易產生難以除錯的執行錯誤。",
|
|
||||||
"suggestion": "確保對 `RESPONSE` 進行嚴格的 escape 處理,或者考慮使用更強健的工具/環境來處理 API 請求,以避免潛在的 injection 或格式錯誤。",
|
|
||||||
"is_new": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "info",
|
|
||||||
"role": "Mage",
|
|
||||||
"location": "action.yml:85",
|
|
||||||
"problem": "使用了 `cat prompt.md` 讀取內容,但如果在步驟間該檔案未成功建立(例如寫入權限問題),`__PROMPT__` 內容將為空,後續 AI 呼叫會收到空提示,產生無意義的結果。",
|
|
||||||
"suggestion": "在 `cat` 之前增加對 `prompt.md` 是否存在且非空的檢查 (`[ -s prompt.md ]`),若為空則提早報錯退出。",
|
|
||||||
"is_new": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|||||||
Reference in New Issue
Block a user