Chrome · Navigation
CVE-2026-17921
Logic Error in Navigation
Overview
Low
Severity
—
CVSS
No
Exploited ITW
Fixed
Fix Status
Files Changed
content/browser/renderer_host/navigation_controller_impl.cc
Patch
From 0429536715e40b2ddb3ed7bb39bb14869b00515a Mon Sep 17 00:00:00 2001
From: Yao Xiao <yaoxia@chromium.org>
Date: Thu, 04 Jun 2026 11:47:58 -0700
Subject: [PATCH] Fix cross-origin history manipulation via forged document sequence number
This CL updates `SetSkippableForSameDocumentEntries` to ensure the
skippable bit is only propagated to history entries that share the same
SiteInstance as the reference entry.
Rationale:
Previously, the browser relied solely on the renderer-provided document
sequence number to identify related entries. This allowed a compromised
renderer to forge a document sequence number matching a cross-origin
entry, tricking the browser into marking a victim site's history entry
as skippable (and potentially pruning it). Enforcing a SiteInstance
check prevents this vulnerability.
Bug: 513503197
Change-Id: I9bec978e221382eab485c689cd7e83721d9083bb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7896997
Reviewed-by: Charlie Reis <creis@chromium.org>
Commit-Queue: Yao Xiao <yaoxia@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1641833}
---
diff --git a/content/browser/renderer_host/navigation_controller_impl.cc b/content/browser/renderer_host/navigation_controller_impl.cc
index 7fbd813d..1260b2f6 100644
--- a/content/browser/renderer_host/navigation_controller_impl.cc
+++ b/content/browser/renderer_host/navigation_controller_impl.cc
@@ -5197,8 +5197,21 @@
reference_entry->root_node()->frame_entry->document_sequence_number();
for (int index = 0; index < GetEntryCount(); index++) {
auto* entry = GetEntryAtIndex(index);
+
+ // A compromised renderer could forge a document sequence number (DSN) to
+ // match a cross-origin entry, attempting to mark a victim site's history
+ // entry as skippable. Enforcing a SiteInstance check prevents this.
+ //
+ // Note: When restoring a tab, NavigationEntries do not get SiteInstances
+ // until they are visited again. We allow the check to pass if `entry`'s
+ // SiteInstance is null to ensure same-document entries are correctly
+ // marked skippable after a restore. The risk is acceptable because an
+ // attacker cannot trigger a tab restore, DSNs are difficult to guess
+ // across sessions, and the impact is minimal.
if (entry->root_node()->frame_entry->document_sequence_number() ==
- document_sequence_number) {
+ document_sequence_number &&
+ (!entry->site_instance() ||
+ entry->site_instance() == reference_entry->site_instance())) {
entry->set_should_skip_on_back_forward_ui(skippable);
}
}
Loading diff…
Original Bug Report
The reporter's bug is still restricted on the tracker. Chrome de-restricts security bugs ~30–90 days after the fix ships; a later run will backfill it here.
References
On This Page