Repository navigation
v4.20.0: DNS 重绑定防御、安全审计日志与模型访问控制
优化提升计划第 0 期(安全止血 Wave 2–3)。三个新开关全部安全默认:默认 on/conservative,
不改配置的用户升级后 API 行为不变(零配置升级承诺),每个开关都可显式回退。
安全
- 日志密钥脱敏(Wave 2):
LOG_REDACTION=on(默认)对进入环形缓冲 / proxy.log / 仪表盘
日志页的每条日志按密钥形态打码——Authorization: Bearer/Basic、api-key/x-api-key
键值(含 JSON 引号形态)、裸sk-令牌、query 中的token/key参数统一替换为
[REDACTED];off显式回退。脱敏在控制字符清洗之后执行,用�拆分关键字的
日志注入无法绕过。新增tests/log-redaction.test.ts(10 项)。 - SSRF 重定向阻断(Wave 3):修复真实绕过点——此前唯一的数据面 fetch 未设
redirect,Node 默认 follow,被攻击者控制的上游可用 302 把带凭据的请求引向
169.254.169.254等内网/元数据地址,完全绕过对初始 URL 的白名单校验(回归测试先行
证实:mock 上游 302 → 元数据地址,旧代码真被跟过去直到空闲超时)。现在所有上游请求
一律redirect: 'manual'(数据面 POST + 3 个 GET 出口),默认conservative不跟随;
UPSTREAM_REDIRECT=follow显式放行后逐跳复检:私网/回环/保留地址永不跟随且不受
allowlist 影响,同 host 跳转保留 POST 与请求体,跨 host 跳转剥离Authorization,
链条最多 5 跳。新增tests/upstream-redirect.test.ts(6 项,真实 mock 上游 + fetch mock)。 - DNS rebinding 防护(Wave 3):
DNS_REBINDING_GUARD=on(默认)在每个上游请求出口
做"请求前解析 + 校验"——URL 字面校验只能看 hostname,攻击者域名可先解析公网通过校验、
实际建连时再解析进内网;现在解析结果含私网/保留地址即拒绝(fail-closed),off显式
回退。IP 字面量 / localhost / allowlist 命中主机跳过解析校验(无 rebinding 可能或已
显式信任)。已知残余:lookup 与建连间存在 TOCTOU 窗口,彻底封闭需固定解析结果建连
(自定义 undici Agent),按计划做"请求前校验"档位。新增tests/dns-rebinding.test.ts(8 项)。 - 说明:计划 Wave 1(
safeEqual侧信道修复、usage-history 原子写)在 4.18.x–4.19.x
已先行落地,本版无对应改动。
兼容性
- 三个开关默认值即安全默认:
LOG_REDACTION=on只影响日志显示不影响 API;重定向默认
不跟随——依赖上游 302 跳转的自建镜像用户需显式设UPSTREAM_REDIRECT=follow;
DNS_REBINDING_GUARD=on对 allowlist 命中的自建网关域名不生效(运维显式信任即放行)。
测试
- 新增 24 项测试(10 + 6 + 8),全量 413 项通过(Windows 本机 412 + 1 项既有环境性失败:
admin-key-mask的 .env 隔离用例在本机存在生产.env时必然触发,CI 干净环境全绿);
tsc --noEmit、eslint无错误。