Skip to content

fix: 对齐 iOS 工程遍历与实际允许目录边界 - #109

Merged
kairowan merged 1 commit into
mainfrom
fix/mcp-fifth-audit-20261113
Nov 13, 2026
Merged

kairowan merged 1 commit into
mainfrom
fix/mcp-fifth-audit-20261113

Conversation

@kairowan

Copy link
Copy Markdown
Owner

来源

修复 2026-11-12/MCP第四轮复审/复审报告.md 中的 3 项问题。

修复内容

P1 workspace 父目录越界

  • .xcworkspace 检查/保护要求源码根目录(workspace 父目录)也在 --allow-root 内
  • .xcodeproj 检查/保护同样要求源码根目录,因为 CLI 会读取 CocoaPods、Package.resolved 等父目录内容
  • 只允许 bundle 本身时明确返回“iOS 源码根目录不在允许的目录内”,不再扫描同级工程

P1 目录链接内部二次外链

  • collect_ios_projects 遇到目录链接时不再只校验第一层目标,而是按 CLI 的 path.is_dir() 语义继续递归
  • 链接入口名以 .xcodeproj 结尾时按工程处理,不再依赖目标扩展名
  • validate_ios_bundle 也会进入目录链接目标,检查目标内部的 project.pbxproj、scheme 等二次链接
  • 使用 visited 集合处理循环链接

P2 无关失效链接误阻断

  • workspace 扫描只处理 CLI 会消费的对象:
    • 入口名以 .xcodeproj 结尾的链接
    • 指向目录的链接
  • 普通文件链接、失效的非工程链接会被忽略
  • 必需的 project.pbxproj / contents.xcworkspacedata 失效链接仍明确报错

验证

  • cargo fmt --all --check
  • 全量 clippy -D warnings
  • cargo test -p shellsmith-mcp:3 个单元测试 + 35 个集成测试通过
  • cargo test -p shield-cli:22 passed
  • cargo test -p shield-core:263 passed, 8 ignored
  • python3 -m unittest discover -s scripts/tests:48 passed
  • 真实 CLI 探针:
    • 只允许 workspace 时,check/protect 均拒绝并提示源码根目录
    • 允许源码根目录时 workspace 正常
    • 目录链接目标内部的 project.pbxproj 外链被拒绝
    • Alias.xcodeproj -> bundle-no-extension 按入口名识别并拒绝内部外链
    • bundle 内 xcshareddata -> shared -> outside/xcschemes 被拒绝
    • workspace 同级 unused.txt -> missing.txt 不再阻断检查
    • 上一轮文件外链、compat、完整 JSON 报告等用例继续通过

- workspace/project 检查与保护要求源码根目录也在允许范围内
- 目录符号链接按 CLI 语义递归扫描,覆盖链接目标内部的二次外链
- 链接入口名以 .xcodeproj 结尾时按工程处理,不再依赖目标扩展名
- 忽略 CLI 不会读取的无关失效链接,必需工程文件链接仍明确报错
- 增加 workspace 父目录、目录链接、bundle 目录链接和失效链接回归测试
@kairowan
kairowan merged commit 954e638 into main Nov 13, 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