Skip to content

[Security] report_feedback 接口缺少 HTML 输入过滤(Stored XSS 风险) #98

@mingcha-dev

Description

@mingcha-dev

问题描述

report_feedback MCP 工具的后端仅做 Pydantic 长度校验(10-2000字符),不过滤 HTML 标签<script> 等危险内容会原样存入数据库。

风险等级:P0

虽然前端(React + Ant Design)默认对 JSX 表达式做 HTML 转义,但以下场景可能导致 XSS 攻击成功:

  • 使用 dangerouslySetInnerHTML 渲染反馈内容
  • Ant Design 组件的自定义 render 使用 innerHTML
  • 未来前端重构或引入富文本组件

即使前端当前安全,后端不过滤本身就是 defense-in-depth 的缺失。

潜在攻击链

  1. 攻击者获取有效 API token
  2. 通过 report_feedback 提交包含 <script> 的恶意 payload
  3. 管理员在后台查看反馈内容时触发 XSS
  4. 攻击者获取管理员 session/cookie → 权限提升

复现步骤

  1. 调用 report_feedback 工具,feedback_message 参数包含 <script>alert(1)</script>
  2. 观察后端接受并存入数据库(无过滤)
  3. 在管理后台查看该反馈记录

修复建议

  1. 后端输入侧 sanitize:对 feedback_message 字段 strip HTML 标签和事件属性(建议使用成熟的 sanitize 库而非正则黑名单)
  2. 前端渲染路径审查:确认反馈内容渲染未使用 dangerouslySetInnerHTML
  3. 存量数据清理:修复后清理数据库中已存在的含 HTML 标签的反馈记录
  4. 自动化回归测试:CI 中加入 XSS payload 的回归测试用例,防止后续提交引入回归

发现来源

QA 安全审计(2026-03-28),详见 QA 学习笔记 #16

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingsecuritySecurity related issues

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions