新容器为何读到旧字节?从 Cloudflare 复盘看存储复用的安全不变量
新容器为何读到旧字节从 Cloudflare 复盘看存储复用的安全不变量一、背景与时间线近期复盘超出 72 小时窗口本次检索没有凑出五个同时满足证据完整与主题去重要求的时窗内选题因此将此篇作为明确标注的近期技术实践补充。Cloudflare 官方复盘发布于2026-09-24不是 9 月 29 日新发生的攻击。研究者在9 月 4 日报告问题厂商在9 月 7 日完成配置修复部署并在9 月 19 日完成修复前缓存快照清理。官方称已完成缓解客户无需额外配置操作。厂商基于其保留的历史遥测未发现恶意利用证据。这是有观测范围的调查结论不能改写成“绝对没有数据风险”。本文不为该事件编造 CVE 或客户补丁版本。二、技术原理映射消失字节未必消失官方将原因指向 dm-thin 存储池的skip_block_zeroing配置复用块未清零时新租户对部分区域写入不会自然覆盖整个分配块。该机制与 Linux 内核 thin provisioning 文档中该选项的语义一致。**工程分析**租户隔离不仅要求“A 无法访问 B 当前持有的对象”还要求“A 不能读取 B 释放后遗留的内容”。后者是一种跨时间的隔离属性。这类属性在正常功能测试里不容易被发现。只测试新磁盘读回零值可能没有覆盖“已被其他租户使用、释放、再次分配、局部写入”的完整生命周期。只有主动制造复用才能区分零初始化与偶然读到零的情况。三、影响边界无法定向不代表不存在隔离缺陷官方说明受影响的是 Containers 及基于其构建的 Sandboxes技术可接触同宿主机此前释放的残留块不能选择特定受害租户也未证明修改其他租户活跃数据。本文不将其描述为任意接管容器或定向读取任意客户数据库。对平台设计而言应分别分析状态安全问题从未使用的新块是否具有确定初始化语义已释放并复用的块是否仍含前任租户字节活跃映射是否能被另一租户直接访问旧缓存和快照是否会继承修复前内容这些状态的验证方式不同单个“磁盘已加密”或“容器已隔离”标签不足以回答全部问题。加密策略还取决于密钥作用域、生命周期及复用方式不能抽象地当成自动补救措施。四、无害实验用 16 字节数组模拟复用下面的模型只在内存里运行不打开磁盘、不操作块设备、不接触第三方数据。它不是 Cloudflare 利用程序也不复现其真实存储接口。BLOCK16old_bytesbytearray(bA*BLOCK)defassign(previous,clear):blockbytearray(BLOCK)ifclearelseprevious.copy()block[:4]bBBBBreturnblock unsafeassign(old_bytes,clearFalse)safeassign(old_bytes,clearTrue)assertunsafe[4:]bA*12assertsafe[4:]bytes(12)# 修复新分配策略不会自动改写旧快照。old_snapshotunsafe.copy()assertold_snapshot[4:]bA*12rebuilt_snapshotassign(bytearray(BLOCK),clearTrue)assertrebuilt_snapshot[4:]bytes(12)print(reuse-isolation checks passed)前三条断言解释局部写入为什么不足以保护剩余区域。后两条断言解释第二个问题策略已经改变但旧快照不会被时间倒流式地修正。**模型边界**实际块层还涉及映射、快照共享、文件系统和缓存本例只证明初始化时序不用于评估任何真实云平台。五、修复为什么必须处理旧状态Cloudflare 官方采用两类动作恢复新分配块清零并淘汰修复前的运行磁盘及缓存镜像快照。这里最有价值的工程原则是区分“未来不再产生不安全状态”和“历史不安全状态已被清除”。对于任何安全补丁建议问三个问题新对象是否安全已有对象是否继续存在缓存是否能够重新生成旧对象如果后两个问题没有答案补丁覆盖率就不能只按新版本进程数量计算。这个思路同样适用于临时文件池、数据库连接池、对象池和复用的内存缓冲区。迁移时应按实际机制设计测试不能因为概念相似就推断这些组件存在同一个漏洞。六、平台、研发与安全团队行动清单P0区分客户责任与平台责任Cloudflare 客户应以官方已完成缓解的结论为准不需要照抄底层磁盘操作。自建多租户平台则应审计自身存储池配置、块初始化语义和快照来源不要在生产环境执行用于探测残留内容的实验。P1建立受控的双租户验证在完全自有的隔离实验环境中用 A 租户写入固定无敏感标记释放资源再由 B 租户获得测试资源。验证 B 所能读取的所有逻辑区域不包含 A 的标记同时覆盖局部写入、重启、缓存命中和快照恢复。测试应记录映射是否真的发生复用否则“未读到标记”可能只是没有获得同一批资源。实验输出仅保留结果和计数避免把残留内容日志化。P2为历史状态清理建立验收指标建议分别统计新分配策略覆盖、旧对象淘汰、旧快照清理和回滚镜像检查。性能基准也要使用安全配置运行防止后续优化重新打开跳过初始化的选项。安全与 SRE 团队应共同定义遥测保留期和调查范围。没有异常记录时应写明“在何种日志、何段时间内未发现”而不是输出没有边界的否定结论。七、总结多租户隔离不仅存在于网络和进程之间也存在于资源先后使用者之间。新分配必须建立确定的初始化语义修复必须覆盖历史对象和缓存。只有把这两件事分别验收才能把“代码已修”推进到“系统状态已安全”。