Firefox · DOM
CVE-2026-12310
Logic Error in DOM
Overview
Medium
Severity
—
CVSS
No
Exploited ITW
Fixed
Fix Status
Changed Functions
| Function | Change | Notes |
|---|---|---|
ifdom/security/nsHTTPSOnlyUtils.cpp |
modified | |
GetIsTRRServiceChannelnetwerk/protocol/http/HttpBaseChannel.cpp |
modified | |
ifnetwerk/protocol/http/nsHttp.cpp |
modified | |
nsICacheEntrynetwerk/protocol/http/nsHttp.h |
modified | |
ifnetwerk/protocol/http/nsHttpChannel.cpp |
modified | |
ComputeProxyDNSStrategynetwerk/protocol/http/nsHttpChannel.cpp |
modified |
Files Changed
dom/security/nsHTTPSOnlyUtils.cppnetwerk/protocol/http/HttpBaseChannel.cppnetwerk/protocol/http/HttpBaseChannel.hnetwerk/protocol/http/nsHttp.cppnetwerk/protocol/http/nsHttp.hnetwerk/protocol/http/nsHttpChannel.cppnetwerk/protocol/http/nsHttpChannel.hnetwerk/protocol/http/nsHttpConnectionMgr.cppnetwerk/protocol/http/nsIHttpChannelInternal.idl
Patch
diff --git a/dom/security/nsHTTPSOnlyUtils.cpp b/dom/security/nsHTTPSOnlyUtils.cpp
index 5c0fe170e7f..a8776d807a0 100644
--- a/dom/security/nsHTTPSOnlyUtils.cpp
+++ b/dom/security/nsHTTPSOnlyUtils.cpp
@@ -1152,8 +1152,16 @@ TestHTTPAnswerRunnable::Run() {
new nsDNSPrefetch(mURI, originAttributes, origChannel->GetTRRMode());
nsCOMPtr<nsIHttpChannelInternal> internalChannel =
do_QueryInterface(origChannel);
+ // If the channel will be proxied and the proxy is responsible for DNS
+ // resolution, skip the HTTPS RR lookup to avoid leaking the host name
+ nsIHttpChannelInternal::ProxyDNSStrategy dnsStrategy =
+ nsIHttpChannelInternal::PROXY_DNS_STRATEGY_ORIGIN;
+ if (internalChannel) {
+ (void)internalChannel->GetProxyDNSStrategy(&dnsStrategy);
+ }
uint32_t caps;
- if (NS_SUCCEEDED(internalChannel->GetCaps(&caps))) {
+ if (dnsStrategy != nsIHttpChannelInternal::PROXY_DNS_STRATEGY_PROXY &&
+ internalChannel && NS_SUCCEEDED(internalChannel->GetCaps(&caps))) {
(void)resolver->FetchHTTPSSVC(
caps & NS_HTTP_REFRESH_DNS, false,
[self = RefPtr{this}](nsIDNSHTTPSSVCRecord* aRecord) {
diff --git a/netwerk/protocol/http/HttpBaseChannel.cpp b/netwerk/protocol/http/HttpBaseChannel.cpp
index 29fd6bd1af2..6b25f26ba53 100644
--- a/netwerk/protocol/http/HttpBaseChannel.cpp
+++ b/netwerk/protocol/http/HttpBaseChannel.cpp
@@ -4075,6 +4075,14 @@ HttpBaseChannel::SetBypassProxy(bool aBypassProxy) {
return NS_OK;
}
+NS_IMETHODIMP
+HttpBaseChannel::GetProxyDNSStrategy(
+ nsIHttpChannelInternal::ProxyDNSStrategy* aStrategy) {
+ NS_ENSURE_ARG_POINTER(aStrategy);
+ *aStrategy = nsIHttpChannelInternal::PROXY_DNS_STRATEGY_ORIGIN;
+ return NS_OK;
+}
+
NS_IMETHODIMP
HttpBaseChannel::GetIsTRRServiceChannel(bool* aIsTRRServiceChannel) {
NS_ENSURE_ARG_POINTER(aIsTRRServiceChannel);
diff --git a/netwerk/protocol/http/HttpBaseChannel.h b/netwerk/protocol/http/HttpBaseChannel.h
index 57d06397bf7..641955664ca 100644
--- a/netwerk/protocol/http/HttpBaseChannel.h
+++ b/netwerk/protocol/http/HttpBaseChannel.h
@@ -274,6 +274,8 @@ class HttpBaseChannel : public nsHashPropertyBag,
NS_IMETHOD GetBypassProxy(bool* aBypassProxy) override;
NS_IMETHOD SetBypassProxy(bool aBypassProxy) override;
bool BypassProxy();
+ NS_IMETHOD GetProxyDNSStrategy(
+ nsIHttpChannelInternal::ProxyDNSStrategy* aStrategy) override;
NS_IMETHOD GetIsTRRServiceChannel(bool* aTRR) override;
NS_IMETHOD SetIsTRRServiceChannel(bool aTRR) override;
diff --git a/netwerk/protocol/http/nsHttp.cpp b/netwerk/protocol/http/nsHttp.cpp
index 2b295ebcfec..689ae111b9a 100644
--- a/netwerk/protocol/http/nsHttp.cpp
+++ b/netwerk/protocol/http/nsHttp.cpp
@@ -1164,18 +1164,19 @@ nsLiteralCString HttpVersionToTelemetryLabel(HttpVersion version) {
return "unknown"_ns;
}
-ProxyDNSStrategy GetProxyDNSStrategyHelper(const char* aType, uint32_t aFlag) {
+nsIHttpChannelInternal::ProxyDNSStrategy GetProxyDNSStrategyHelper(
+ const char* aType, uint32_t aFlag) {
if (!aType) {
- return ProxyDNSStrategy::ORIGIN;
+ return nsIHttpChannelInternal::PROXY_DNS_STRATEGY_ORIGIN;
}
if (!(aFlag & nsIProxyInfo::TRANSPARENT_PROXY_RESOLVES_HOST)) {
if (aType == kProxyType_SOCKS) {
- return ProxyDNSStrategy::ORIGIN;
+ return nsIHttpChannelInternal::PROXY_DNS_STRATEGY_ORIGIN;
}
}
- return ProxyDNSStrategy::PROXY;
+ return nsIHttpChannelInternal::PROXY_DNS_STRATEGY_PROXY;
}
} // namespace net
diff --git a/netwerk/protocol/http/nsHttp.h b/netwerk/protocol/http/nsHttp.h
index 3ceedc566bc..3db762e768e 100644
--- a/netwerk/protocol/http/nsHttp.h
+++ b/netwerk/protocol/http/nsHttp.h
@@ -15,6 +15,7 @@
#include "mozilla/UniquePtr.h"
#include "NSSErrorsService.h"
+#include "nsIHttpChannelInternal.h"
class nsICacheEntry;
@@ -526,15 +527,8 @@ void DisallowHTTPSRR(uint32_t& aCaps);
nsLiteralCString HttpVersionToTelemetryLabel(HttpVersion version);
-enum class ProxyDNSStrategy : uint8_t {
- // To resolve the origin of the end server we are connecting
- // to.
- ORIGIN = 1 << 0,
- // To resolve the host name of the proxy.
- PROXY = 1 << 1
-};
-
-ProxyDNSStrategy GetProxyDNSStrategyHelper(const char* aType, uint32_t aFlag);
+nsIHttpChannelInternal::ProxyDNSStrategy GetProxyDNSStrategyHelper(
+ const char* aType, uint32_t aFlag);
} // namespace net
} // namespace mozilla
diff --git a/netwerk/protocol/http/nsHttpChannel.cpp b/netwerk/protocol/http/nsHttpChannel.cpp
index 5e9cf58a4e9..92cd5988765 100644
--- a/netwerk/protocol/http/nsHttpChannel.cpp
+++ b/netwerk/protocol/http/nsHttpChannel.cpp
@@ -1095,8 +1095,8 @@ nsresult nsHttpChannel::MaybeUseHTTPSRRForUpgrade(bool aShouldUpgrade,
return true;
}
- auto dnsStrategy = GetProxyDNSStrategy();
- if (dnsStrategy != ProxyDNSStrategy::ORIGIN) {
+ auto dnsStrategy = ComputeProxyDNSStrategy();
+ if (dnsStrategy != nsIHttpChannelInternal::PROXY_DNS_STRATEGY_ORIGIN) {
return true;
}
@@ -7799,18 +7799,27 @@ nsHttpChannel::GetOrCreateChannelClassifier() {
return classifier.forget();
}
-ProxyDNSStrategy nsHttpChannel::GetProxyDNSStrategy() {
+nsIHttpChannelInternal::ProxyDNSStrategy
+nsHttpChannel::ComputeProxyDNSStrategy() {
// When network_dns_force_use_https_rr is true, return DNS_PREFETCH_ORIGIN.
// This ensures that we always perform HTTPS RR query.
nsCOMPtr<nsProxyInfo> proxyInfo(static_cast<nsProxyInfo*>(mProxyInfo.get()));
if (!proxyInfo || StaticPrefs::network_dns_force_use_https_rr()) {
- return ProxyDNSStrategy::ORIGIN;
+ return nsIHttpChannelInternal::PROXY_DNS_STRATEGY_ORIGIN;
}
// If the proxy is not to perform name resolution itself.
return GetProxyDNSStrategyHelper(proxyInfo->Type(), proxyInfo->Flags());
}
+NS_IMETHODIMP
+nsHttpChannel::GetProxyDNSStrategy(
+ nsIHttpChannelInternal::ProxyDNSStrategy* aStrategy) {
+ NS_ENSURE_ARG_POINTER(aStrategy);
+ *aStrategy = ComputeProxyDNSStrategy();
+ return NS_OK;
+}
+
// BeginConnect() SHOULD NOT call AsyncAbort(). AsyncAbort will be called by
// functions that called BeginConnect if needed. Only
// MaybeResolveProxyAndBeginConnect and OnProxyAvailable ever call
@@ -8019,13 +8028,13 @@ nsresult nsHttpChannel::BeginConnect() {
}
bool trrEnabled = false;
- auto dnsStrategy = GetProxyDNSStrategy();
+ auto dnsStrategy = ComputeProxyDNSStrategy();
bool httpsRRAllowed =
!LoadBeConservative() && !(mCaps & NS_HTTP_BE_CONSERVATIVE) &&
!(mLoadInfo->TriggeringPrincipal()->IsSystemPrincipal() &&
mLoadInfo->GetExternalContentPolicyType() !=
ExtContentPolicy::TYPE_DOCUMENT) &&
- dnsStrategy == ProxyDNSStrategy::ORIGIN &&
+ dnsStrategy == nsIHttpChannelInternal::PROXY_DNS_STRATEGY_ORIGIN &&
!mConnectionInfo->UsingConnect() && canUseHTTPSRRonNetwork(trrEnabled) &&
StaticPrefs::network_dns_use_https_rr_as_altsvc();
if (!httpsRRAllowed) {
@@ -8225,7 +8234,7 @@ void nsHttpChannel::MaybeStartDNSPrefetch() {
return;
}
- auto dnsStrategy = GetProxyDNSStrategy();
+ auto dnsStrategy = ComputeProxyDNSStrategy();
LOG(
("nsHttpChannel::MaybeStartDNSPrefetch [this=%p, strategy=%u] "
@@ -8233,7 +8242,7 @@ void nsHttpChannel::MaybeStartDNSPrefetch() {
this, static_cast<uint32_t>(dnsStrategy),
mCaps & NS_HTTP_REFRESH_DNS ? ", refresh requested" : ""));
- if (dnsStrategy == ProxyDNSStrategy::ORIGIN) {
+ if (dnsStrategy == nsIHttpChannelInternal::PROXY_DNS_STRATEGY_ORIGIN) {
OriginAttributes originAttributes;
StoragePrincipalHelper::GetOriginAttributesForNetworkState(
this, originAttributes);
diff --git a/netwerk/protocol/http/nsHttpChannel.h b/netwerk/protocol/http/nsHttpChannel.h
index 5d94f675aa7..a95779cc524 100644
--- a/netwerk/protocol/http/nsHttpChannel.h
+++ b/netwerk/protocol/http/nsHttpChannel.h
@@ -308,8 +308,13 @@ class nsHttpChannel final : public HttpBaseChannel,
// Based on the proxy configuration determine the strategy for resolving the
// end server host name.
- ProxyDNSStrategy GetProxyDNSStrategy();
Loading diff…
References
On This Page