Chrome · WebAuthentication
CVE-2026-14074
Logic Error in WebAuthentication
Overview
Low
Severity
—
CVSS
No
Exploited ITW
Fixed
Fix Status
Files Changed
components/webauthn/ios/passkey_tab_helper.mm
Patch
From 1c9475051b08cc12fa9c5259b5510d3f749deb12 Mon Sep 17 00:00:00 2001
From: Alexis Hétu <sugoi@chromium.org>
Date: Thu, 14 May 2026 08:58:32 -0700
Subject: [PATCH] [iOS] Prevent potential cross-origin timing oracle in PasskeyTabHelper
This change ensures that relying party origin validation is
performed before checking for excluded passkeys during credential
creation in PasskeyTabHelper. By deferring the database query for
excluded passkeys until after the origin is verified, we prevent
a potential cross-origin timing oracle that could expose the
existence of passkeys to unauthorized origins.
This aligns the creation flow with the assertion flow, which
already correctly performs origin checks prior to accessing the
passkey store.
Bug: 511743480
Change-Id: I3b8641cd6d0e1b5f6f9d3024d58582020cc05ba9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7836492
Reviewed-by: Tommy Martino <tmartino@chromium.org>
Commit-Queue: Alexis Hétu <sugoi@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1630652}
---
diff --git a/components/webauthn/ios/passkey_tab_helper.mm b/components/webauthn/ios/passkey_tab_helper.mm
index cf2092d..ffcd18b 100644
--- a/components/webauthn/ios/passkey_tab_helper.mm
+++ b/components/webauthn/ios/passkey_tab_helper.mm
@@ -340,11 +340,6 @@
CHECK(request_type == PasskeyRequestParams::RequestType::kConditionalCreate ||
request_type == PasskeyRequestParams::RequestType::kModal);
- if (HasExcludedPasskey(params)) {
- DeferToRenderer(web_frame, passkey_request_id, request_type);
- return;
- }
-
const url::Origin& origin = web_frame->GetSecurityOrigin();
const std::string& rp_id = params.RpId();
if (!OriginIsAllowedToClaimRelyingPartyId(rp_id, origin)) {
@@ -386,9 +381,13 @@
void PasskeyTabHelper::HandleRegistration(RegistrationRequestParams params) {
IOSPasskeyClient::RequestInfo request_info = params.RequestInfo();
-
PasskeyRequestParams::RequestType request_type = params.Type();
+ if (HasExcludedPasskey(params)) {
+ DeferToRenderer(std::move(request_info), request_type);
+ return;
+ }
+
// This check is performed after the Incognito interstitial (if applicable)
// has been shown and the user has chosen to proceed. This is intentional
// as we only want to enforce these policies when we are ready to proceed
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