安全
每個模型產生的工具呼叫都會被分類,然後由實作 Crystal.Tools.ToolInvocationPolicy 的 ApprovalPolicy 決定。副作用不會繞過該執行器被呼叫。
風險值是 read、write、privileged 和 forbidden。權限值是 workspace、outside_workspace、network 和 privileged_escalation。
什麼可以不經提示放行
Section titled “什麼可以不經提示放行”呼叫只有在以下全部成立時才無需審查即放行:
- 分類不要求提示;
- 風險不是 Forbidden 或 Privileged;
- 權限是 Workspace;
- 並且工具在自動工具集中,或風險是 Read,或風險是 Write 且核准模式允許該寫入。
寫入自動放行因模式而異。Full 允許通過了上述檢查的任何 Workspace 寫入,包括保持 Write + Workspace 的已載入外部工具。Edit 和 Review 只允許內建 write 和 edit。Default 不自動放行寫入。Bash、bash_start 和 bash_stop 只在 Full 中自動放行,且僅當它們被分類為 Workspace 寫入時(網路、特權或禁止的命令不會)。
Forbidden 和 Privileged 從不完全自動放行。工作區外和網路權限從不完全自動放行。分類不允許可複用授權時,該授權也會被跳過。Review 可以允許一次呼叫,但 Forbidden 分類或必需的提示仍會回退到你。審查者對 Forbidden 的 Allow 不會執行。
未知工具名稱,包括沒有任何外掛分類器認領的名稱,是 Privileged,權限為 PrivilegedEscalation,摘要為 Unknown tool。
路徑在任一片段是 .ssh 或 .gnupg(不區分大小寫),或 .crystal 片段緊接著 credentials.json 時,是憑證路徑。檢查前會展開 ~。檢查在參數上執行,並再次在解析後的完整路徑上執行。
這些路徑對 read、list、tree、glob、grep、search、describe_image、view_image、write 和 edit 分類為 Forbidden / PrivilegedEscalation。目錄遍歷跳過解析目標是憑證路徑的檔案。工作階段目錄規則不能授予憑證路徑。匯出拒絕它。
缺失或無法解析的路徑參數不會變成 Forbidden。無法讀取的必需 path 分類為工作區讀取。路徑無法解析的寫入或編輯分類為工作區寫入。工作區無法規範化的路徑同樣如此。規範化後位於可存取工作階段目錄之外的路徑是帶 OutsideWorkspace 的 Read 或 Write,不會自動放行。
Shell 命令
Section titled “Shell 命令”bash 和 bash_start 使用同一個命令分類器。匹配不區分大小寫。超過一秒的匹配視為命中,因此逾時會失敗關閉。
| 類別 | 模式(簡化) | 風險 | 權限 |
|---|---|---|---|
| Forbidden | \bsudo\b |
forbidden | privileged_escalation |
| Forbidden | 同時帶遞迴和強制旗標、目標為 /、~、$HOME 或 ${HOME} 的 rm |
forbidden | privileged_escalation |
| Forbidden | 輸出管道到 sh 或 bash 的 curl 或 wget |
forbidden | privileged_escalation |
| Forbidden | 帶 -f 或 --force 的 git push |
forbidden | privileged_escalation |
| Forbidden | 命令文字中的 .ssh、.gnupg 或 .crystal/credentials.json 路徑 |
forbidden | privileged_escalation |
| Privileged | chmod 777、chown、mkfs、dd 、kill -9、shutdown、reboot |
privileged | privileged_escalation |
| Network | 尚未被禁止時的 curl、wget、ssh、scp、nc、nmap |
write | network |
| Other | 任何其他非空命令 | write | workspace |
先測試 Forbidden,然後是特權,然後是網路。什麼都不匹配、或無法從參數讀取的命令,是名為 Workspace shell command 的工作區寫入。
bash_status 和 bash_logs 是工作區讀取(Read background shell task)。bash_stop 是工作區寫入(Stop background shell task),不會根據命令字串重新分類。
- 不允許離開根目錄的工作區工具會拒絕離開它的路徑。可讀工具可以解析外部路徑,然後把它分類為 OutsideWorkspace。
- 寫入或編輯唯讀工作階段目錄會在分類之前被拒絕。模型看到:
Writing to a read-only session directory is not allowed. Change its access with /access. - 在 Plan 中,
edit、write、bash、bash_start和bash_stop在分類之前被拒絕:Plan mode does not allow <name>. - 外掛鉤子可以提高核准風險。它們不能降低它。原始鉤子不受該限制,並在載入時被點名。見外掛。
- 執行時文字是純英文。例外、日誌或介面裝飾中沒有表情符號。
- 秘密不得出現在原始碼、日誌、診斷或提交中。
credentials.json在 Unix 上是擁有者讀寫(0600)。Windows 不改變檔案 ACL。