Chrome · Extensions
CVE-2026-11190
Logic Error in Extensions
Overview
Medium
Severity
—
CVSS
No
Exploited ITW
Fixed
Fix Status
Changed Functions
| Function | Change | Notes |
|---|---|---|
forextensions/browser/api/content_settings/content_settings_store.cc |
modified | |
ifextensions/browser/api/content_settings/content_settings_store.cc |
modified | |
TEST_Fextensions/browser/api/content_settings/content_settings_store_unittest.cc |
modified |
Files Changed
extensions/browser/api/content_settings/content_settings_store.ccextensions/browser/api/content_settings/content_settings_store_unittest.cc
Patch
From 627b34d0b40c5a432069c641f86cc01a1b1b2418 Mon Sep 17 00:00:00 2001
From: Christian Dullweber <dullweber@chromium.org>
Date: Mon, 20 Apr 2026 05:31:32 -0700
Subject: [PATCH] Fix ContentSettingsStore::GetRule for disabled extensions
We need to skip rules from disabled extensions like in GetRuleIterator.
Bug: 503375371
Change-Id: Ic8606274ffbc4538567d566cbe4b56d87aac8848
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7770411
Commit-Queue: Balazs Engedy <engedy@chromium.org>
Commit-Queue: Christian Dullweber <dullweber@chromium.org>
Reviewed-by: Balazs Engedy <engedy@chromium.org>
Auto-Submit: Christian Dullweber <dullweber@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1617427}
---
diff --git a/extensions/browser/api/content_settings/content_settings_store.cc b/extensions/browser/api/content_settings/content_settings_store.cc
index a9142c85..2f77ec7 100644
--- a/extensions/browser/api/content_settings/content_settings_store.cc
+++ b/extensions/browser/api/content_settings/content_settings_store.cc
@@ -113,6 +113,10 @@
std::unique_ptr<content_settings::Rule> result;
for (const auto& entry : entries_) {
+ if (!entry->enabled) {
+ continue;
+ }
+
if (off_the_record) {
{
base::AutoLock lock(entry->incognito_session_only_settings.GetLock());
diff --git a/extensions/browser/api/content_settings/content_settings_store_unittest.cc b/extensions/browser/api/content_settings/content_settings_store_unittest.cc
index 7beb2c8..d2c50ba 100644
--- a/extensions/browser/api/content_settings/content_settings_store_unittest.cc
+++ b/extensions/browser/api/content_settings/content_settings_store_unittest.cc
@@ -232,6 +232,52 @@
ASSERT_EQ(0u, rules.size());
}
+TEST_F(ContentSettingsStoreTest, GetRuleDisabledExtension) {
+ GURL url("http://www.youtube.com");
+ ContentSettingsPattern pattern = ContentSettingsPattern::FromURL(url);
+ std::string ext_id("my_extension");
+ RegisterExtension(ext_id);
+ store()->SetExtensionContentSetting(
+ ext_id, pattern, pattern, ContentSettingsType::COOKIES,
+ CONTENT_SETTING_ALLOW, ChromeSettingScope::kRegular);
+
+ EXPECT_EQ(CONTENT_SETTING_ALLOW,
+ GetContentSettingFromStore(store(), url, url,
+ ContentSettingsType::COOKIES, false));
+
+ // Disable the extension.
+ store()->SetExtensionState(ext_id, false);
+
+ // GetRule should now return CONTENT_SETTING_DEFAULT.
+ EXPECT_EQ(CONTENT_SETTING_DEFAULT,
+ GetContentSettingFromStore(store(), url, url,
+ ContentSettingsType::COOKIES, false));
+}
+
+TEST_F(ContentSettingsStoreTest, GetRuleDisabledExtensionIncognito) {
+ GURL url("http://www.youtube.com");
+ ContentSettingsPattern pattern = ContentSettingsPattern::FromURL(url);
+ std::string ext_id("my_extension");
+ RegisterExtension(ext_id);
+
+ // Set incognito setting.
+ store()->SetExtensionContentSetting(
+ ext_id, pattern, pattern, ContentSettingsType::COOKIES,
+ CONTENT_SETTING_ALLOW, ChromeSettingScope::kIncognitoPersistent);
+
+ EXPECT_EQ(CONTENT_SETTING_ALLOW,
+ GetContentSettingFromStore(store(), url, url,
+ ContentSettingsType::COOKIES, true));
+
+ // Disable the extension.
+ store()->SetExtensionState(ext_id, false);
+
+ // GetRule should now return CONTENT_SETTING_DEFAULT even for incognito.
+ EXPECT_EQ(CONTENT_SETTING_DEFAULT,
+ GetContentSettingFromStore(store(), url, url,
+ ContentSettingsType::COOKIES, true));
+}
+
TEST_F(ContentSettingsStoreTest, SetFromList) {
// Force creation of ContentSettingsRegistry, so that the string to content
// setting type lookup can succeed.
Loading diff…
Regression Test / PoC
shipped with the fix
diff --git a/extensions/browser/api/content_settings/content_settings_store_unittest.cc b/extensions/browser/api/content_settings/content_settings_store_unittest.cc
index 7beb2c8..d2c50ba 100644
--- a/extensions/browser/api/content_settings/content_settings_store_unittest.cc
+++ b/extensions/browser/api/content_settings/content_settings_store_unittest.cc
@@ -232,6 +232,52 @@
ASSERT_EQ(0u, rules.size());
}
+TEST_F(ContentSettingsStoreTest, GetRuleDisabledExtension) {
+ GURL url("http://www.youtube.com");
+ ContentSettingsPattern pattern = ContentSettingsPattern::FromURL(url);
+ std::string ext_id("my_extension");
+ RegisterExtension(ext_id);
+ store()->SetExtensionContentSetting(
+ ext_id, pattern, pattern, ContentSettingsType::COOKIES,
+ CONTENT_SETTING_ALLOW, ChromeSettingScope::kRegular);
+
+ EXPECT_EQ(CONTENT_SETTING_ALLOW,
+ GetContentSettingFromStore(store(), url, url,
+ ContentSettingsType::COOKIES, false));
+
+ // Disable the extension.
+ store()->SetExtensionState(ext_id, false);
+
+ // GetRule should now return CONTENT_SETTING_DEFAULT.
+ EXPECT_EQ(CONTENT_SETTING_DEFAULT,
+ GetContentSettingFromStore(store(), url, url,
+ ContentSettingsType::COOKIES, false));
+}
+
+TEST_F(ContentSettingsStoreTest, GetRuleDisabledExtensionIncognito) {
+ GURL url("http://www.youtube.com");
+ ContentSettingsPattern pattern = ContentSettingsPattern::FromURL(url);
+ std::string ext_id("my_extension");
+ RegisterExtension(ext_id);
+
+ // Set incognito setting.
+ store()->SetExtensionContentSetting(
+ ext_id, pattern, pattern, ContentSettingsType::COOKIES,
+ CONTENT_SETTING_ALLOW, ChromeSettingScope::kIncognitoPersistent);
+
+ EXPECT_EQ(CONTENT_SETTING_ALLOW,
+ GetContentSettingFromStore(store(), url, url,
+ ContentSettingsType::COOKIES, true));
+
+ // Disable the extension.
+ store()->SetExtensionState(ext_id, false);
+
+ // GetRule should now return CONTENT_SETTING_DEFAULT even for incognito.
+ EXPECT_EQ(CONTENT_SETTING_DEFAULT,
+ GetContentSettingFromStore(store(), url, url,
+ ContentSettingsType::COOKIES, true));
+}
+
TEST_F(ContentSettingsStoreTest, SetFromList) {
// Force creation of ContentSettingsRegistry, so that the string to content
// setting type lookup can succeed.
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