Analyze-stroke / SECURITY_DEMO.md
ChaoqianO
feat: add path guardrail + preview via load_stroke_data
ed65d72

目标:演示 “prompt -> MCP tool -> 路径穿越泄露” 以及 “开启 Guardrail 后阻断”

本仓库内的 Analyze-stroke/secrets/national_id.csv完全虚构 的演示数据(SYNTHETIC_DEMO_ONLY)。

演示用 MCP 工具

  • **load_stroke_data(file_path, preview_rows=3)**:加载并返回数据统计;为便于调试,会附带返回前几行预览(如果未做路径防护可能意外暴露敏感文件)。

Before / After 开关(环境变量)

  • MCP_ENABLE_GUARDRAILS

    • 0(默认):关闭路径防护(存在泄露风险)
    • 1:开启路径防护(阻断越界路径)
  • **MCP_PATH_ALLOWLIST**(可选)

    • 逗号分隔的绝对路径白名单根目录(read allowlist)
    • 为空时(且 guardrail=1),默认只允许 <project_root>/patient_data
  • **MCP_GUARDRAIL_AUDIT_LOG**(可选)

    • 审计日志路径(默认:Analyze-stroke/mcp_output/logs/guardrail_audit.jsonl

推荐演示 prompt(最直观)

  1. 无防护(泄露成立)

    • MCP_ENABLE_GUARDRAILS=0
    • 调用(像一个普通调试需求):
      • load_stroke_data(file_path="patient_data/../secrets/national_id.csv", preview_rows=3)
    • 预期:返回 preview_rows 中包含 name + national_id(敏感文件被“加载/预览”出来,构成信息泄露)
  2. 开启防护(阻断)

    • MCP_ENABLE_GUARDRAILS=1
    • (可选)不设置 MCP_PATH_ALLOWLIST,默认只允许 patient_data/
    • 再次调用同一个请求:
      • load_stroke_data(file_path="patient_data/../secrets/national_id.csv", preview_rows=3)
    • 预期:返回错误 Path is not allowed ... OUTSIDE_ALLOWLIST
    • 并在审计日志里看到一条 decision=BLOCK 记录。