Low firefox Logic Error 🔧 Commit mapped

Overview

Low
Severity
CVSS
No
Exploited ITW
Fixed
Fix Status
Impactlow
DescriptionPreviewing a response in Devtools ignored CSP headers, which could have allowed content injection attacks.
ComponentDOM
Bug ClassLogic Error
Tracker1920348
Fix commit65c0284e3c51 (firefox) +41/-0
CISA KEVNot listed
CreditedSatoki Tsuji
Disclosed2025-05-27

Changed Functions

FunctionChangeNotes
nsIChannel
dom/security/nsCSPUtils.h
modified
nsCSPHostSrc
dom/security/nsCSPUtils.h
modified

Files Changed

  • dom/base/ChromeUtils.cpp
  • dom/base/ChromeUtils.h
  • dom/chrome-webidl/ChromeUtils.webidl
  • dom/security/nsCSPUtils.cpp
  • dom/security/nsCSPUtils.h
diff --git a/dom/base/ChromeUtils.cpp b/dom/base/ChromeUtils.cpp
index 0e73fd32f4c..bd6dd143216 100644
--- a/dom/base/ChromeUtils.cpp
+++ b/dom/base/ChromeUtils.cpp
@@ -2585,4 +2585,11 @@ void ChromeUtils::AndroidMoveTaskToBack(GlobalObject& aGlobal) {
 #endif
 }
 
+already_AddRefed<nsIContentSecurityPolicy> ChromeUtils::CreateCSPFromHeader(
+    GlobalObject& aGlobal, const nsAString& aHeader, nsIURI* aSelfURI,
+    nsIPrincipal* aLoadingPrincipal, ErrorResult& aRv) {
+  return CSP_CreateFromHeader(aHeader, aSelfURI, aLoadingPrincipal,
+                             aRv);
+}
+
 }  // namespace mozilla::dom
diff --git a/dom/base/ChromeUtils.h b/dom/base/ChromeUtils.h
index 7c700415831..bb5a5721ac3 100644
--- a/dom/base/ChromeUtils.h
+++ b/dom/base/ChromeUtils.h
@@ -331,6 +331,10 @@ class ChromeUtils {
 
   static void AndroidMoveTaskToBack(GlobalObject& aGlobal);
 
+  static already_AddRefed<nsIContentSecurityPolicy> CreateCSPFromHeader(
+      GlobalObject& aGlobal, const nsAString& aHeader, nsIURI* aSelfURI,
+      nsIPrincipal* aLoadingPrincipal, ErrorResult& aRv);
+
  private:
   // Number of DevTools session debugging the current process
   static std::atomic<uint32_t> sDevToolsOpenedCount;
diff --git a/dom/chrome-webidl/ChromeUtils.webidl b/dom/chrome-webidl/ChromeUtils.webidl
index e0d953da57a..1fd0519864c 100644
--- a/dom/chrome-webidl/ChromeUtils.webidl
+++ b/dom/chrome-webidl/ChromeUtils.webidl
@@ -788,6 +788,9 @@ partial namespace ChromeUtils {
   // Equivalent to pressing the home button. Exclusively for testing.
   [ChromeOnly]
   undefined androidMoveTaskToBack();
+
+  [Throws]
+  ContentSecurityPolicy createCSPFromHeader(DOMString header, URI selfURI, Principal loadingPrincipal);
 };
 
 /*
diff --git a/dom/security/nsCSPUtils.cpp b/dom/security/nsCSPUtils.cpp
index 8750dfa730e..62107bb635b 100644
--- a/dom/security/nsCSPUtils.cpp
+++ b/dom/security/nsCSPUtils.cpp
@@ -415,6 +415,28 @@ CSPDirective CSP_ContentTypeToDirective(nsContentPolicyType aType) {
   return nsIContentSecurityPolicy::DEFAULT_SRC_DIRECTIVE;
 }
 
+already_AddRefed<nsIContentSecurityPolicy> CSP_CreateFromHeader(const nsAString& aHeaderValue, nsIURI* aSelfURI,
+                              nsIPrincipal* aLoadingPrincipal,
+                              ErrorResult& aRv) {
+  RefPtr<nsCSPContext> csp = new nsCSPContext();
+  // Hard code some default values until we have a use case where we can provide
+  // something else.
+  // When inheriting from this CSP, these values will be overwritten anyway.
+  aRv = csp->SetRequestContextWithPrincipal(aLoadingPrincipal, aSelfURI,
+                                                    /* aReferrer */ ""_ns,
+                                                    /* aInnerWindowId */ 0);
+  if (aRv.Failed()) {
+    return nullptr;
+  }
+
+  aRv = CSP_AppendCSPFromHeader(csp, aHeaderValue, /* aReportOnly */ false);
+  if (aRv.Failed()) {
+    return nullptr;
+  }
+
+  return csp.forget();
+}
+
 nsCSPHostSrc* CSP_CreateHostSrcFromSelfURI(nsIURI* aSelfURI) {
   // Create the host first
   nsCString host;
diff --git a/dom/security/nsCSPUtils.h b/dom/security/nsCSPUtils.h
index f66fc083fba..2c5cbda1fbd 100644
--- a/dom/security/nsCSPUtils.h
+++ b/dom/security/nsCSPUtils.h
@@ -13,6 +13,7 @@
 #include "nsString.h"
 #include "nsTArray.h"
 #include "nsUnicharUtils.h"
+#include "mozilla/ErrorResult.h"
 
 class nsIChannel;
 
@@ -193,6 +194,10 @@ nsresult CSP_AppendCSPFromHeader(nsIContentSecurityPolicy* aCsp,
 
 /* =============== Helpers ================== */
 
+already_AddRefed<nsIContentSecurityPolicy> CSP_CreateFromHeader(const nsAString& aHeaderValue, nsIURI* aSelfURI,
+                              nsIPrincipal* aLoadingPrincipal,
+                              mozilla::ErrorResult& aRv);
+
 class nsCSPHostSrc;
 
 nsCSPHostSrc* CSP_CreateHostSrcFromSelfURI(nsIURI* aSelfURI);
Loading diff…