Skip to content

fix(security): 修复静态文件穿越、默认凭据与令牌混用等严重漏洞 - #33

Merged
239573049 merged 2 commits into
mainfrom
fix/security-hardening
Oct 29, 2026
Merged

239573049 merged 2 commits into
mainfrom
fix/security-hardening

Conversation

@239573049

Copy link
Copy Markdown
Owner

概述

全项目安全审计后修复的严重漏洞,另附管理后台登录滑块验证功能(独立提交 f589dc1)。

修复内容

问题 修复
静态站点 GET //etc/passwd 任意文件读取(无需登录) 路径 GetFullPath 后必须位于根目录内
JWT 密钥硬编码在 appsettings.json,可伪造管理员 token 未配置/历史默认值时按安装随机生成 data/jwt-secret;ClockSkew 30 天 → 5 分钟
默认管理员密码 Aa123456 未配置时生成随机初始密码 data/admin-password,启动日志提示
默认 TunnelToken Aa123456. 可匿名注册/冒用节点 视为未配置并禁用全局注册;常数时间比较;失败延迟;手动创建的节点只认节点密钥
隧道 Route 拼接导致 SSRF(@169.254.169.254) Route 白名单校验
挑战状态可直接当 Bot/风控 clearance 使用 SignedToken 签名绑定 payload 类型
集群邀请码可重复使用、中继关闭 TLS 校验、证书文件名可穿越、令牌非常数时间比较 一次性邀请码、恢复 TLS 校验、Path.GetFileName、FixedTimeEquals
X-Forwarded-For 取最左段可伪造 改取最右段

⚠️ Breaking changes

  • 未设置 PASSWORD 的部署升级后需用 data/admin-password 中的密码登录。
  • JWT 密钥变更,已签发 token 失效,需要重新登录。
  • 使用默认 TunnelToken 的隧道客户端需改用节点密钥或自定义 TunnelToken。
  • 多级代理且客户端 IP 来源选 XFF 时,将取到最近一层代理的 IP。

验证

  • dotnet build 通过;dotnet test 213 个测试全部通过(新增 SecurityHardeningTests)。
  • 本地启动:自动生成 admin-password / jwt-secret(权限 600);旧公开密钥签发的 JWT 返回 401,新密钥返回 200。
  • npm run lint 未通过:主分支已有 125 个问题,本 PR 涉及的前端文件中 4 处 no-explicit-any 为既有问题,需另行处理。

未包含(后续跟进)

可信代理列表、隧道 Domains 白名单、文件管理接口限制根目录、证书 PFX 固定密码、502 错误详情泄露上游地址、IPv6 地区黑名单、/api/v1/system/info 匿名访问、MessagePack 3.1.8 已知漏洞(GHSA-qhrr-8q5h-9q3h)。

🤖 Generated with Claude Code

239573049 and others added 2 commits October 29, 2026 08:59
- 新增自研滑块验证码(服务端渲染 PNG,票据一次性、绑定 IP、2 分钟过期)
- 滑块失败与密码失败共用登录锁定计数
- 风控设置新增 AdminLoginSlider 开关,登录页接入滑块组件

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 静态站点:请求路径解析后必须位于根目录内,修复 //etc/passwd 等任意文件读取
- SignedToken 签名绑定 payload 类型,挑战状态不能再当作 Bot/风控 clearance 使用
- JWT 密钥未配置或为历史默认值时按安装随机生成(data/jwt-secret),ClockSkew 改为 5 分钟
- 未配置管理员密码时生成随机初始密码(data/admin-password),不再回退 Aa123456
- 默认 TunnelToken 视为未配置并禁用全局注册;常数时间比较,失败延迟;手动创建的节点不能被全局 Token 冒用
- 隧道 Route 白名单校验,防止 http://node_x@host 形式的 SSRF
- 集群:邀请码一次性使用、令牌常数时间比较、中继隧道恢复 TLS 校验、证书文件名防穿越
- X-Forwarded-For 改取最右段,避免客户端伪造 IP
- 修正部署文档中 JWT 配置节名(JwtOptions → Jwt)

BREAKING CHANGE: 未设置 PASSWORD 的部署升级后需使用 data/admin-password 中的密码登录;
使用默认 TunnelToken 的隧道客户端需改用节点密钥或配置自定义 TunnelToken。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@239573049
239573049 merged commit 739957d into main Oct 29, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant