Blocklet Server 安全加固版本发布

我们发布了 Blocklet Server 的安全加固版本。1.17.12 及之前的所有发布版本均受影响,修复包含在 1.17.13-beta-20261019-082907-fe71de61 及之后的每一个 beta 版本中。
- 受影响版本:
1.17.12及之前的所有发布版本 - 已修复版本:
1.17.13-beta-20261019-082907-fe71de61及更新版本 - 应用由我们托管:无需操作,我们的服务器已在运行修复后的版本。
- 自己托管:安装 beta 版 CLI 并重启服务器。
升级就够了。文末的可选步骤是为有需要的运维人员准备的,都不是必需的。
这次审查发现了什么
我们借助 AI 审阅 Blocklet Server,覆盖的代码量远超人工审阅所能触及的范围。我们沿着服务器接受的每一类凭证,追踪了它被接受的所有路径,并复查了服务器写入日志的内容。每个问题都在发现后数天内修复完毕。发现的问题分为三类:
- 授权范围。在某些路径上,一个凭证可能被接受用于超出其签发范围的操作。这些路径现在会对照实际存储的记录与权限进行校验。
- 日志粒度。某些内部值写入日志和 webhook 载荷时,粒度超出了必要程度。现在已在产生处做脱敏。
- 输入校验。若干端点对调用方传入的 URL 和标识符约束不足,相关约束已补齐。
每一个修复都是公开仓库中一个独立的 fix(security) 提交,你可以准确看到改了什么、什么时候改的。
除代码改动外,我们也更新了自有基础设施上的凭证,收窄了服务器的网络访问范围,改进了监控。认证相关代码有变动时,这些都是值得做的常规维护。
如果你的应用由我们托管
无需任何操作。我们的服务器已在运行修复后的版本。
作为更新的一部分,我们轮换了会话签名密钥,认证代码变动后这是常规做法。轮换前签发的会话与刷新令牌不再有效,下次打开控制台或应用时,你需要重新登录一次。之后一切照常,你的应用、数据、域名和应用身份都没有变化。
如果你自己托管 Blocklet Server
请切换到 beta 通道。当前正式版 1.17.12 不包含这些修复,需要显式安装 beta 版 CLI。后续我们会把全部修复并入下一个正式版。全部已发布版本可在 npm 上查看。
你使用官方发布的版本
npm i -g @blocklet/cli@beta
blocklet server stop
blocklet server start
blocklet --version # 预期为 1.17.13-beta-20261019-082907-fe71de61 或更新
blocklet server status只装包不会改变正在运行的服务器,重启之后新代码才生效。服务器起来后,用 blocklet --version 确认一次。
你使用自己构建的版本
请拉取公开仓库默认分支的最新代码重新构建。每个修复都是独立的 fix(security) 提交,你可以在发布前逐条审阅。和官方版本一样,部署新构建后需要重启服务器。
已知限制
- 正式版暂不包含修复。在下一个正式版发布前,不带
@beta的npm i -g @blocklet/cli安装的是仍受影响的1.17.12。 - 必须重启。装了新包但没有重启的服务器,运行的仍是旧代码。
- 托管服务器上所有人需要重新登录一次。会话密钥轮换会让此前签发的会话失效,控制台和应用都一样。
可选:如果你想多一层把握
有运维人员会问到这些步骤,它们本身也值得了解。
轮换会话密钥
这会让服务器及其上所有已安装应用此前签发的全部会话与刷新令牌失效,所有人需要重新登录。
blocklet server rotate --dry-run # 只列出将被轮换的对象,不做任何改动
blocklet server rotate
blocklet server stop
blocklet server start # 重启后新密钥才会生效更换应用的密钥对
如果你希望某个应用使用新的密钥对,无论它当初是用 DID Wallet 还是服务器托管的钱包启动的,都可以在 Blocklet Server 控制台中打开该应用,进入 Global Settings 标签页,使用 Change DID。由应用的 owner 用 DID Wallet 授权,密钥迁移会记录到 ArcBlock 链上。该应用账户持有的资产会自动随之迁移,不需要手工搬运。

开始前需要知道:
- 只有应用的 owner 能执行更换。
- 应用必须处于最新的应用结构版本。如果不是,需要先迁移,控制台会提示你。
- 更换完成后应用会重启一次,该应用会有短暂中断。
重建服务器
有些运维人员习惯定期从头重建服务器。新服务器可以放在新机器上,也可以放在同一台机器上:blocklet server init 会在当前目录创建服务器,所以再建一份只需要一个新的空目录。多份副本可以并存,但同一时间只能运行一个。可以按应用逐个迁移:
- 在新服务器所在的机器上安装相同版本:
npm i -g @blocklet/cli@beta - 在一个空目录里初始化新服务器,这会生成一个新的服务器身份:
blocklet server init - 保持老服务器运行,导出每个应用:
blocklet export --app-did <appDid> --out-dir /path/to/bundle - 停止老服务器,启动新服务器,在新服务器运行时导入每个导出包。如果新服务器在另一台机器上,先把导出包传过去。
blocklet import /path/to/bundle - 如果新服务器在另一台机器上,把 DNS 指向它并重新签发证书。使用 DID Domain 和 DID DNS 时,这一步应当会自动完成。
- 手工重建服务器级配置:owner、受信任的 passport、access key。
- 充分验证新服务器后再停用老服务器。在你确认无误之前,保持老副本及其数据原样。
随导出包一起迁移的:应用的 DID、密钥对、加密密钥、session salt,以及应用内全部用户账号与数据。你的应用用户不受影响,不会丢失账号。
不会迁移的:服务器级的一切,包括 owner、受信任的 passport、路由规则、access key 和证书。这些需要在新服务器上重新配置。
问题与反馈
升级后如有疑问或发现异常,欢迎在社区的这篇公告帖下回复。如果你希望私下反馈,请发邮件到 support@arcblock.io,我们会尽快响应。
感谢每一位运行 Blocklet Server 的朋友。让它值得你的信任,正是这类工作的意义所在。