CVE-2026-11700
Overview
Files Changed
DEPSthird_party/perfetto
Patch
From f4c4cb1ad1e30e176ab286d04e23e68830d5202f Mon Sep 17 00:00:00 2001
From: Lalit Maganti <lalitm@google.com>
Date: Mon, 01 Jun 2026 03:39:57 -0700
Subject: [PATCH] Cherry-pick Perfetto security fixes to M149
This is a cherry-pick of the changes:
https://source.chromium.org/chromium/_/chromium/external/github.com/google/perfetto/+/97c58a94bb6495c4e202467fb1c55eaa22b5670f
https://source.chromium.org/chromium/_/chromium/external/github.com/google/perfetto/+/090edad31122969692c8d0098de4cd23cafa7d8d
https://source.chromium.org/chromium/_/chromium/external/github.com/google/perfetto/+/47a683f86695b9ab27706bae18940a0850523dbb
https://source.chromium.org/chromium/_/chromium/external/github.com/google/perfetto/+/936e6ba2226402c4d4a7330492641ef433cece07
https://source.chromium.org/chromium/_/chromium/external/github.com/google/perfetto/+/e66c425d2bfc02375e297d98ae6abf43fea38dce
layered on top of the M149 snap of Perfetto.
Bug: 511732085
Fixed: 514928937
Change-Id: I08282b0fe72283f093487ff0941a8691b084d747
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7869327
Reviewed-by: Igor Kraskevich <kraskevich@google.com>
Commit-Queue: Rasika Navarange <rasikan@google.com>
Auto-Submit: Lalit Maganti <lalitm@google.com>
Reviewed-by: Rasika Navarange <rasikan@google.com>
Cr-Commit-Position: refs/branch-heads/7827@{#2220}
Cr-Branched-From: 9f3e9aaccba63bd2ec30334e45e0bfd07ebcc8f1-refs/heads/main@{#1625079}
---
diff --git a/DEPS b/DEPS
index ca0082f..5662a6e0 100644
--- a/DEPS
+++ b/DEPS
@@ -2647,7 +2647,7 @@
Var('pdfium_git') + '/pdfium.git' + '@' + Var('pdfium_revision'),
'src/third_party/perfetto':
- Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '846203c4b3b25f834a0bebc101fa8e1b8f9d0ca9',
+ Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '97c58a94bb6495c4e202467fb1c55eaa22b5670f',
'src/base/tracing/test/data': {
'bucket': 'perfetto',
diff --git a/third_party/perfetto b/third_party/perfetto
index 846203c4..97c58a9 160000
--- a/third_party/perfetto
+++ b/third_party/perfetto
@@ -1 +1 @@
-Subproject commit 846203c4b3b25f834a0bebc101fa8e1b8f9d0ca9
+Subproject commit 97c58a94bb6495c4e202467fb1c55eaa22b5670f
Original Bug Report
Potential UAF and Double-Free in Perfetto protovm via RwProtoCursor
Project Fortify, an experimental security project, has identified the following potential security issue. If you’re a feature owner CC-ed on this bug, please do your best to review these reports without the Chrome Security team. Please see https://chromium.googlesource.com/chromium/src/+/main/docs/security/ai-generated-security-bugs-faq.md for more information.
Overview: A potential Use-After-Free and Double-Free vulnerability exists in Perfetto’s protovm component due to stale pointer retention in RwProtoCursor::Delete. A compromised renderer can trigger this by submitting crafted trace data containing nested VM instructions. On platforms like Android and CastOS, this could lead to memory corruption and sandbox escape within the browser process.
Affected files:
third_party/perfetto/src/protovm/rw_proto_cursor.ccthird_party/perfetto/src/protovm/rw_proto_cursor.hthird_party/perfetto/src/protovm/parser.ccthird_party/perfetto/src/protovm/slab_allocator.hthird_party/perfetto/src/trace_processor/importers/proto/proto_trace_reader.ccthird_party/perfetto/src/trace_processor/importers/proto/protovm_incremental_tracing.cc
Estimated timestamp from git blame: 2025-04-28
Description
A potential Use-After-Free (UAF) and Double-Free vulnerability exists in the Perfetto protovm component. The RwProtoCursor::Delete() method improperly manages its internal state during deletion, leaving stale pointers that can be exploited via nested Virtual Machine (VM) instructions.
Initial logic and packet stream validation parameters are correctly established, allowing a compromised renderer to inject a VM program into the tracing service. When the Parser executes a del instruction containing nested del instructions, the parser invokes RwProtoCursor::Delete() consecutively on the same cursor.
The final transformation occurs because Delete() nullifies the node_ pointer but leaves holding_map_and_node_ fully populated. In release builds, PERFETTO_DCHECK(node_) is optimized out, allowing the nested execution to leap directly to the uncleared holding_map_and_node_ pointers. The secondary Delete() invocation triggers a Use-After-Free write via IntrusiveTree::Remove() pointer re-linking on the stale map_node, followed immediately by a SlabAllocator double-free that creates a cyclic free-list loop. This establishes guaranteed memory aliasing and type-confusion primitives.
Because Perfetto’s SlabAllocator relies directly on base::PagedMemory::Allocate (mmap) rather than PartitionAlloc, standard Chromium mitigations such as MiraclePtr (BackupRefPtr) do not apply.
On Android and CastOS, the tracing service runs directly within the Browser process (features::kTracingServiceInProcess is enabled by default). Consequently, a compromised renderer can achieve browser-process memory corruption and a sandbox escape.
Potential Attacker Steps
(Note: These are suggested/potential steps derived from code analysis; our tooling agent does not have the ability to run active code.)
- Initial logic and parameters are validated: A compromised renderer emits a
TracePacketcontaining atrace_provenancefield (ID 124) to map its producer ID to a sequence ID. - The renderer emits a
TracePacketcontaining aprotovmsfield (ID 125) with aVmProgram. - Standard processing applied: The program contains a
selectinstruction followed by adelinstruction, where the outerdelcontains a nesteddelinstruction targeting the same cursor. - Standard processing applied: The user or system initiates and concludes a tracing session that includes the malicious data source.
- The tracing service parses the trace, hitting the malicious nested VM instruction. The secondary
Delete()invocation executes the final transformation, triggering the UAF and Double-Free memory corruption.
Suggested Fix
Explicitly clear the holding_map_and_node_ tuple inside third_party/perfetto/src/protovm/rw_proto_cursor.cc during the RwProtoCursor::Delete() operation to prevent subsequent operations from accessing stale pointers.
holding_map->Remove(*map_node);
allocator_->Delete(&GetOuterNode(*map_node));
node_ = nullptr;
holding_map_and_node_ = {}; // FIX: Clear stale map and node pointers
Evaluated with Chrome root at commit: eca8648a4e1cdfdda68c495a6003059fed641955
Results so far have been promising, but there can be wrong deductions. If this proves to be a false positive, please close as WAI; data from false positives will be used to improve accuracy over time. And please feel free to reach out to me directly if you have concerns or feedback on the project.