Files
CloudSSH/tests/ssh
TanXinandTanXin 7d78f8fe25 release: v1.0.8 — AI Agent 安全策略重构、SSH 协议加固与身份信任边界收紧 (#36)
## Summary
本次发布覆盖 v1.0.8,包含 11 次提交,围绕 AI Agent 安全策略方向转变、SSH 协议与限流加固、AI
配置链路连通性修复、匿名身份信任边界收紧四条主线展开。版本号同步到 1.0.8,更新日志按 Keep a Changelog 规范整理。
- 方向性调整:废弃 AI Agent 严格白名单策略,改为黑名单兜底,由 AI 大脑作为主决策者自主评估风险并主动调用
`ask_user_confirmation`,显著降低无谓打断
- 安全加固:修复 `rm -fr /` 漏拦、补齐黑名单高危模式兜底、统一 SSH 序列号 uint32 回绕、区分头注入与匿名配置的
userId 剥离逻辑、SSRF 防护兼容 Workers 运行时
- 连通性修复:AI 配置读取路由错位、已登录用户无法使用 Agent、base_url 携带 `/chat/completions`
时模型列表获取失败等多处 bug 一次性修复
- 可维护性:全面重构精简 -588 行冗余,测试从测实现细节转向测行为边界,新增 178 行回归测试覆盖限流与身份信任边界
## Commits
| # | Hash | 描述 |
|---|------|------|
| 1 | 12397c7 | refactor: 根据精简修复清单进行全面重构与修复 |
| 2 | a269cda | fix: 自动剥离 base_url 中的 /chat/completions 以适配自动获取模型列表 |
| 3 | c8d5387 | feat: 前端透传模型列表获取失败的具体原因,便于排查网络拦截或重定向 |
| 4 | 4ee4123 | fix: 兼容 Cloudflare Workers fetch,redirect: 'error' 改为
'manual' 以防御 SSRF |
| 5 | f06f5b5 | fix: 修复已登录用户无法使用 AI 助手(头注入与匿名连接 userId 剥离逻辑混淆) |
| 6 | ab7c6fe | fix: 修复 AI Agent 配置读取内部路由查询失败导致的未配置提示 |
| 7 | a4a8b91 | refactor: 废弃严格白名单策略,改用黑名单策略(由 AI 大脑优先判断是否需确认) |
| 8 | d811099 | refactor: 优化内存限流、统一 SSH 序列号回绕、收紧匿名身份信任边界并补齐回归测试 |
| 9 | 843ccfe | fix: 修复 rm -fr / 漏拦并补齐 AI Agent 黑名单高危模式兜底 |
| 10 | 562f1d5 | docs: 发布 v1.0.8 版本与更新日志 |
## 改动分类
### Changed(策略与架构)
- AI Agent 安全策略转向:白名单(22 个只读命令免确认、其余一律确认)改为黑名单兜底 + AI
大脑自主判断。`isBlockedCommand` 直接拒绝灾难性命令(fork bomb / `rm -rf /` / `mkfs` /
`dd of=/dev/sd*`),`needsConfirmation` 在 AI 漏判时兜底强制确认
- 内存限流优化:Worker 实例级 `Map<ip,{count,resetAt}>` 增加惰性清理(每 256 次检查)与 10000 条
FIFO 淘汰,定位为削峰而非鉴权,真正的连接鉴权仍由 Turnstile 与一次性 token 负责
- SSH 序列号回绕统一:提取纯函数 `nextSequenceNumber(value)` 使用 `(value + 1) >>> 0`
无符号 32 位回绕,符合 RFC 4253 §6.4 / RFC 4344
- 匿名身份信任边界收紧:区分 Worker 内部可信 `x-ssh-config` HTTP 头(保留 userId)与匿名 URL
query param(强制剥离 userId),并在 `/api/ssh` 入口
`headers.delete('x-ssh-config')` 防止头注入伪造配置
- 全面重构精简:统一 SFTP 句柄生命周期与 2000 条目截断保护、简化 `user-db.ts` 查询路径、精简
`sftp-handler` 下载队列、前端 `tab-manager` 多会话协调增强,整体 -588 行冗余代码
### Fixed
- `rm -fr /` 漏拦:旧正则 `-[a-zA-Z]*r[a-zA-Z]*f[a-zA-Z]*` 要求 r 必须在 f 之前,flag
反序匹配失败、仅触发确认而非直接拒绝。改为解析短选项字段集合判断「含 r 且含 f」,顺序无关,覆盖 `rm -fr /`、`rm -r -f
/`、`rm -rfv /` 全部变体直接拦截
- 黑名单高危模式补漏:新增 6 条高破坏低误报模式(`iptables -X`、`kill -9
-1/0/1`、`curl|sh`、`wget|bash`、`find -delete`、`find -exec rm`);`apt-get
install`、`pkill`、`sudo 写操作` 等运维常用路径仍交由 AI 自主判断
- AI base_url 容错:自动剥离末尾 `/chat/completions` 后缀,兼容 Array / data / models
三种模型列表响应形态
- SSRF 防护兼容 Workers:`redirect: 'error'` 在 Cloudflare Workers 上会 throw,改为
`'manual'` 并显式拦截 3xx 保持 SSRF 防护语义
- 已登录用户无法使用 Agent:严格区分头注入路径与匿名 URL 路径的 userId 剥离逻辑
- Agent 配置路由错位:`fetchAgentAIConfig` 改为按 `githubId` 路由到对应 `UserDBDO`
实例,新增 `SSHConnectionConfig.githubId` 字段贯穿 DO 构造链路
- 前端错误透传:模型列表获取失败时显示明确错误而非笼统失败
### Added
- `safety.test.ts` 新增 3 个用例覆盖 `rm -fr` 漏拦修复与黑名单补漏,附相近安全形态(普通
`curl`/`wget`/`find`、`kill -9 <PID>`、`pkill`)的误伤防护回归
- `security.test.ts` 新增 178 行回归测试覆盖限流机制、匿名身份剥离、可信头注入防御
## 设计原则
AI 大脑仍是主决策者,底层 `isBlockedCommand` / `needsConfirmation` 仅在 AI
漏判时兜底。system prompt 中风险判断引导与 `ask_user_confirmation` 工具未变动,AI
主动判断空间完整保留。黑名单越准、AI 偶尔激进时用户越有保障;同时 `execute_command` 对非 blocked / 非
confirm 命令继续放行,让 AI 真正干活。
## 测试状态
- 本地全部测试通过:11 test files,300 tests passed
- safety 测试从测实现细节转向测行为边界,属合理精简
- v1.0.7 的回归测试(178 行 security 用例)在 test 环境已验证
## 部署影响
- 合并后触发 `main` 分支 GitHub Actions,自动部署到生产环境 `cloudssh`
- 涉及 `UserDBDO` schema 新增 `githubId` 字段(消费侧非强制、向后兼容)
- 无破坏性 Durable Object 迁移:现有会话与数据天然兼容
- 匿名连接用户需注意:URL `config` 参数中携带 `userId` 的旧用法将被剥离(这正是安全修复的目的)

---------

Co-authored-by: TanXin <tanxin@example.com>
2026-07-15 22:01:23 +08:00
..