omoji-personal/torque

GitHub: omoji-personal/torque

Torque 是一个在工具层面约束 AI 代理安全操作 Salesforce 的防护层,防止代理在自主会话中意外写入或破坏生产环境数据。

Stars: 0 | Forks: 0

# 扭矩 **让 AI 代理操作真实的 Salesforce org —— 且无法让其自行向生产环境写入数据。** 前沿的编程代理现在可以直接运行 Salesforce 操作:查询、部署、运行 Apex、移动 数据。这确实非常有用,但也确实非常危险 —— 同一个修复流程的会话,可能 会因为一个错误的别名,向客户的生产 org 写入数据。仅仅告诉代理要小心是 约束不了它的。Torque 就是那个能起到约束作用的层。 ## 3秒内见效 —— 无需 org、无需凭证、零风险 ``` git clone && cd torque python3 bin/torque-demo ``` 通过真实的 hook 运行的真实攻击: ``` Shell indirection The gate never sees the literal word `sf` — it is assembled at runtime. DENIED x=sf; $x data delete bulk --sobject Account --target-org acme-prod variable-assembled command → Salesforce operation hidden in a shell assignment value DENIED s$'\x66' data delete bulk --sobject Account --target-org acme-prod ANSI-C hex escape spells 'sf' → indirect command invocation cannot be authorized — call `sf` literal Path expansion A glob or variable that only becomes the secret's path when bash expands it. DENIED cat /Users/you/.tor*/secret glob reaches the signing secret → reference to the trust anchor (~/.torque) — secret and tokens are operator-only DENIED p=$HOME/.torque;cat $p/secret path assembled through a shell variable → reference to the trust anchor (~/.torque) Overwriting the gate itself Disable the hook and everything downstream is ungated. DENIED : >hooks/lib.py >/tmp/z two redirects; bash truncates BOTH → write to a protected path: hooks/lib.py DENIED git checkout HEAD~5 -- hooks/ restore an older, weaker gate from git → git checkout targeting protected paths Normal work is untouched A gate that blocks real work gets turned off. These all run. allowed sf data query --query "SELECT Id FROM Account" --target-org any-org allowed grep -rn 'sf data delete --target-org' . allowed sf project deploy start --dry-run --manifest p.xml --target-org acme-prod all 24 behaved correctly ``` 这里的每一次攻击都是通过对该代码早期版本的对抗性审计发现的,并且 现在已成为永久的回归测试固定数据。最后一部分与其余部分同样重要:**一个阻碍 正常工作的 gate 会被关掉。** ## 它是如何起效的 —— 五个层级 1. **凭证。** 以只读方式连接生产环境。Torque 不存储任何 org 凭证;`sf` CLI 是 唯一的凭证路径。(它确实会创建一个本地签名密钥,`~/.torque/secret`, 这正是使批准 token 不可伪造的原因。) 2. **基于身份而非推断的授权。** 只有当非生产环境的写入目标在明确的 allowlist 中 **并且** 在写入的瞬间通过*实时* org 查询将其归类为非生产环境时(绝不依赖别名或 URL 猜测),该写入才会被允许。 3. **确定性 gate。** 两个 PreToolUse hook 共享一个支持扩展的解析器。它们通过*解析 argv* 进行授权并默认拒绝 —— 因此间接调用、分组、包装器、解释器、粘合 重定向、旧版 `force:data:*` 动词以及 glob/`$var` 路径技巧都会被拒绝,而不会 靠猜测。破坏性操作和匿名 Apex 需要操作员在场、HMAC 签名的 一次性 token。**代理可以请求批准;通过其工具层面,它可证明无法伪造 token。** 崩溃的 gate 会拒绝而不是放行。 4. **生产环境覆盖 —— 是刻意为之,而非不可能。** 实际工作包括部署到客户的 生产环境。`torque approve --prod` 会生成一个一次性 token(你需要在真实的终端中输入 `WRITE PRODUCTION`);`torque approve --session ` 会打开一个有限的、可撤销的窗口。 每一次生产环境写入都会被审计。 5. **经过验证的强制执行。** 每一条规则都被标记为 hook 强制执行、harness 强制执行或 由模型遵守 —— 并且这些标签是经过*检查*的,而不是装饰性的。 ## 在你自己的 org 上运行它 前置条件:[Claude Code](https://claude.com/claude-code)(hook 是它的 PreToolUse 层面), `git`,`python3` ≥ 3.11,[Salesforce CLI](https://developer.salesforce.com/tools/salesforcecli) ≥ 2.60, 以及任何非生产环境的 org —— [免费的 Developer Edition](https://developer.salesforce.com/signup) 即可。 (`node` 是可选的;它仅影响实时浏览器检查。) ``` sf org login web --alias my-dev-org python3 bin/torque init my-dev-org # verifies the org is NOT production, then configures npm install # optional: only the live browser check needs this python3 harness/validate.py --profile release --target-org my-dev-org ``` 跳过 `npm install`,一切依然会运行 —— 浏览器检查会报告 `BLOCKED` 并附带注明日期的 原因,结论将是 `DEGRADED` 而不是 `PASS`。这是刻意为之的:一个无法运行的检查 永远不会被报告为绿色(通过)。 `torque init` 拒绝将生产环境的 org 加入 allowlist,在 repo 之外创建信任锚点, 并在告诉你它已生效之前证明 gate 是起约束作用的。allowlist 是刻意不随包发布的: 你可以向哪个 org 写入数据,是一个只有坐在键盘前的人才能做出的决定。 然后在 Claude Code 中打开该文件夹并开始工作。这些 hook 会在每次工具调用时触发。 ## 为什么你可以相信它 Torque 验证自己的方式与它验证 Salesforce 工作的方式相同。`--profile release` 运行: - **128 个对抗性测试固定数据** —— 审计中发现的每一类攻击,每一个都是一个命名的、 可运行的测试。 - **11 个突变测试** —— 每个测试会暂时削弱一个防护,并*要求*相应的 攻击必须成功(或者,对于静态扫描器,要求检查必须 FAIL)。一个不可能失败的检查证明不了什么;这些测试证明了每个防护都是承重部件。其中七个在任何克隆版本上都能运行; 另外三个测试干净 IP 扫描并需要私有模式列表,因此它们会报告为 仅限操作员运行,而不是假装通过;第十一个需要 `--target-org`,因为 它削弱的检查会查询某个 org。被跳过的突变器永远不会被报告为已捕获。 - **针对你的 org 的实时能力循环** —— 部署一个字段,通过 SOQL 验证它,验证 字段级安全性,将其硬删除,确认零残留;一次带有有效撤销机制的批量更新; 一次真实的无头 Lightning 渲染。 - **发布 gate** —— 代理层面的 token 生成必须失败,并且七种绕过形态必须被拒绝。 这套安全设计在代码存在*之前*,就通过九轮多模型审计推动到了收敛状态,随后构建好的 gate 又经历了四轮独立的对抗性测试 —— 一位 shell 语义审查者,一位*执行*了针对真实 `sf` CLI 的每种漏洞利用的审查者,以及一位架构怀疑论者 —— 外加两次确认测试。大约发现了 55 个真实漏洞并已修复;每一个都是 一个测试固定数据。整个轨迹记录在 [`harness/VALIDATION.md`](harness/VALIDATION.md) 中。 ## 指南 [`guide/Torque-Guide.pdf`](guide/Torque-Guide.pdf) —— 14 页:它的功能、为什么它不是 MCP 服务器、设置说明、梳理过的操作、安全模型、故障排除 以及 harness 如何证明自身。 ## Torque *不*主张什么 这些 gate 约束的是代理的**工具层面**(Bash / Edit / Write / Read / MCP)。它们能确切地阻止意外发生,并击败可枚举的规避手段。它们**不**主张能够阻止同一用户的执行者跳出该层面去执行任意代码 —— 例如使用定制程序伪造登录会话,通过操作系统读取签名密钥,或者让代理编写并运行脚本, 从而使得 `sf` 作为子进程执行,而 hook 根本看不见。 对于这些情况,承重防线是第 1 层:以只读方式连接生产环境,并且绝不在 自主会话中让生产环境的 org 保持已验证状态。正确关闭子进程通道需要 一个在 `exec` 之前进行分类的 PATH 级别 shim —— 这是 v2 的路线图,目前尚未 构建。说明这一点才是关键:你无法复现的安全主张只是营销,而不是安全。 **找到了突破的方法?** 这正是重点所在 —— 套件中的每一个固定数据的存在,都是因为某次审查击败了这段代码的早期版本。请参阅 [`SECURITY.md`](SECURITY.md) 了解发送途径。 ## 它不是什么 不是 CI/CD pipeline(Gearset、Copado)。不是 org 内的代码生成 IDE(Agentforce Vibes)。不是命令 库(sfdx-hardis —— 很好的现有技术;Torque 可以建立在它之上)。它是这些类别 未曾提供的操作员级安全和验证层。 **完整指南、安全模型和威胁模型:** [`guide/TORQUE-GUIDE.md`](guide/TORQUE-GUIDE.md) **验证日志和审计轨迹:** [`harness/VALIDATION.md`](harness/VALIDATION.md) MIT 许可证。
标签:AI代理, DNS 反向解析, Salesforce, Streamlit, 命令行安全防护, 应用安全, 开发运维, 沙箱, 访问控制, 逆向工具