Skip to content

fix: 修复 MCP 证书绑定、取消清理与任务生命周期 - #105

Merged
kairowan merged 1 commit into
mainfrom
fix/mcp-audit-20261112
Nov 12, 2026
Merged

kairowan merged 1 commit into
mainfrom
fix/mcp-audit-20261112

Conversation

@kairowan

Copy link
Copy Markdown
Owner

来源

修复 2026-11-12/MCP合并审查/审查报告.md 中的 7 项主要问题和 2 项附加问题。

修复内容

P1 自动签名证书一致性

  • protect_apk 在启动任务前读取输入 APK 与 keystore 证书指纹
  • 未显式设置 runtime_cert_sha256 时,两者必须一致,否则直接拒绝
  • 显式设置时,必须等于最终签名证书;不一致仍拒绝
  • 通过后把绑定的证书固定传给 shield protect,避免载荷绑定与最终签名不一致

P1 iOS 配置参数冲突

  • ProtectIosArgs.config 改名为 ios_config,不再与全局 --config 共用 clap ID
  • 增加“仅 iOS 配置”和“全局配置 + iOS 配置”两条解析回归测试
  • 真实 CLI 探针已确认合法 iOS TOML 不再被当作通用 CLI 配置读取

P2 取消签名残留

  • 每个任务由 MCP 持有私有 TMPDIR
  • 签名、AAB、protect 等 staging 通过 SHELLSMITH_STAGE_ROOT 放到 MCP 持有的任务暂存目录
  • 取消/强杀后由父进程递归清理口令文件和 staging,真实 CLI 探针确认 TMPDIR 与 stage 均不存在
  • Unix 终止进程组;Windows 使用 taskkill /PID <pid> /T /F 回收进程树

P2 同步检查阻塞

  • tools/call 在独立工作线程执行,协议读循环可继续处理取消、状态查询和其他请求
  • 同步检查增加 SHELLSMITH_MCP_SYNC_TIMEOUT_SECS(默认 600 秒)超时并终止 CLI

P2 持锁等待进程退出

  • 子进程退出改为短时间持锁 try_wait 轮询,不再在任务锁内 wait()
  • stdout 提前关闭时仍可及时取消

P2 MCP 退出回收

  • stdin EOF、读错误、exit、shutdown 统一调用 Server::shutdown
  • 取消所有活动任务、等待任务临时目录清理完成,并等待同步检查退出
  • 新增关闭 stdin 后后台 CLI 不再生成输出文件的测试

P2 BYOS 环境泄漏

  • 子进程环境先移除 SHELLSMITH_BYOS_API_KEY、MOCIKA_SHIELD_KS_PASS、MOCIKA_SHIELD_KEY_PASS,再按任务显式注入
  • 普通离线加固不再因父进程预设 BYOS key 而失败

P3 发布说明反引号执行

  • 新增 scripts/render-mcp-release-readme.sh,使用带引号 heredoc
  • Linux/macOS 发布脚本 README 模板改为带引号 heredoc + 占位符替换
  • Windows README 中反引号转义
  • 增加回归测试:模板不得执行 shield 命令,发布工作流必须使用安全渲染脚本

验证

  • cargo fmt --all --check
  • 全量 clippy -D warnings(shield-core / shield-ios / shield-cli / shellsmith-mcp)
  • cargo test -p shellsmith-mcp:17 passed
  • cargo test -p shield-cli:22 passed
  • cargo test -p shield-core:262 passed, 8 ignored
  • python3 -m unittest discover -s scripts/tests:48 passed
  • 真实 CLI 集成探针:
    • iOS 配置不再出现 unknown field project
    • BYOS 预设 key 下普通离线任务不再报缺少 --byos-endpoint
    • 证书不一致在启动任务前被拒绝
    • 取消真实签名后 TMPDIR 与 stage 均被清理

未实机验证

  • Windows taskkill /T /F 进程树回收:已实现,未在 Windows 实机运行
  • 证书一致的完整真实加固成功路径:由 17 项 MCP 测试覆盖;真实探针验证了不一致拒绝
  • iOS 完整 Archive、APK 安装启动、GC/SO/16KB 全矩阵不在本次范围

- 自动签名前校验输入 APK、keystore 与 runtime_cert_sha256 的证书一致性
- 修复 iOS --ios-config 与全局 --config 的 clap ID 冲突
- 为任务提供父进程持有的 TMPDIR/暂存根目录,取消后清理口令与 staging
- 同步检查移出协议读循环并增加超时;取消不再被同步检查阻塞
- 等待子进程改为短锁 try_wait,避免持有任务锁阻塞取消/状态查询
- MCP 退出时取消并回收活动任务与同步检查
- 子进程显式移除继承的 BYOS/keystore 密码环境变量,仅按任务注入
- Windows 取消使用 taskkill /T /F 回收进程树
- 发布说明模板改用带引号 heredoc,避免反引号命令替换
- 补充证书、取消清理、退出回收、BYOS、同步检查等 17 项 MCP 测试
@kairowan
kairowan merged commit 9b93b64 into main Nov 12, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant