Repository navigation
Nfrp v0.5.7
NFrp v0.5.7
第六轮安全审计的修复版本。这轮只打前五轮没碰过的面,找到 8 条问题,全部已修。
高危
1. 凭证重放 —— 时间窗口只铺了 1 条路径
v0.5.6 给主登录加了 ±300 秒时间戳窗口防重放,但同样的凭证在另外几条路径上
也能用,那些路径一处都没有这个检查。实际数了一遍,凭证入口共 6 个,
只有主登录有防护。
实测一年前的报文仍被接受。把工作连接那条打通后是完整双向中间人:
用户的明文落到攻击者手里、回包由攻击者伪造、受害者的服务什么都没有收到。
嗅探门槛很低 —— v1 下工作连接的报文(含凭证)是明文传输的。
修法:不再"到处补一次调用",而是让"校验凭证"和"查新鲜性"成为同一件事。
2. group 负载均衡可跨租户劫持他人公网端口流量
端口组里没有"归属租户"的概念,加入只看组名和密钥。
而官方的 groupKey 是可选的 —— 双方都不配时,组名就是唯一凭据、不需要密钥。
实测:攻击者知道组名后,12 条用户连接里 6 条落到了他的内网服务上
(用户的请求、Cookie、Authorization 全被看走)。服务端日志把这次加入
记成正常的负载均衡扩容,没有任何告警。
修法:端口组记住归属租户,跨租户一律拒绝。按租户判而不是按 run_id
(后者每次重连都变,会把合法的负载均衡打死)。
3. 配了 [[roles]] 也挡不住伪造身份
角色按客户端自报的 user 匹配,服务端不验。而 frp 的 token 是
服务端级共享凭据 —— [[roles]] 存在的理由恰恰是"在共享 token 之上再分权",
所以这个机制完全无法落地。
实测:冒充者拿到了别人的端口段、注册进别人的命名空间、
并以对方身份穿过了 allow_users 白名单。
修法:本版先做诚实告警(启动时明说"这不是租户隔离")。
直接改成按凭据匹配会让所有既有配置静默失效,属独立的架构改动。
假安全比不配更危险,至少先让人知道。
中危
4. visitor 隧道名可被未认证枚举 —— 两条拒绝路径的文案结构不同,
攻击者据此能 100% 准确地判断某个隧道名是否存在,且不需要登录。
5. 匿名连接可把数据送进他人的 stcp 隧道 —— run_id 留空时
"会话存在吗"的检查被整条短路,身份退化成空串,恰好命中了白名单里的 "*"。
6. 配置预检有假绿灯 —— frps --check 放过了 5/7 条"启动必然失败"的配置
(非法 CIDR、非法端口范围…),frpc verify 也放过了"管理界面裸奔"。
被漏掉的恰恰是安全检查。本项目此前已因"假绿灯"栽过一次。
7. http_proxy 插件配了用户名密码就完全不可用 —— 头的值被连同头名
一起小写化,而下游用大小写敏感的 Basic 匹配,永远比不中,认证恒失败。
低危
8. 域名冲突文案泄露他人的代理名 —— 同轮的端口冲突文案已经统一成
不含占用者,这条漏了。
兼容性
官方 frpc 0.71.0 互通已实测通过(登录 + 注册 + 转发),
frps -v / frpc -v 仍输出裸 0.71.0。
三处有意的行为收紧:
- 凭证新鲜性校验铺满全部入口 —— 两端时钟偏差超过
maxClockSkewSecs
(默认 5 分钟)时登录会被拒,错误里会写明偏差多少秒。官方 frpc 零影响。 - 跨租户不能用同组名共享端口 —— 同一租户的多个后端照常成组,
官方"一个运维跑多个冗余后端"的用法不受影响。 - visitor 的
run_id不能留空 —— 官方 frpc 一定带,零影响。
质量
- 699 个自动化测试,0 失败(本轮 +7)
clippy -D warnings0 告警、cargo audit零漏洞- 端到端冒烟 28 / 28
- 元验证:8 条发现全部重新构建后重跑原始攻击脚本 —— 全部打不通
- 退回验证 5/5:把修复退掉,回归测试必须变红
其中退回验证抓到一个覆盖缺口:某条修复有两层,第 1 层让第 2 层不可达,
导致第 2 层没有独立测试 —— 补测后才通过。
本轮没有覆盖的面
7 个审计分工组里 6 组在实证阶段中断,以下面尚未系统审计,
请不要当成"已通过":资源耗尽与 DoS、传输层数据面(KCP/QUIC/WebSocket/p2p/vnet)、
并发与竞态、HTTP/tcpmux/SNI/响应拆分、客户端(本地界面/插件/store)、
ACL 与面板鉴权矩阵。
另有 13 条线索经复核后排除(附反证),包括 v4-mapped IPv6 绕过 ACL、
static_file 路径穿越、v2 跳过握手降级、僵尸连接配额泄漏等。
详见仓库内 SECURITY-FIXES-ROUND6.md。
校验
SHA256SUMS.txt—— 各包 sha256SHA256SUMS.txt.sig—— Ed25519 分离签名release.pub—— 验签公钥(指纹763896b5d759c6cbe1f208c3c35c9f71)
openssl pkeyutl -verify -pubin -inkey release.pub -rawin \
-in SHA256SUMS.txt -sigfile SHA256SUMS.txt.sig