SLDataAPI 提供服务器数据查询和远程控制能力(含执行控制台命令、踢人/封禁、文件读写、语音转发等),这些接口一旦被未授权访问,影响面等同于拿到服务器控制台权限,请认真对待。
本分支当前产品版本为 2.6.0 PEAK(Git 分支名 preview/v2.6.0-DevOnly 为历史名称)。
只有最新发布版本会收到安全修复,旧版本不回溯打补丁,请保持更新到最新 release。
| 版本 | 是否维护 |
|---|---|
| 2.6.0 PEAK | ✅ |
| 更早版本 | ❌ |
请不要通过公开 Issue 或 Discussions 报告安全漏洞。 在漏洞修复并发布之前,公开细节等于公开一份利用指南。
请通过 GitHub Security Advisory 私下提交(GitHub 仓库页面 Security 标签下的 "Report a vulnerability"),只有仓库维护者能看到。
提交时请尽量包含:
- 漏洞类型(鉴权绕过 / 越权 / 路径穿越 / 信息泄露 / 其他)
- 复现步骤,最好附带请求示例(
curl命令、请求体等) - 影响范围:涉及哪个端点、需要什么前置条件(比如是否需要已知 token)
- 你认为的严重程度和理由
这是个人业余维护的开源项目,不是商业产品,没有 SLA。会尽量在 7 天内回复确认收到,视问题严重程度评估修复优先级;高危漏洞(无需 token 即可越权/执行命令类)会优先处理。修复后会在 Release Notes 中致谢报告者(除非你要求匿名),并视情况申请 CVE。
在范围内(欢迎报告):
- 无需有效
verify_token/control_token即可读取数据或执行控制操作 - 持有
verify_token却能执行本应需要control_token才能做的操作(权限越级) /control/files/*的路径穿越、突破FileRoot限制、读写受保护目录- 通过精心构造的输入造成插件崩溃、拒绝服务,或使服务器控制台权限被间接获取
UpdateChecker自动更新流程中的签名校验绕过(伪造/篡改下载的 DLL 被接受)- Token 比较存在时序侧信道、日志或错误信息中意外泄露 token 明文
- WebSocket 控制通道(
/ws/control)、语音转发通道鉴权与 HTTP 端不一致
不在范围内:
- 已知需要控制面凭据(2.6 起为 API Key,早期为
control_token)才能触发的行为——持有凭据本身就等同于拥有服务器控制台权限,这是设计如此,不是漏洞(例如/control/console/command能执行任意命令)。例外:借远程控制通道增发/吊销 API Key 属越权提升,在范围内——sldataapi/slda管理 CLI 已被远程执行路径硬拒绝;任何绕过该硬拒绝的路径都请报告。 - 纯粹的资源消耗类拒绝服务(比如无限制发包把带宽打满),除非能绕过已有的连接数/请求体大小限制
- 依赖社会工程学(骗管理员泄露 token)的攻击路径
- 对已经过期不再维护的旧版本的报告
以下不算"漏洞",但是实际部署中最容易出问题的地方,强烈建议照做:
- 不要用默认 / 弱
verify_token(fail-closed):出厂默认值是your_secret_token(不能当有效口令用)。空、仅空白、出厂默认、或未同时包含大写/小写/数字/特殊符号(长度≥8)时,Enable 会打 Error 并关闭数据口(/get_sl_data、/plugins/adapted等拒绝服务);若控制面也未启用则不绑定 HTTP 端口。已设置的强随机口令不受影响。数据口优先使用Authorization: Bearer或X-SLDataAPI-Token/X-SLDataAPI-Verify-Token;?token=在 2.6.0 PEAK 仍兼容但已弃用(会入访问日志),后续版本将移除。 - API Key 一次性文件:
sldataapi apikey create不会把明文写进控制台 response / LocalAdmin 命令历史;明文只出现在配置目录的apikey_once_<id>.txt(同 id 再次创建会覆盖)。创建 5 分钟后自动删除该路径(已不在则跳过);也可自行提前删除。日志不记录明文。写入后会尽力把文件权限收成仅当前用户(Linux0600/ Windows ACL);收紧失败不阻断创建。Windows 剪贴板复制默认关闭(apikey_copy_to_clipboard: true才开启)。 - 密钥管理只允许本地控制台:
TryCreate/TryRevoke/list在IsRemoteExecution上下文一律拒绝。sldataapi/slda仍被远程/control/console字符串硬拒绝。若用权限插件收窄 RemoteAdmin,请同时拒绝sldataapi/slda。 - duty 看不到完整审计:值班模板默认不授予
/control/audit/list。即便 override 打开,非 admin 也只能看到自己这条的请求体,其他 Key 的写操作 payload 会显示[redacted]。落盘时会打码sld_live_/sld_duty_/ Bearer / 常见 JSON 密钥字段。 control_enabled默认关闭,非必要不要开:只有真的需要外部程序控制服务器时才开启。control_token已废弃,控制面走 API Key。- 把端口锁在受信网络内:SLDataAPI 自身没有 TLS,裸 HTTP 暴露在公网上会被中间人窃听 token。建议只监听内网/本机,对外通过反向代理(Nginx/Caddy)加 HTTPS,并做 IP 白名单。
FileRoot尽量不要设置成比必要范围更大的目录,权限最小化。- 语音转发/录音相关配置(
voice_enabled/voice_record_enabled)涉及玩家隐私,启用前请确认服务器规则中已告知玩家,并妥善控制录音文件的访问权限。未完成握手的连接占用独立 pending 池(超时仍适用),不占已鉴权MaxClients席位。语音口鉴权是 API Key,不是已废弃的control_token。 - WebDAV 自动上传默认关闭(
webdav_upload_enabled)。启用后每局定稿 zip 会以 HTTPS PUT + Basic Auth 发往webdav_url。只接受https://,http://会校验失败并跳过上传(不改变插件自身的 HTTP 数据/控制端口)。密码与Authorization头不会写入日志;视密码为与 API Key 同级的机密。配置无效时启动只 Warn 一次后跳过,不改变录音本身。 AutoUpdateInstall只对已强签名的构建生效:当前 DLL 公钥令牌为空(本地未签名编译)时拒绝自动安装(即使auto_update_install: true),只打日志。已签名构建仍要求下载文件的公钥令牌与当前一致。正式发布令牌为3ec73bb20070fa9c。签名密钥(key.snk)按设计不入库、由发布者本地保管:发布正式 Release 前请用dotnet build -c Release本地构建(存在key.snk时自动启用强签名),并核对产物公钥令牌后再上传附件。auto_update_check为 true 时,除启动外还会按auto_update_check_interval_hours(默认 72)静默复查同一 GitHub Releases 通道;安装/提示规则与启动检查相同。上次检查时刻写在配置目录update_check_state.json,频繁重启不会每次都打 API。无更新只打 Debug;有新版本或检查失败才 Warn。auto_update_check: false则启动与周期都不跑。
感谢所有负责任地报告过漏洞的人。