安全模型
keymitt 讓代理使用憑證,而值不會進入代理的上下文。這一頁精確說明它能防什麼——以及不能防什麼。
keymitt 防得住的
| 威脅 | 對策 |
|---|---|
| 密碼跑進代理的上下文、對話紀錄或日誌 | 代理只看得到 {{secret:NAME}}。回傳的一切——輸出、回應標頭與內容、檔案內容、錯誤訊息——都會遮蔽:所有密碼的值,加上 base64(任何對齊位置)、各種 URL 編碼、hex 與 JSON 跳脫形式。輸出在大小上限被截斷時,可能是「被上限切斷的密碼開頭」的位元組會先丟掉,所以不會回傳任何片段。 |
| 其他程序看得到密碼 | 絕不放進命令列參數。暫存檔僅限擁有者,執行完覆寫後刪除。 |
| 你不知道的情況下密碼被使用 | 每次使用都要通過代理按不到的視窗核准。視窗先寫密碼與解析後的程式(或目的地),再列出參數、stdin、環境變數、暫存檔與目錄——或方法、網址、標頭與內容開頭——不可見字元一律跳脫。無法完整顯示的請求直接拒絕。 |
| 密碼被交給冒牌程式 | 程式只在 PATH 的絕對路徑目錄中尋找;--command 會存下完整路徑。 |
| 密碼被送到不該去的地方 | 每組密碼各有程式與主機的允許清單。http_request 拒絕網址裡的佔位符與帳密、標頭注入、Host 這類傳輸標頭、非 HTTP(S) 協定與重新導向,並忽略 ~/.curlrc。 |
| 被允許的程式透過環境變數遭劫持 | 變數只能帶密碼、值必須剛好是一個佔位符,而且絕不能是載入器、直譯器、工具、代理伺服器、CA 或 PATH 類的變數。政策可以再固定允許的名稱。 |
| 密碼在指令結束後還留著 | 在 macOS 與 Linux 上,每次執行結束時整個程序群組都會被終止。 |
read_file_redacted 繞過用戶端的讀檔規則 | 只能讀工作目錄與設定的目錄;憑證存放處、金鑰檔、FIFO 與裝置檔一律拒絕。 |
| 一次匯出全部密碼 | 備份與還原只能從命令列執行、需要互動式終端機,而且一律需要強驗證。 |
keymitt 防不住的
這些來自「和代理以同一個作業系統使用者身分執行」這件事本身。
- **擁有不受限 shell 的惡意代理。**它可以繞過 keymitt:直接讀 Linux 的 Secret Service 或 Windows 認證管理員 (任何以你身分執行的程序都可以)、修改
policy.toml,或寫入終端機核准的決定檔。在 macOS 上,其他程式讀取 keymitt 的鑰匙圈項目會觸發系統視窗——門檻比較高,但不是保證。請保持用戶端本身對 shell 指令的權限確認。 - **被核准的程式拿到密碼後做了什麼。**參數與 stdin 決定它去哪裡——兩者都在視窗裡,請看清楚。API 呼叫優先用有主機限制的
http_request。絕不要把 shell 或直譯器加進允許清單。 - 會從工作目錄讀設定的程式,例如讀
.git/config的git。視窗上會顯示目錄;在不信任的 repository 裡要小心。 - 弱驗證只確認意圖、不驗證身分。用
allow_weak = false或method = "native"可以禁止。 - polkit 的視窗本身是通用訊息;在 Linux 上,細節會在它之前以通知顯示。
- **
read_file_redacted的遮蔽不是安全邊界。**允許目錄裡格式特殊的憑證仍可能被顯示;請別把憑證檔放在可讀目錄裡。 - **被轉換過的值。**程式把值雜湊、加密、反轉、換行或拆開,遮蔽就抓不到。
- **Windows 的程序樹。**執行結束時只會終止直接的子程序。
- 作業系統帳號或鑰匙圈本身被入侵。
設計決定
- MCP 伺服器只在啟動時讀一次政策,而且從不寫入。代理沒有任何工具能改政策或核准設定。
- 預設不快取核准。設定
ttl_secs時,也只記住「位元組完全相同、而且解析到同一支程式」的請求。 - 在驗證視窗按取消就拒絕請求;不會改用較弱的方式重試。
- 每次決定都記錄
elapsed_ms,不合理的快速核准在稽核紀錄裡一眼就看得出來。 - 輸入有上限:參數、stdin、每個暫存檔與請求內容各 1 MiB。
- 每個請求才從鑰匙圈讀值,用完就丟。代入後的模板與備份明文使用會自動清零的緩衝區。
testing建置功能絕不能在要安裝或散布的版本裡開啟。
發佈與安裝程式
發佈用的壓縮檔由 GitHub Actions 建置:action 鎖定 commit、建置工作只有唯讀權杖、不用建置快取。每個版本都附 SHA256SUMS.txt 與簽章的建置來源證明(gh attestation verify <壓縮檔> --repo walisayu/keymitt)。一鍵安裝程式會驗證 校驗碼、拒絕明文 HTTP、解壓前逐一檢查壓縮檔路徑且只取出執行檔;shell 版的下載被截斷時什麼都不會執行。
回報漏洞
請透過 GitHub security advisories 私下回報,不要開公開的 issue。