Open Code Review 项目解析知识图谱 / 分组目录 / 工程保障 / 安全设计

安全设计

工程保障高级工程保障G-F · 工程保障

What · 是什么

路径穿越防护(WithinBase+EvalSymlinks)、git grep 拒 '..'、viewer hostGuard 防 DNS-rebind、manifest 哈希不含密钥
FileReader 路径穿越防护:所有文件读取经 pathutil.WithinBase + EvalSymlinks 双重校验,符号链接与 ../ 均无法逃逸仓库根目录
file_read 工具调用设 500 行上限,防止模型读取超长文件造成上下文爆炸与滥用
git grep 操作拒绝 '..' 路径穿越,并拒绝以 '-' 开头的 ref(防选项注入攻击)
viewer 模块的 hostGuard 防 DNS-rebind:读取含源码的 JSONL 时校验 Host 头,避免恶意站点通过 DNS 重绑定窃取本地审查数据
manifest 哈希计算不包含密钥字段,规则清单的完整性校验不会把敏感凭据带入哈希或日志
规则文件采用相对路径解析并防目录穿越,项目规则无法通过构造路径读取仓库外文件
代码本地处理:审查数据不强制上传,隐私可控,适用于涉密代码库

Why · 为什么

原理 · Principle

CLI 工具运行在开发者机器上且会读取仓库文件,路径穿越/符号链接是本地工具被利用的经典入口,必须从源头拦截

模型可能被提示注入诱导读取任意文件,500 行上限与路径白名单是纵深防御的关键一环

DNS-rebind 攻击可让恶意网页读取 localhost 服务数据,viewer 读取含源码 JSONL 时必须防 Host 头伪造

安全设计直接决定该工具能否被用于涉密或私有代码库——本地处理是合规底线

How · 怎么做

路径安全默认内置:无需配置,所有 FileReader 调用自动执行 WithinBase + EvalSymlinks 双重校验,任何逃逸尝试直接拒绝
限制读取规模:模型请求超过 500 行的文件时自动截断,大文件走分片/摘要路径而非全量注入
安全使用 git 相关功能:ref 名称以 '-' 开头或含 '..' 时被拒,避免 --flag 注入与目录穿越
启用 viewer 前确认 hostGuard 生效:验证非授权 Host 头的请求被拒绝,再开放本地端口供浏览器访问
核对 manifest 哈希:校验规则文件完整性时确认哈希计算只覆盖文件内容,不包含其中可能的密钥字段
自定义规则文件使用仓库内相对路径,且解析时受目录穿越防护约束,不要用绝对路径引用仓库外文件

案例 · Cases

代表性案例
审查含敏感业务的私有仓库:数据全程本地处理,无需上传,符合数据隐私要求
恶意仓库防御:打开不受信来源的 PR 分支时,路径穿越与 git grep 注入防护确保模型只能看到仓库内内容
浏览器查看审查结果:viewer 的 hostGuard 拦截 DNS-rebind,恶意网页无法读取本地审查 JSONL
CI 中运行:受控环境 + 路径白名单,即使代码来自外部贡献者也不会逃逸工作目录

反模式 · Anti-patterns

正反实例论证 · Evidence

正例 · Pro
路径穿越防护拦截符号链接逃逸
# 规则文件仅使用仓库内相对路径,如rules: ["rules/go-security.md"]# FileReader 内部自动执行 pathutil.WithinBase + EvalSymlinks 双重校验
即使用户构造含符号链接或 ../ 的路径,读取也被限制在仓库根目录内,不受信 PR 分支无法诱导模型读取仓库外文件。
反例 · Con
自定义规则用绝对路径引用仓库外文件
rules: ["/etc/secret-config.md"]# 或 "../../outside/repo.md"
绕过相对路径约束破坏目录穿越防护,使审查读取范围逃逸仓库,且路径错误时静默失败难以察觉。
正例 · Pro
file_read 500 行上限防止上下文滥用
# 模型请求超大文件时自动截断> file_read: tool_calls.py (truncated at 500 lines)大文件改走分片/摘要路径
500 行上限阻止模型一次性读取超长文件,既防上下文爆炸也压缩注入面,是纵深防御的一部分。
反例 · Con
盲目调高 file_read 上限换取‘审查深度’
# 为审查大文件调高上限甚至禁用截断file_read_max_lines = 100000ocr scan
模型被喂入超大全文,上下文被无关内容稀释且注入面放大,成本与安全双双恶化。
正例 · Pro
hostGuard 拦截伪造 Host 的 DNS-rebind 请求
curl -H "Host: evil.example.com" http://127.0.0.1:PORT/# 403/拒绝响应,非授权 Host 无法读取含源码的 JSONL
启用 viewer 前用非授权 Host 头验证 hostGuard 生效,恶意网页无法通过 DNS 重绑定窃取本地审查数据。
反例 · Con
viewer 开放到 0.0.0.0 且不校验 Host
# 监听 0.0.0.0 或关闭 hostGuardocr viewer --host 0.0.0.0
局域网内其他机器可访问 viewer,DNS-rebind 攻击面重新打开,含源码的审查数据面临被窃取风险。

实践资产 · Assets

源码节选
viewer 服务器节选:路由 / hostGuard 防 DNS-rebind
internal/viewer/server.go · 2089 B

相关边

本节点没有与其他节点的关系边。