Cross-tenant data exposure in Cloudflare Containers/Sandboxes/Browser Run via Linux dm-thin skip_block_zeroing residual block reuse

Cross-tenant data exposure in Cloudflare (TL-2026-2648), also tracked as Cloudflare Containers residual block exposure, is a high-severity software vulnerability, first published 2026-09-25. It has no confirmed attribution, affects Cloudflare Containers, maps to 9 MITRE ATT&CK techniques (T1005, T1006, T1059.007), and is covered by 9 detection rules and 12 indicators of compromise.

Key facts for TL-2026-2648

Threat ID
TL-2026-2648
Also known as
Cloudflare Containers residual block exposure, dm-thin skip_block_zeroing disclosure, escaping the Cloudflare Sandbox
Severity
HIGH
Status
RESOLVED
Category
VULNERABILITY
First published
2026-09-25
Last reviewed
2026-09-25
Attribution confidence
LOW
Motivation
UNKNOWN
Target sectors
technology, cloud, multi-tenant-hosted-services, software-as-a-service, serverless-platforms
Target regions
Global
Detection rules
9
Indicators of compromise
12

Malware and tooling in Cross-tenant data exposure in Cloudflare

Malware and tooling: Dataleak, ext4

A cross-tenant confidentiality flaw in Cloudflare Containers (and the products layered on it — Cloudflare Sandboxes and Browser Run) let a Workers Paid account recover residual disk data previously written by other customers' workloads on the same host. Root cause was Linux device-mapper thin provisioning (dm-thin) pools configured with skip_block_zeroing, which disabled zeroing of newly allocated 64 KiB blocks: a 4 KiB write to an unmapped region forced allocation of a reused physical block, leaving the remaining ~60 KiB readable via raw reads of /dev/vdc. Oren Yomtov of Accomplish reported it via HackerOne (#3997565); Cloudflare found no evidence of malicious exploitation, removed skip_block_zeroing fleet-wide, retired pre-mitigation disks and cached image snapshots, and completed cleanup on 2026-09-19. No CVE or CVSS was assigned and no customer action was required.

How Cross-tenant data exposure in Cloudflare works

Cloudflare Containers and the higher-level products built on it — Cloudflare Sandboxes (an SDK that runs each sandbox in its own VM for strong isolation) and Cloudflare Browser Run — provide multi-tenant compute in which each customer workload runs in a Firecracker microVM with a writable root disk presented to the guest as /dev/vdc. That root disk is backed by a Linux device-mapper thin-provisioning (dm-thin) pool using a 64 KiB thin-block size. The affected storage pools were configured with the skip_block_zeroing option, which instructs the kernel to skip zeroing newly allocated blocks before they become accessible. Under normal thin provisioning the kernel zeroes a block on first mapping so a tenant can never observe another tenant's prior data; skip_block_zeroing disabled that guarantee.

The result was a cross-tenant residual-data disclosure. When a container's thin volume was deleted, its physical blocks returned to a shared pool serving multiple customer accounts. Because those blocks were not zeroed on reallocation, a subsequent container that triggered allocation of a reused physical block could read the leftover ~60 KiB that its own 4 KiB write did not overwrite. The attack was demonstrated by Oren Yomtov of Accomplish (accomplish.ai) and reported through Cloudflare's HackerOne bug-bounty program as report #3997565 on 2026-09-04. The proof of concept used a legitimate Workers Paid account: open the raw root disk at /dev/vdc, record a baseline, write a single 4 KiB block into each selected 64 KiB-aligned region corresponding to free space in the guest ext4 filesystem, then re-read the blocks and inspect only the portions the new container had not overwritten. Reading a previously unmapped region returned zeroes without allocating a block, but writing 4 KiB into an unmapped region forced dm-thin to allocate a full physical 64 KiB block, leaving 60 KiB of a prior tenant's data recoverable. This is a direct-volume-access primitive (raw reads of /dev/vdc) rather than a VM/container escape in the code-execution sense.

To validate attribution of recovered blocks to foreign tenants, the researchers used ext4 metadata_csum directory-block checksums to distinguish their own filesystem's blocks from foreign ones. Across six production placements they examined 5,614 testable directory blocks, found none attributable to their own filesystem, and identified 2,700 distinct foreign directory inodes; a controlled validation of 162 deliberately created/deleted test blocks was 100% correctly attributed. Residual material was observed on 18 of 24 placements and 20 of 22 underlying nodes spanning four continents. Recovered block types included directory structures, database pages, structurally complete SQLite databases, Chromium browser profiles, .env files, and credential files. The submission contained no third-party filenames, identifiers, credentials, hostnames, or recovered content values, and the researchers confirmed the recovered data was securely deleted in line with HackerOne disclosure policy.

The confidentiality impact crossed the tenant-isolation boundary: an attacker with a Workers Paid account could opportunistically recover residual data from blocks previously used by other customers' workloads on the same underlying host, including filesystem metadata, directory structures, database pages, and application data. The attacker could not select a victim, access an actively attached disk, modify another customer's live data, or affect workload availability, and residual data was not guaranteed to be present (placement was automatic and opportunistic). Cloudflare remediated by removing skip_block_zeroing from the dm-thin pool configuration fleet-wide, which stopped new residual exposure and was independently confirmed by the researchers; because that change did not sanitize blocks already mapped into existing thin devices or cached dm-thin snapshots of OCI image layers, Cloudflare additionally retired all running container disks, removed cached image snapshots created before mitigation, drained hosts off-peak, restarted VMs, and cleared each host's image cache so all disks and cached layers were recreated with zeroed allocations. Cleanup of all pre-mitigation cached snapshots completed on 2026-09-19.

Cloudflare reported no evidence of any malicious actor abusing the vulnerability; retained disk-I/O telemetry was scanned against the attack's signature (a 4 KiB write to a previously unmapped region triggering allocation of a reused 64 KiB block, followed by reads recovering substantially more data than the container wrote), and only researcher and internal validation activity matched. No CVE was assigned and no CVSS score was published. The disclosure notes this is the sixth sandbox/isolation escape Accomplish has published since July 2026, following escapes from Claude Cowork (SharedRoot), Claude Code (Beltdown), Cursor CLI (Beltdown2), Docker's hypervisor, and an OpenAI Codex sandbox — underscoring that multi-tenant isolation can fail in many ways, including at the storage layer. The underlying Linux behavior is documented upstream: the dm-thin target sets discard_zeroes_data_unsupported because partial discards are not guaranteed to be zeroed before reuse, so secure erase must be explicit.

MITRE ATT&CK techniques used in TL-2026-2648

Collection

T1005 Data from Local System; T1074.001 Data Staged: Local Data Staging

stealth

T1006 Direct Volume Access

Execution

T1059.007 Command and Scripting Interpreter: JavaScript

Initial Access

T1078.004 Valid Accounts: Cloud Accounts

Discovery

T1082 System Information Discovery

Credential Access

T1539 Steal Web Session Cookie; T1552.001 Unsecured Credentials: Credentials In Files; T1555.004 Windows Credential Manager

Affected products and versions in Cross-tenant data exposure in Cloudflare

  • Cloudflare — Containers
    Vulnerable versions: all multi-tenant dm-thin pools configured with skip_block_zeroing prior to 2026-09-04
    Fixed in: fleet-wide block-zeroing rollout (completed 2026-09-07); post-cleanup state (cleanup completed 2026-09-19)
  • Cloudflare — Sandboxes
    Vulnerable versions: all Sandboxes running on Cloudflare Containers prior to 2026-09-04
    Fixed in: remediated via the Containers fleet-wide fix
  • Cloudflare — Browser Run
    Vulnerable versions: all Browser Run workloads sharing the affected disk implementation prior to 2026-09-04
    Fixed in: remediated via the Containers fleet-wide fix

Remediation for Cross-tenant data exposure in Cloudflare

Immediate actions

  • Remove skip_block_zeroing from all dm-thin pool configurations to restore default zeroing of newly allocated blocks (fleet-wide fix)
  • Retire all running container disks created before mitigation and remove cached image snapshots that could still expose residual bytes in unused regions
  • Scan retained historical disk-I/O telemetry for the residual-block-reuse signature (4 KiB write to unmapped region + oversized read recovering more than written) to rule out malicious activity
  • Under your own risk policy, consider rotating secrets/cookies that may have resided in recovered data types (.env, credential files, Chromium profiles)

Longer-term hardening

  • Ensure thin-provisioning pools always zero newly allocated blocks before tenant access
  • Redesign the block lifecycle so freed physical blocks are never returned to a shared cross-tenant pool without zeroing
  • Adopt managed block-storage abstractions that guarantee isolation at the storage layer rather than relying on configuration defaults
  • Treat discard/TRIM semantics as non-guaranteeing: rely on explicit secure erase (e.g. blkdiscard with zeroing, or filesystem-level secure deletion) for decommissioned volumes
  • Add automated configuration guards that reject pool options (like skip_block_zeroing) in multi-tenant storage stacks

Weaknesses (CWE) in Cross-tenant data exposure in Cloudflare

CWE-226, CWE-212, CWE-200

Timeline of Cross-tenant data exposure in Cloudflare

  • Fleet-wide rollout of the block-zeroing fix began (23:15 UTC) the same evening as the report.
  • Runtime fix and block-reuse test merged (21:27 UTC); changes for new and live dm-thin pools merged (22:03 UTC).
  • Cloudflare opened a security incident and confirmed the production setup (18:45 UTC), roughly 3 hours after submission.
  • Oren Yomtov (Accomplish) submitted the cross-tenant data exposure finding via Cloudflare's HackerOne bug-bounty program (report #3997565, 15:26 UTC).
  • Rollout completed (06:13 UTC); clearing of old pool data began.
  • Bounty awarded to the researcher (12:52 UTC); the amount was not disclosed.
  • Researchers confirmed the proof of concept no longer worked after the fix (10:50 UTC), since skip_block_zeroing was removed.
  • Cleanup of all pre-mitigation cached image snapshots completed (15:03 UTC), fully remediating residual-data exposure.
  • Cloudflare published the disclosure 'Cross-tenant data exposure in Cloudflare Containers (and how we fixed it)' jointly with the researchers; Accomplish published 'Escaping the Cloudflare Sandbox'.

Sources cited for Cross-tenant data exposure in Cloudflare

More in vulnerability

Detection coverage for TL-2026-2648

As of 2026-09-25, Threadlinqs Intelligence publishes 9 detection rule(s) for TL-2026-2648 across Splunk SPL, Microsoft KQL and Sigma, covering 12 indicator(s) of compromise. The whole corpus is readable without an account; a free account unlocks full detection query text in Splunk SPL, Microsoft KQL and Sigma; paid tiers add raw indicator values, correlation and the MCP server. Threadlinqs MCP server · View plans.

Threadlinqs Intelligence — Real-Time Threat Detection Platform

[ 0 threats ] [ 0 det ] [ CRIT: 0 ] [ HIGH: 0 ]
// threat_feed
$ sort --newest
Showing all threats

Latest Threats