Skip to content

ShitBot v1.0.9

Choose a tag to compare

@hutuyee hutuyee released this 27 Aug 11:38
· 120 commits to main since this release

What's Changed

本次更新主要完善 QQ 快捷命令的控制台日志捕获与隐私过滤,同时强化插件更新、代理—后端通信、OneBot 和数据库连接的安全性。

Warning

记得新加载config

控制台命令日志捕获

  • 快捷命令现在直接以只读方式监听服务器的 logs/latest.log:
    • 执行命令前记录日志位置;
    • 等待 capture-seconds 指定的时间;
    • 回传这段时间内所有插件追加的新日志;
    • 支持捕获 LuckPerms 等插件异步线程产生的输出;
    • 不再依赖插件名称或命令注册来源判断是否抓取日志。
  • 日志读取不会修改、清空或重写服务器原有的 latest.log。
  • 自动移除 ANSI 颜色与格式控制符,修复 LuckPerms 编辑器链接等日志中可能出现的乱码。
  • 如果命令成功但没有产生新日志,会返回明确提示,而不是发送空消息。
  • 单次回传最多保留 100 行、4000 个字符,避免大量日志刷屏。

日志隐私保护

回传给 QQ 的日志副本现在会自动进行隐私过滤:

  • 丢弃玩家聊天消息;
  • 丢弃玩家加入、退出、连接和断开日志;
  • 丢弃玩家执行命令的日志;
  • 丢弃类似 [玩家: Set own game mode to Creative Mode] 的命令反馈日志;
  • 将请求绑定玩家及当前在线玩家的名称替换为 <player>;
  • 将玩家 UUID 替换为 <uuid>;
  • 将 IPv4 和 IPv6 地址替换为 <ip>;
  • 脱敏 Bearer Token、Authorization、password、secret、token 和数据库连接地址等敏感内容。

这些过滤只作用于回传内容,不会修改服务器中的原始日志文件。

插件更新安全

  • /shitbot update 现在除了 SHA-256 和 JAR 内容检查,还必须验证独立 RSA 签名。
  • 更新验证公钥已经内置到 ShitBotCore,并会被打包进 Spigot、BungeeCord 和 Velocity 插件。
  • 服主不需要下载或配置公钥。
  • Release 缺少 .sig 文件、签名不匹配、JAR 平台不匹配或版本信息异常时,更新器会拒绝替换现有插件。
  • GitHub Release 构建流程会为三个平台的 JAR 自动生成:
    • .sha256 校验文件;
    • .sig 独立签名文件。
  • BungeeCord 向后端分发更新时,会同时传递 JAR、SHA-256 和签名元数据,由各子服独立验证后再执行替换。

代理与后端通信安全

  • Console Socket 协议升级到版本 2。
  • 每个连接都会使用服务端随机 challenge 参与 HMAC 签名,阻止旧请求在服务器重启后被重放。
  • 新增 TLS 和可选双向 TLS 支持:
    • 支持 PKCS12 key store;
    • 支持自定义 trust store;
    • 支持要求客户端证书。
  • 非回环地址的明文代理—后端连接现在默认拒绝。
  • 只有在 WireGuard、Tailscale 等外部加密隧道中并明确接受风险时,才应开启 allow-insecure-remote-plaintext。
  • 新增固定大小的连接池、等待队列、请求截止时间和连接失败熔断,避免大量请求拖垮代理或后端。
  • 加强请求 ID、nonce、消息长度和重复请求检查。

OneBot 连接安全与稳定性

  • 远程 ws:// OneBot 连接现在默认拒绝,跨主机部署应使用 wss://。
  • 如已通过可信加密隧道传输,可显式开启 onebot.allow-insecure-remote-websocket。
  • 优化插件关闭时的 WebSocket 处理,不再无限等待 OneBot 关闭连接。
  • OneBot 关闭流程增加超时与强制终止兜底,降低服务器关闭卡住的概率。
  • 隔离控制台任务和 OneBot 任务,避免日志抓取或网络任务相互阻塞。

数据库与绑定安全

  • 远程 MySQL 连接现在默认要求 TLS,推荐使用:

    sslMode=VERIFY_IDENTITY
    
    
  • 如确实需要远程明文 MySQL,必须显式开启 allow-insecure-remote-mysql。

  • 默认关闭 allowPublicKeyRetrieval,降低认证信息暴露风险。

  • MySQL 数据库迁移新增 GET_LOCK 数据库级锁,避免代理和多个后端同时启动时并发执行 DDL。

  • 数据库迁移锁等待时间受 JDBC 超时限制,不会无限阻塞启动。

  • 只有数据库列定义确实不符合目标结构时才执行修复性 ALTER TABLE。

  • 加强数据库初始化、事务处理和异常恢复。

  • 调整绑定验证码防爆破机制:

    • 总尝试次数默认提高到 30;
    • 达到总上限后进入短暂冷却,不再立即销毁验证码;
    • 新增 binding.total-attempt-cooldown-seconds;
    • 实际总尝试上限至少为单 QQ 尝试上限的 4 倍,减少恶意用户提前耗尽他人验证码的可能。

PictureBridge

  • ShitBot 仓库中的 PictureBridge 子模块已更新到最新版本。
  • 子模块明确跟踪 PictureBridge 的 main 分支。
  • 新增自动同步 workflow:PictureBridge 出现新提交后,ShitBot 会定期更新子模块引用。
  • PictureBridge 仍然是独立的纯客户端模组,不会被合并进服务端插件 JAR。

升级注意事项

  • Console Socket 协议已经升级,使用代理—后端模式时,请同时升级代理端和所有 Spigot 后端。
  • 跨机器使用明文 Console Socket、远程 ws:// OneBot 或未启用 TLS 的远程 MySQL,在本版本中会默认拒绝连接。
  • 同机 127.0.0.1 / ::1 通信不受远程明文限制影响。
  • 新版本更新器要求 Release 同时包含对应 JAR 的 .sha256 和 .sig 文件。
  • 更新完成后仍需手动重启服务器或代理,不建议使用插件热重载。

完整变更记录: 1.0.8...1.0.9