Firefox · DOM
CVE-2026-16371
Logic Error in DOM
Overview
Medium
Severity
—
CVSS
No
Exploited ITW
Fixed
Fix Status
Changed Functions
| Function | Change | Notes |
|---|---|---|
ifdom/ipc/ContentParent.cpp |
modified |
Files Changed
dom/ipc/ContentParent.cppdom/ipc/ContentParent.hdom/ipc/PContent.ipdluriloader/exthandler/nsExternalHelperAppService.cpp
Patch
diff --git a/dom/ipc/ContentParent.cpp b/dom/ipc/ContentParent.cpp
index c6b9c9e3fe9..517aa43bd05 100644
--- a/dom/ipc/ContentParent.cpp
+++ b/dom/ipc/ContentParent.cpp
@@ -4809,7 +4809,7 @@ mozilla::ipc::IPCResult ContentParent::RecvAccumulateMixedContentHSTS(
}
mozilla::ipc::IPCResult ContentParent::RecvLoadURIExternal(
- nsIURI* uri, nsIPrincipal* aTriggeringPrincipal,
+ NotNull<nsIURI*> uri, NotNull<nsIPrincipal*> aTriggeringPrincipal,
nsIPrincipal* aRedirectPrincipal,
const MaybeDiscarded<BrowsingContext>& aContext,
bool aWasExternallyTriggered, bool aHasValidUserGestureActivation,
@@ -4818,16 +4818,21 @@ mozilla::ipc::IPCResult ContentParent::RecvLoadURIExternal(
return IPC_OK();
}
+ if (!ValidatePrincipal(aTriggeringPrincipal)) {
+ return PrincipalValidationIpcFail(aTriggeringPrincipal, this, __func__);
+ }
+
+ if (!ValidatePrincipal(aRedirectPrincipal,
+ {ValidatePrincipalOptions::AllowNullPtr})) {
+ return PrincipalValidationIpcFail(aRedirectPrincipal, this, __func__);
+ }
+
nsCOMPtr<nsIExternalProtocolService> extProtService(
do_GetService(NS_EXTERNALPROTOCOLSERVICE_CONTRACTID));
if (!extProtService) {
return IPC_OK();
}
- if (!uri) {
- return IPC_FAIL(this, "uri must not be null.");
- }
-
BrowsingContext* bc = aContext.get();
extProtService->LoadURI(uri, aTriggeringPrincipal, aRedirectPrincipal, bc,
aWasExternallyTriggered,
diff --git a/dom/ipc/ContentParent.h b/dom/ipc/ContentParent.h
index 060864c020a..6a0559b9e3c 100644
--- a/dom/ipc/ContentParent.h
+++ b/dom/ipc/ContentParent.h
@@ -1038,7 +1038,7 @@ class ContentParent final : public PContentParent,
mozilla::ipc::IPCResult RecvSetURITitle(nsIURI* uri, const nsAString& title);
mozilla::ipc::IPCResult RecvLoadURIExternal(
- nsIURI* uri, nsIPrincipal* triggeringPrincipal,
+ NotNull<nsIURI*> uri, NotNull<nsIPrincipal*> triggeringPrincipal,
nsIPrincipal* redirectPrincipal,
const MaybeDiscarded<BrowsingContext>& aContext,
bool aWasExternallyTriggered, bool aHasValidUserGestureActivation,
diff --git a/dom/ipc/PContent.ipdl b/dom/ipc/PContent.ipdl
index d328a07a8e6..ebcde0b2b2c 100644
--- a/dom/ipc/PContent.ipdl
+++ b/dom/ipc/PContent.ipdl
@@ -1202,8 +1202,8 @@ parent:
async StartVisitedQueries(nullable nsIURI[] uri);
async SetURITitle(nullable nsIURI uri, nsString title);
- async LoadURIExternal(nullable nsIURI uri,
- nullable nsIPrincipal triggeringPrincipal,
+ async LoadURIExternal(nsIURI uri,
+ nsIPrincipal triggeringPrincipal,
nullable nsIPrincipal redirectPrincipal,
MaybeDiscardedBrowsingContext browsingContext,
bool wasExternallyTriggered,
diff --git a/uriloader/exthandler/nsExternalHelperAppService.cpp b/uriloader/exthandler/nsExternalHelperAppService.cpp
index d36dc1617cd..862b6cba4ee 100644
--- a/uriloader/exthandler/nsExternalHelperAppService.cpp
+++ b/uriloader/exthandler/nsExternalHelperAppService.cpp
@@ -1036,11 +1036,13 @@ nsExternalHelperAppService::LoadURI(nsIURI* aURI,
bool aHasValidUserGestureActivation,
bool aNewWindowTarget) {
NS_ENSURE_ARG_POINTER(aURI);
+ NS_ENSURE_ARG_POINTER(aTriggeringPrincipal);
if (XRE_IsContentProcess()) {
mozilla::dom::ContentChild::GetSingleton()->SendLoadURIExternal(
- aURI, aTriggeringPrincipal, aRedirectPrincipal, aBrowsingContext,
- aTriggeredExternally, aHasValidUserGestureActivation, aNewWindowTarget);
+ WrapNotNull(aURI), WrapNotNull(aTriggeringPrincipal),
+ aRedirectPrincipal, aBrowsingContext, aTriggeredExternally,
+ aHasValidUserGestureActivation, aNewWindowTarget);
return NS_OK;
}
@@ -1108,7 +1110,7 @@ nsExternalHelperAppService::LoadURI(nsIURI* aURI,
// links can always navigate everywhere, so this is a minor additional
// restriction, only aiming to prevent some types of spoofing attacks
// from otherwise disjoint browsingcontext trees.
- if (aBrowsingContext && aTriggeringPrincipal &&
+ if (aBrowsingContext &&
// Add-on principals are always allowed:
!BasePrincipal::Cast(aTriggeringPrincipal)->AddonPolicy() &&
// As is chrome code:
Loading diff…
References
On This Page