Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .codebuddy/.DS_Store
Binary file not shown.
34 changes: 34 additions & 0 deletions .codebuddy/artifacts/release-note-v2.17.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# CloudBase MCP v2.17.0

## 🎉 新功能

### 文档与知识检索
- `searchKnowledgeBase` 新增 CloudBase 官方文档 `docs` 模式,并把官方文档检索整合进统一入口,检索路径更直接。
- 文档检索能力与技能说明进一步收敛,减少在固定技能文档、OpenAPI 与官方文档之间来回切换的成本。

### 应用认证与权限能力
- 应用认证工具补齐了 publishable key、API key、自定义登录密钥、provider / client 配置等能力,方便在 AI IDE 中直接完成认证准备工作。
- 扩展了 manager-node 5.1 相关的认证与工作流支持,应用认证、权限与环境配置链路更完整。

### 技能与配置体系
- 新增和整理了一批对外 skills 与配置目录,提升多 IDE / 多场景下的能力发现与复用体验。
- 增强了对外规则与 skill 的来源回退与发布一致性,降低规则缺失或链接失效带来的使用摩擦。

## 🐛 问题修复

- 修复 `searchKnowledgeBase` 在官方文档 `docs` 模式下的登录限制,未登录场景也能正常检索文档。
- 修复环境地域与静态域名相关回退逻辑,减少环境查询和托管配置场景下的误判。
- 修复应用认证工具在 action 对齐、ensure 流程与返回提示上的多个问题,降低认证配置出错率。
- 修复 NoSQL 安全规则说明与资源类型边界,避免把数据库规则误用于函数或存储。
- 修复技能发布中的 ClawHub slug、产物路径与版本同步问题,提升对外发布稳定性。

## 📚 文档更新

- 补充函数与云存储安全规则引用,帮助在配置权限时更快找到正确文档。
- 清理公开文档链接与部分重复的 CloudBase 指南内容,减少阅读噪音。
- 更新 MCP 工具说明和生成文档,让工具描述与当前实现保持一致。

## 🔧 维护与工程改进(可选阅读)

- 持续收敛 issue auto-processor、skills mirror、all-in-one 版本同步等维护链路。
- 优化部分发布、校验与自动化流程,为后续版本发布与规则同步提供更稳定的基础。
Binary file added .codebuddy/worktrees/.DS_Store
Binary file not shown.
12 changes: 12 additions & 0 deletions .workbuddy/memory/2026-05-13.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# 2026-05-13

- 分析 CloudBase-MCP `downloadRemoteFile` SSRF 报告:确认 `mcp/src/tools/download.ts` 先 `http.get/https.get` 再做 `isUrlAndContentTypeSafe` 校验,属于真实的 pre-connect 校验顺序缺陷。
- 本地复现实锤:对 `127.0.0.1:18090` 调用时本地监听端收到真实 GET 请求,但工具返回“目标为内网地址”;对关闭端口 `127.0.0.1:18091` 返回 `ECONNREFUSED`,形成 blind SSRF / 端口探测原语。
- 结论建议:不要用“本地 npx 启动/云模式可关闭工具”否定漏洞成立;更准确的表述是本地 MCP 宿主侧 SSRF,影响边界低于云端服务端 SSRF,但仍应修复并在工单里强调前提与影响边界。
- 补充输出:为用户起草了面向 TSRC 的回复口径,主张不否认技术缺陷成立,但强调其为本地宿主侧风险、利用前提较高、增量攻击面有限,不应按高危云端 SSRF 定级。
- 继续收敛表述:建议用户在工单中只陈述“校验时机不够前置、请求可能先于拦截发生、影响限于本地宿主侧”三点,并配合生活化类比说明“先放行后拦截”与“本地宿主侧≠云端暴露面”的区别。
- 从利用方视角补充分析:该问题更像低能力、盲打型本地宿主侧网络触达原语,攻击收益受限于触发链、工具权限、仅 GET 下载语义、结果不可直接回显等条件;适合用“增量能力有限、更多是便利化而非决定性突破”来压低定级。
- 继续为用户润色正式工单口径:重点强化“本地开发/调试场景、攻击面在本地宿主网络而非云端公网服务、利用需满足工具启用与触发链前提、收益主要是有限探测能力”四个点,避免主动下重攻击定性。
- 针对“利用面”表述继续细化:建议把利用拆成前提、能力、收益、边界四段写清,避免只写“有限”但不解释为何有限。
- 新增表述建议:用户希望突出“Agent/MCP 主要运行在本地,且在具备 shell/代码执行能力的使用场景下,其利用价值与 AI 直接诱导发起 curl/自定义请求接近,因此该工具带来的新增攻击能力有限”这一论点。
- 用户进一步希望直接采用“不是 SSRF”口径;建议改写为“本问题不认定为典型 SSRF 类漏洞,更接近本地 Agent/MCP 工具的校验时机问题”,以降低被抓绝对表述漏洞的风险。
23 changes: 23 additions & 0 deletions .workbuddy/memory/2026-05-14.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# 2026-05-14

- 继续分析 CloudBase-MCP `downloadRemoteFile` SSRF 风险修复方案:建议将当前 `isUrlAndContentTypeSafe` 拆为“请求前 URL 安全校验”和“响应后 Content-Type 校验”两段,避免先发请求再拦截。
- 建议修复点:在 `mcp/src/tools/download.ts` 中于 `http.get/https.get` 之前执行 URL 预检;重定向使用 `new URL(location, currentUrl)` 规范化后逐跳重新校验;域名解析建议改为覆盖 A/AAAA 与系统解析语义的方式;补充“127.0.0.1 开放/关闭端口均应在请求前被拦截”的回归测试。
- 用户新增偏好:不希望后续再出现同类安全工单,倾向一次性把“点修复”升级为“通用防复发设计”,后续需明确是仅治理 downloadRemoteFile 还是顺带抽象统一安全校验并排查同类出网点。
- 已完成通用治理落地:新增 `mcp/src/utils/remote-url-safety.ts` 统一做请求前 URL / DNS / 内网地址校验(含 IPv6 mapped IPv4 归一化与 pinned lookup),并让 `mcp/src/tools/download.ts`、`mcp/src/tools/setup.ts` 在发请求前接入;同时新增 `mcp/src/tools/download.test.ts` 回归测试,验证 localhost 开放/关闭端口都会在建连前被拦截。
- 已验证:`NODE_OPTIONS="--experimental-default-type=module" npx vitest run src/tools/download.test.ts` 通过;`npm run build` 通过;基于构建产物复核 `downloadRemoteFile` 对 `127.0.0.1:18090` 不再发请求(hitCount=0),对关闭端口不再暴露 `ECONNREFUSED`。
- 继续补齐 SSRF 防复发收尾:新增 `mcp/src/tools/setup.test.ts` 验证 `downloadTemplate` 能正确处理 307 重定向并复用请求前 URL 安全校验;同步将 `mcp/src/tools/setup.ts` 的重定向逻辑从仅 301/302 扩展为统一处理完整 3xx。
- 继续补强 `mcp/src/tools/download.test.ts`:新增 `::ffff:127.0.0.1` IPv6-mapped localhost 拒绝用例,并将公网成功/重定向用例的 DNS mock 改成兼容 `dns.promises.lookup(..., { all: true })` 的实现,避免仅测试通过但构建阶段 TS 类型失败。
- 本轮最终验证:`NODE_OPTIONS="--experimental-default-type=module" npx vitest run src/tools/download.test.ts src/tools/setup.test.ts` 通过;`npm run build` 再次通过;最终 review 结论为“未发现阻塞问题”。
- 补充全量验证结论:直接跑 `npm test` 仍会受本机 `postcss.config.js` 的 ESM 加载问题影响;改用 `NODE_OPTIONS="--experimental-default-type=module" npm test` 后可越过该问题,但全量套件仍存在与本次改动无关的既有失败(`src/server.test.ts` 等因 `@cloudbase/manager-node` / `tough-cookie` / `psl.mjs` 的 ESM 兼容链路报 `ERR_REQUIRE_ESM`),因此当前适合按“目标测试 + 构建通过”作为本次变更验收依据。
- 后续继续收尾全量测试问题时,重新定位到真正根因不是业务代码,而是测试环境解析条件与宿主配置泄漏:新增 `mcp/postcss.config.cjs` 阻断 Vitest/Vite 向上读取用户主目录 `postcss.config.js`;同时把 `mcp/vitest.config.js` 的 `resolve.conditions` 调整为仅 `node + require`,避免 transitive CJS require 在测试环境里误走 `import/module` 分支触发 `psl`、`uuid`、`is-promise` 等 ESM 入口。
- 同步修复 `mcp/src/server.test.ts`:对 `@modelcontextprotocol/sdk/types.js` 改为 partial mock,保留真实导出并仅覆盖 `SetLevelRequestSchema`,兼容 SDK 新增 `CancelledNotificationSchema` 等导出,避免 mock 过窄导致 plugin registration 用例失败。
- 另做一处小修正:`mcp/src/tools/download.ts` 中 content-type 白名单拒绝错误改为仅返回 `不允许的内容类型`,不再把 URL 安全错误文案混进内容类型拦截结果。
- 本轮最终验证:`cd mcp && npm test` 在默认模式下已通过,结果为 `64 passed | 2 skipped`、`530 passed | 20 skipped`;关键回归集 `src/server.test.ts`、`../tests/esm-import.test.js`、`src/tools/download.test.ts`、`src/tools/setup.test.ts` 也全部通过。
- 已补写一份可续接开发的会话摘要,聚焦 SSRF 防护治理、Vitest/ESM 兼容修复、PostCSS 宿主配置泄漏隔离、`server.test` partial mock 调整,以及最终验证结论,供后续会话直接承接而无需重跑既有任务。
- 已按用户指定 XML 格式完成会话历史摘要,覆盖原始用户请求、关键文件/代码片段、报错与修复链路、最终测试结果,以及“当前可见上下文未展示最初技术任务原文”的边界说明。
- 已在分支 `feature/ssrf-download-governance` 完成提交与 PR 交付:先提交 `db4b99aa`(SSRF + Vitest 修复主提交),创建 PR #709;随后根据 `github-code-quality[bot]` 评论删除 `mcp/src/tools/setup.test.ts` 中未使用的 `https` import,再提交 `e35755ca` 并更新同一 PR。
- 交付前后均做了 fresh verification:`cd mcp && npm test` 两次均通过,结果保持 `64 passed | 2 skipped`、`530 passed | 20 skipped`;PR #709 最终状态为 `mergeStateStatus=CLEAN`,CodeQL / build-and-publish / sync / Continuous Releases 全部成功,无新的 issue 评论或未处理 review 反馈。
- 后续修正 `skills/git-workflows/references/source-commands.md` 中 `version_publish_main` 的过时说明:不再要求交互式执行 `npx bumpp`,改为显式使用 Node 22 的非交互命令 `npx bumpp --release <version|patch|minor|major|pre*> --yes --no-commit --no-tag --no-push --ignore-scripts`;同时记录了当前工作区默认 Node 18 可能导致 bumpp 10 直接报 `styleText` 相关错误,需强制使用 Node 22+。
- 已按用户要求收尾提交本轮改动:纳入 `skills/git-workflows/references/source-commands.md` 的 bumpp 非交互发布说明,以及 2026-05-13 / 2026-05-14 两份工作记忆日志。
- 最终提交链路为两步:先提交 `870efa38 docs(git-workflows): document non-interactive bumpp release`;随后因 pre-commit build 自动刷新 `doc/mcp-tools.md` 与 `scripts/tools.json`,补提 `1f908eac chore(build): refresh generated tool docs`,最终 `git status --short` 已恢复干净。
- 复盘后同步补强 `git-workflows` 技能的 `git_commit` 说明:要求每次提交后立刻检查 `git status --short`,若 hooks/build 生成新的跟踪文件改动,则继续补提 follow-up commit,直到工作区清空,避免“提交成功但仓库仍脏”的假完成状态。
4 changes: 4 additions & 0 deletions .workbuddy/memory/2026-05-15.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# 2026-05-15

- 继续就 CloudBase-MCP `downloadRemoteFile` SSRF 工单口径做分析:建议不要接受“服务端 SSRF / 任意内网文件下载”式放大表述,而应明确界定为本地 Agent / MCP 宿主侧的 URL 校验时机问题;利用面位于本地宿主网络,且在已具备本地 shell / 代码执行诱导能力的场景下,与诱导 AI 直接执行 curl / HTTP 请求相比新增攻击能力有限。
- 结合安全工单模板进一步判断:当前更稳妥的处理策略不是争“误报”,而是承认缺陷成立但强调其为本地宿主侧、影响收敛、增量攻击能力有限的实现问题;对外沟通重点应放在边界与定级收敛,而非否认漏洞存在。
Loading
Loading