跳到主要内容

安全与权限

RTKHUB 通常部署在测绘、CORS、实验室或单位内网环境。默认目标是便于运维,但生产环境仍需要明确账号、网络、日志和备份策略。

v1.3.0 安全修复(2026-07-03)

v1.3.0 版本修复了多个安全漏洞,包含 2 个 P0 级别(严重)、1 个 P1 级别(高危)和 1 个 P2 级别(中危)的安全问题。

P0-1: 路径遍历漏洞修复

严重漏洞

问题描述:Web API 端点存在路径遍历攻击漏洞,攻击者可通过精心构造的 URI(如 %2F%5c 编码的路径分隔符)访问站点根目录外的文件。

影响范围:所有 v1.2.0 及更早版本

修复措施

  • 实施全局 URI 安全检查,在路径匹配前验证原始 URI
  • 阻止编码路径分隔符(%2F%5c
  • 增强静态资源路径校验,拒绝 ..、反斜杠、盘符和异常 URI

建议:请尽快升级至 v1.3.0 或更高版本

P0-2: 全局配置竞态条件修复

严重漏洞

问题描述:全局配置访问存在竞态条件,多线程并发访问可能导致配置状态不一致。

影响范围:所有 v1.2.0 及更早版本

修复措施

  • 为共享配置状态添加适当的互斥锁保护
  • 序列化所有配置读写操作

建议:请尽快升级至 v1.3.0 或更高版本

P1: Web 缓冲区溢出和会话固定攻击修复

高危漏洞

问题描述

  1. Web 终端和状态处理器存在缓冲区溢出漏洞
  2. 登录时未重新生成会话 ID,存在会话固定攻击风险

影响范围:所有 v1.2.0 及更早版本

修复措施

  • 将所有不安全的 vsprintf/sprintf 替换为有界变体 vsnprintf/snprintf
  • 登录成功后强制重新生成会话 ID
  • 添加会话劫持保护机制

建议:升级至 v1.3.0 以修复此漏洞

P2: 速率限制、日志脱敏和输入验证

中危问题

问题描述

  1. 缺少登录速率限制,易受暴力破解攻击
  2. NTRIP 日志可能泄漏凭据信息
  3. Web API 参数输入验证不足
  4. SCRHUB 脚本路径可能被用于目录遍历

影响范围:所有 v1.2.0 及更早版本

修复措施

  • 实施登录速率限制(每 IP 每 60 秒最多 5 次失败尝试)
  • 对 NTRIP 凭据进行日志脱敏处理
  • 增强 Web API 参数验证
  • 添加 SCRHUB 脚本路径校验,防止目录遍历

建议:升级至 v1.3.0 以获得完整的安全加固

升级建议

所有生产环境用户应尽快升级至 v1.3.0 或更高版本。升级兼容现有配置和数据库,无需额外迁移操作。

详细修复信息请参阅 v1.3.0 Release Notes

首次上线清单

必须完成

上线前必须逐项完成以下操作,遗漏任何一项都可能导致安全事故或数据丢失:

  • 修改首次启动生成的管理员密码。
  • 为日常使用创建独立账号,不长期共享 admin
  • 确认 Web 端口只对可信网段开放。
  • 不把 NTRIP 账号、数据库文件、日志压缩包提交到公开仓库。
  • 定期备份配置、数据库、结果文件和日志。
  • 保留审计日志,便于追踪启停基线、用户变更和终端操作。

角色建议

角色适用对象建议权限
admin系统管理员用户管理、系统设置、基线控制、任务管理、日志查看
operator运维人员启停基线、查看状态、执行授权脚本、查看运行日志
viewer只读用户查看测网、地图、图表和状态,不允许控制操作
建议保留两个管理员账号

生产环境建议最少保留两个管理员账号,避免单个账号丢失后无法维护。

网络暴露

默认 Web 地址为:

http://127.0.0.1:5426
网络暴露风险

如果需要局域网访问,务必遵循以下安全建议:

  1. 只在内网监听或通过防火墙限制来源 IP。
  2. 不直接把 5426 暴露到公网。
  3. 如需远程访问,优先使用 VPN、堡垒机或带认证的反向代理。
  4. 反向代理启用 HTTPS,并保留访问日志。

密码与凭据

凭据处理规范

配置文件可能包含 NTRIP 用户名、密码或专线地址。处理这些文件时遵循:

  • 示例文档使用假账号。
  • 问题反馈前先脱敏 username:password@host
  • 备份文件存放在受控目录,避免同步到公开网盘。
  • 离职、外包交接或项目结束后更换共享数据源密码。

STRHUB 和 EPHUB 的 Web 页面、状态 API、控制台输出和 trace 生命周期日志会对 stream path 中的 NTRIP 用户名/密码做脱敏展示,例如把 ntrip://user:password@host:2101/MOUNT 显示为 ntrip://***:***@host:2101/MOUNT。配置文件本身仍可能包含明文凭证,因此配置、备份和问题反馈材料仍需要按敏感文件处理。

Web 终端风险

Web 终端适合远程排查,但它也是高权限入口。建议:

  • 只允许 admin 或授权 operator 使用。
  • 在生产环境记录每次执行命令。
  • 避免在 Web 终端执行删除、覆盖、批量移动等高风险操作。
  • 对常用巡检动作优先固化为 SCRHUB 任务,减少临时命令。

备份策略

建议至少备份这些内容:

路径内容频率
conf/测网和基线配置每次变更后
SQLite 数据库用户、权限、设置、任务每日
result/POS 结果文件按项目或每日
logs/运行日志、审计日志每日或每周

备份压缩包应标注日期和版本,例如 rtkhub_backup_YYYYMMDD_vX.Y.Z.zip

安全机制详解

前端架构

  • 零框架依赖:纯原生 JavaScript(无 jQuery)
  • 原生 Fetch API:所有 HTTP 请求通过 utils.js 中的 fetchJson() 工具函数
  • 原生 DOM API:使用 document.querySelector() 和标准 DOM 方法
  • 模块化设计:每个页面(monitor、admin、terminal 等)独立 JS 模块
  • 统一通知系统toast.js 提供 showToast()showConfirm() 对话框

XSS 防护

所有用户可控数据(net_namesite_namech.idsol_statconfcmdmsg 等)在通过 innerHTML 插入 DOM 前均经过转义:

  • escapeHtml() — 转义 & < > " 用于文本内容和 HTML 属性
  • escapeAttr() — 额外转义 ' 用于单引号属性
  • escapeJsStr() — 转义 \ ' " < > 用于 onclick 处理器中的 JavaScript 字符串
  • escapeTooltipHtml() — 转义 ECharts 工具提示内容

后端线程安全

Web 终端输出按登录会话隔离。后端使用现有 rtkhub_session cookie 定位当前终端会话,每个会话维护独立的命令上下文、虚拟终端和输出缓冲区。不同浏览器或重新登录后的会话不会互相抢占 /api/term_read 输出。

Web 终端会话表和缓冲区访问由平台原生互斥锁保护:

平台互斥锁
WindowsCRITICAL_SECTION
Linuxpthread_mutex_t

所有访问点(vt_printf()web_terminal_append()web_terminal_read()web_terminal_cleanup())均已序列化。

缓冲区溢出防护

所有外部数据的 vsprintf / sprintf / strcpy 调用已替换为有界变体:

函数 / 路径原始调用安全替换
vt_printf() 终端路径vsprintfvsnprintf
build_global_log_path()strcpy / sprintfsnprintf
prstatus() RTCM 格式化sprintfsafe_append() 辅助函数(带截断钳位)
main()cmd_quickstart() 参数解析strcpysnprintf(带截断检测,溢出时报错)

JSON 注入防护

reply_json_error() 等 JSON 构建已迁移至 yyjson 库,由库内置的字符串转义保证 JSON 安全编码。

SCRHUB 任务接口对 JSON 字段采用键名级匹配,避免请求体字符串值中的同名文本被误识别为字段名。

SCRHUB 脚本路径保护

SCRHUB 只允许执行 script/ 目录下的相对脚本路径。新建、更新和执行任务时都会校验路径,拒绝 ..、绝对路径、盘符、冒号、控制字符和常见 shell 元字符,防止通过任务配置越权执行目录外文件。

URI 与静态资源路径保护

嵌入式 Web 服务会校验静态资源路径,拒绝 ..、反斜杠、盘符和异常 URI。EPHUB 自测也覆盖了 /../secret、编码斜杠等路径绕过场景,避免通过 Web 路径读取站点根目录外文件。

登录速率限制

/api/login 端点强制执行基于 IP 的速率限制:

  • 限制:60 秒窗口内最多 5 次失败尝试
  • 超限响应:HTTP 429
  • 实现:固定大小的 64 个 IP 跟踪表,带自动窗口过期;表满时会替换最旧记录,避免新 IP 绕过记录

Web 写操作限额

RTKHUB 对 Web 终端中的写文件类命令增加了按用户、按天的限额保护。当前覆盖 savelogadd 等会写入配置或文件的命令:

角色每日写操作上限
admin5 次
operator1 次
viewer不允许

这个限制是 RTKHUB 后端自身的安全保护,和 Cloudflare Pages/Workers 的请求配额不是同一件事。达到上限后接口会提示当天写入额度已用完,需要次日或通过本机运维方式处理。

客户端 IP 检测

get_client_ip() 默认从 Web 适配层提取真实对等 IP。

编译时使用 -DTRUST_PROXY_HEADERS 标志时,还会读取 X-Forwarded-For 头(用于反向代理部署)。

注意

-DTRUST_PROXY_HEADERS 标志默认关闭以防止 IP 欺骗。仅在确认反向代理可信时启用。

CORS 策略

API 响应默认不返回 Access-Control-Allow-Origin: *,避免跨站点脚本直接调用登录、控制、终端和用户管理接口。Web 前端与 API 使用同源访问。

密码校验

密码使用 PBKDF2-HMAC-SHA256 哈希存储。登录验证时对哈希结果使用恒定时间比较,避免普通 strcmp() 提前返回带来的时序侧信道。

构建选项

标志效果
-DTRUST_PROXY_HEADERS信任 X-Forwarded-For 头获取客户端 IP(仅用于反向代理部署)
-DWEB_AUDIT_DISABLE_RETENTION关闭审计日志默认保留最近 10000 条的自动清理策略

安全最佳实践

部署前检查

在将 RTKHUB 部署到生产环境前,完成以下安全配置检查:

1. 路径遍历防护

验证方法

升级到 v1.3.0 后,使用以下命令验证路径遍历防护是否生效:

# 测试编码路径分隔符(应返回 400 Bad Request)
curl "http://127.0.0.1:5426/api/..%2F..%2Fsecret.txt"
curl "http://127.0.0.1:5426/api/..%5c..%5csecret.txt"

# 测试正常路径(应正常返回)
curl "http://127.0.0.1:5426/api/status"

预期行为:编码路径分隔符请求应被拒绝,正常请求应成功。

2. 会话管理

  • 确认登录后会话 ID 重新生成(防止会话固定攻击)
  • 设置合理的会话超时时间
  • 定期清理过期会话
  • 使用浏览器开发者工具检查 rtkhub_session cookie 在登录前后是否变化

3. 速率限制配置

验证速率限制

测试登录速率限制是否正常工作:

# 连续 6 次失败登录尝试
for ($i=1; $i -le 6; $i++) {
curl -X POST http://127.0.0.1:5426/api/login `
-H "Content-Type: application/json" `
-d '{"username":"test","password":"wrong"}' -v
Start-Sleep -Seconds 1
}

预期行为:前 5 次返回认证失败(401),第 6 次返回速率限制错误(429)。

4. 网络隔离

  • 不要将 5426 端口直接暴露到公网
  • 使用反向代理(Nginx/Cloudflare Tunnel)并启用 HTTPS
  • 配置防火墙规则限制访问来源 IP
  • 仅在必要时开放局域网访问

5. 凭据管理

  • 修改默认管理员密码
  • 使用强密码策略(至少 12 位,包含大小写字母、数字、特殊字符)
  • 为不同用户创建独立账号,避免共享 admin 账号
  • 定期更换 NTRIP 数据源密码
  • 配置文件中的凭据使用适当的文件权限保护

运行时监控

部署后持续监控以下安全指标:

1. 登录失败率监控

# 检查审计日志中的登录失败记录
Get-Content D:\rtkhub\log\audit.log | Select-String -Pattern "login.*fail" | Measure-Object

# 统计最近 24 小时的失败登录次数
$yesterday = (Get-Date).AddDays(-1)
Get-Content D:\rtkhub\log\audit.log | Where-Object {
$_ -match "login.*fail" -and
[DateTime]::Parse(($_ -split '\s+')[0,1] -join ' ') -gt $yesterday
} | Measure-Object
异常阈值

如果单个 IP 在短时间内(如 1 小时)出现超过 20 次登录失败,可能正在遭受暴力破解攻击,应考虑封禁该 IP。

2. 异常 API 访问监控

# 监控可疑的路径遍历尝试
Get-Content D:\rtkhub\log\rtkhub.log | Select-String -Pattern "%2F|%5c|\.\./"

# 监控高频 API 调用
Get-Content D:\rtkhub\log\rtkhub.log | Select-String -Pattern "/api/" |
Group-Object {$_ -split '\s+' | Select-Object -Index 2} |
Sort-Object Count -Descending | Select-Object -First 10

3. 系统日志审计

定期检查以下日志中的异常模式:

  • 审计日志 (audit.log):用户登录、权限变更、配置修改
  • 应用日志 (rtkhub.log):服务启停、错误、警告
  • Web 日志:异常请求、速率限制触发、会话异常
日志分析建议

使用日志分析工具(如 ELK Stack、Splunk 或简单的 PowerShell 脚本)定期扫描日志,识别以下模式:

  • 同一 IP 的高频请求
  • 非工作时间的管理操作
  • 未授权的 API 访问尝试
  • 异常的文件路径请求

定期审计

建立定期安全审计流程:

1. 日志回顾(每周)

  • 检查审计日志中的异常登录时间和地点
  • 审查高权限操作(用户管理、配置变更、Web 终端命令)
  • 验证日志文件未被篡改(检查文件修改时间连续性)

2. 用户权限检查(每月)

# 导出当前用户列表和权限(需要实现相应的 API)
curl http://127.0.0.1:5426/api/users -H "Cookie: rtkhub_session=<your-session>"

# 检查清单:
# - 是否有离职人员账号未删除
# - 是否有权限过高的账号
# - 是否有长期未使用的账号
# - 是否有共享账号

3. 配置文件检查(每季度)

  • 审查 NTRIP 凭据是否仍然有效且必要
  • 检查配置文件权限是否正确(仅授权用户可读)
  • 验证备份是否包含敏感信息(考虑加密备份)
  • 检查 SCRHUB 脚本路径是否仅限于 script/ 目录

4. 安全更新检查(每月)

订阅更新通知

关注 RTKHUB GitHub 仓库的 Releases 页面,启用 "Watch" > "Custom" > "Releases" 以接收安全更新通知。

定期检查并应用安全补丁:

# 检查当前版本
Get-Content D:\rtkhub\log\rtkhub.log | Select-String -Pattern "version" | Select-Object -First 1

# 访问 GitHub Releases 页面查看最新版本
Start-Process "https://github.com/apkpai/rtkhub/releases"

升级流程

安全升级应遵循以下流程,最小化停机时间和风险:

1. 测试环境验证

在生产环境升级前,先在测试环境中验证:

# 在测试环境部署新版本
Expand-Archive rtkhub-v1.3.0.zip D:\rtkhub_test\
cd D:\rtkhub_test

# 使用生产配置的副本启动
Copy-Item D:\rtkhub\conf\*.* D:\rtkhub_test\conf\
.\rtkhub.exe -s -k conf\rtkhub.list -p 15426 # 使用不同端口

# 运行功能测试和安全验证

2. 备份数据

升级前必须备份

任何版本升级前都应完整备份配置、数据库和日志,即使升级说明中声称"完全兼容"。

# 自动化备份脚本(建议在升级前运行)
$date = Get-Date -Format "yyyyMMdd_HHmmss"
$version = "v1.2.0" # 当前版本
$backupPath = "E:\backups\rtkhub_${version}_pre_upgrade_$date"

nssm stop RTKHUB
Copy-Item D:\rtkhub\conf $backupPath\conf -Recurse
Copy-Item D:\rtkhub\database $backupPath\database -Recurse
Copy-Item D:\rtkhub\log $backupPath\log -Recurse
Copy-Item D:\rtkhub\rtkhub.exe $backupPath\rtkhub.exe.backup
Compress-Archive $backupPath "$backupPath.zip"
Remove-Item $backupPath -Recurse
nssm start RTKHUB

Write-Host "备份完成: $backupPath.zip"

3. 灰度升级(大型部署)

对于多实例部署,采用灰度升级策略:

  1. 先升级 1-2 个实例,观察 24-48 小时
  2. 监控升级实例的日志、性能、错误率
  3. 确认无问题后逐步升级剩余实例
  4. 保留至少一个旧版本实例用于对比

4. 升级后验证

升级完成后执行完整的功能和安全验证:

# 功能验证
curl http://127.0.0.1:5426/api/status
curl http://127.0.0.1:5426/api/monitor

# 安全验证(路径遍历、速率限制等)
# 参见"部署前检查"章节的验证命令

# 日志检查
Get-Content D:\rtkhub\log\rtkhub.log -Tail 50 | Select-String -Pattern "error|fail|crash"

5. 回滚预案

准备快速回滚方案,并在升级前测试回滚流程:

# 回滚脚本模板
$backupZip = "E:\backups\rtkhub_v1.2.0_pre_upgrade_YYYYMMDD_HHmmss.zip"

nssm stop RTKHUB
Copy-Item D:\rtkhub\rtkhub.exe D:\rtkhub\rtkhub.exe.failed # 保留失败版本用于分析
Expand-Archive $backupZip "D:\rtkhub_restore" -Force
Copy-Item D:\rtkhub_restore\rtkhub.exe.backup D:\rtkhub\rtkhub.exe -Force
nssm start RTKHUB

# 验证回滚成功
Start-Sleep -Seconds 5
nssm status RTKHUB
回滚决策标准

在以下情况下应立即回滚:

  • 服务无法启动或频繁崩溃
  • 核心功能(如基线解算、数据流转发)异常
  • 出现数据丢失或损坏
  • 安全功能失效(如认证绕过、权限控制失效)

在以下情况下可以考虑修复而非回滚:

  • 仅影响非核心功能的小问题
  • 可以通过配置调整解决的兼容性问题
  • 已有明确的修复方案且可快速验证

应急响应

安全事件响应流程

  1. 检测:通过监控发现异常活动
  2. 隔离:立即停止受影响的服务或封禁攻击来源
  3. 分析:检查日志确定攻击范围和影响
  4. 恢复:从备份恢复或应用安全补丁
  5. 总结:记录事件经过,更新安全策略

常见安全事件处理

# 1. 发现暴力破解攻击
# 临时封禁 IP(Windows 防火墙)
New-NetFirewallRule -DisplayName "Block Attacker" `
-Direction Inbound -RemoteAddress 192.168.1.100 -Action Block

# 2. 发现未授权访问
# 强制所有用户重新登录(清除会话表)
# 需要重启服务或通过 API 清除会话

# 3. 配置文件泄露
# 立即更换所有 NTRIP 凭据
# 检查审计日志确定泄露范围
Get-Content D:\rtkhub\log\audit.log | Select-String -Pattern "download|export|view_config"

相关资源