Closed Bug 2003171 (CVE-2026-8945) Opened 10 months ago Closed 5 months ago

Lack of IPC verification in GeckoView allows content processes to send arbitrary messages to the Java layer. This sandbox escape enables origin spoofing, history sniffing, and credential theft by injecting unverified events into privileged UI logic.

Categories

(GeckoView :: General, defect, P2)

defect

Tracking

(firefox149 wontfix, firefox150 wontfix, firefox151+ fixed)

RESOLVED FIXED
151 Branch
Tracking Status
firefox149 --- wontfix
firefox150 --- wontfix
firefox151 + fixed

People

(Reporter: ilove.microkernel, Assigned: owlish)

References

Details

(Keywords: csectype-sandbox-escape, reporter-external, sec-high, Whiteboard: [client-bounty-form][group6][adv-main151+])

Attachments

(1 file)

48 bytes, text/x-phabricator-request
dveditz
: sec-approval+
Details | Review

Security Vulnerability Report Draft: Lack of Trust Boundary in GeckoView IPC

Product: Firefox Nightly for Android
csectype- Keywords: csectype-sandbox-escape, csectype-sop, csectype-disclosure
Severity: sec-high (Proposed)

0. Environment and Version Information

  • Product: Firefox Nightly for Android
  • Version: 147.0a1
  • Component: GeckoView :: General
  • Operating System:
    • Target Runtime: Android
    • Analysis Environment: Windows
  • Discovery Method: Manual Static Analysis (Code Review)
  • Tools Used: Visual Studio Code, grep, manual data flow tracking

1. Summary

Due to a lack of a Trust Boundary in the GeckoView IPC bridge between untrusted content processes and the privileged Android (Java) layer, unauthorized IPC message transmission is possible. This results in a sandbox escape, allowing the content process to perform privileged operations that should be restricted to the parent process.

The GeckoViewActorParent class enables a transparent pass-through between child process actors and the EventDispatcher on the Java side. This class forwards arbitrary JSON-like messages from the content process to the Java layer without performing the following verifications:

  • Verification of the sender source.
  • Verification of the message type.
  • Consistency check of the origin/URI fields against the actual browsing context.

As a result, a compromised content process can achieve the following:

  • Inject arbitrary GeckoView:* events into the Java layer.
  • Bypass the assumption that Browser UI and App logic can safely trust origin/URI information coming from GeckoView IPC.
  • At a minimum, this enables Origin Spoofing on the UI (including the URL bar), History Sniffing, Clipboard manipulation, Drive-by downloads, Origin-spoofed permission requests, and the theft or pollution of usernames and passwords via spoofed origins in Autofill.

In a realistic threat model assuming a content process RCE, this represents a critical weakness in the sandbox/trust boundary between the content sandbox and the privileged Android app.

2. Vulnerable Code Location

2.1 Parent Process JS: GeckoViewActorParent

File
mobile/shared/modules/geckoview/GeckoViewActorParent.sys.mjs

Class
GeckoViewActorParent

Method
receiveMessage(aMessage)

Excerpt (Key parts):

    export class GeckoViewActorParent extends JSWindowActorParent {
      static initLogging(aModuleName) {
        const tag = aModuleName.replace("GeckoView", "");
        return GeckoViewUtils.initLogging(tag);
      }

      get browser() {
        return this.browsingContext.top.embedderElement;
      }

      get window() {
        const { browsingContext } = this;
        if (!browsingContext.isContent && browsingContext.window) {
          return browsingContext.window;
        }
        return this.browser?.ownerGlobal;
      }

      get eventDispatcher() {
        return this.window?.moduleManager.eventDispatcher;
      }

      receiveMessage(aMessage) {
        if (!this.window) {
          debug`receiveMessage window destroyed ${aMessage.name} ${aMessage.data?.type}`;
          return null;
        }

        switch (aMessage.name) {
          case "DispatcherMessage":
            return this.eventDispatcher.sendRequest(aMessage.data);
          case "DispatcherQuery":
            return this.eventDispatcher.sendRequestForResult(aMessage.data);
        }

        // Other messages are forwarded to respective GeckoView modules
      }
    }

Findings:

  • aMessage.data is an object that can be arbitrarily constructed on the child process JSWindowActorChild side.
  • In the case of "DispatcherMessage" / "DispatcherQuery":
    • There is no allow-list check for aMessage.data.type (e.g., "GeckoView:*" strings).
    • There is absolutely no integrity verification for uri / origin / principal / node.
    • There is no verification of the correspondence between the current browsingContext and the message target.
  • The data is passed directly to eventDispatcher.sendRequest*, bridging it to the Java EventDispatcher.

2.2 Child Process JS: GeckoViewActorChild and Messaging.sys.mjs

Files

  • mobile/shared/modules/geckoview/GeckoViewActorChild.sys.mjs
  • mobile/shared/modules/geckoview/Messaging.sys.mjs
    import { GeckoViewUtils } from "resource://gre/modules/GeckoViewUtils.sys.mjs";
    import { EventDispatcher } from "resource://gre/modules/Messaging.sys.mjs";

    export class GeckoViewActorChild extends JSWindowActorChild {
      static initLogging(aModuleName) {
        const tag = aModuleName.replace("GeckoView", "") + "[C]";
        return GeckoViewUtils.initLogging(tag);
      }

      actorCreated() {
        this.eventDispatcher = EventDispatcher.forActor(this);
      }
    }

Excerpt from Messaging.sys.mjs:

class ChildActorDispatcher {
  constructor(actor) {
    this._actor = actor;
  }

  sendRequest(aMsg) {
    // Actual code: calls sendAsyncMessage without validation
    this._actor.sendAsyncMessage("DispatcherMessage", aMsg);
  }

  sendRequestForResult(aMsg) {
    // Actual code: calls sendQuery without validation
    return this._actor.sendQuery("DispatcherQuery", aMsg);
  }
}

Findings:

  • Any JSWindowActorChild can perform the following via EventDispatcher.forActor(this):
    • sendRequest({ type: "GeckoView:*", ... })
    • sendRequestForResult({ type: "GeckoView:*", ... })
  • There is no access control or verification for event types here either.

2.3 Java Side: org.mozilla.gecko.EventDispatcher

File
mobile/android/geckoview/src/main/java/org/mozilla/gecko/EventDispatcher.java

Excerpt:

    public final class EventDispatcher extends JNIObject {

      private final MultiMap<String, BundleEventListener> mListeners =
          new MultiMap<>(DEFAULT_UI_EVENTS_COUNT);

      public void registerUiThreadListener(
          final BundleEventListener listener, final String... events) {
        synchronized (mListeners) {
          for (final String event : events) {
            mListeners.add(event, listener);
          }
          flush(events);
        }
      }

      @AnyThread
      private void dispatch(
          final String type, final GeckoBundle message, final EventCallback callback) {

        final boolean isGeckoReady;
        synchronized (this) {
          isGeckoReady = isReadyForDispatchingToGecko();
          if (isGeckoReady && mAttachedToGecko && hasGeckoListener(type)) {
            dispatchToGecko(type, message, JavaCallbackDelegate.wrap(callback));
            return;
          }
        }

        dispatchToThreads(type, message, callback, isGeckoReady);
      }

      private boolean dispatchToThreads(
          final String type,
          final GeckoBundle message,
          final EventCallback callback,
          final boolean isGeckoReady) {

        synchronized (mListeners) {
          if (mListeners.containsKey(type)) {
            final EventCallback wrappedCallback = JavaCallbackDelegate.wrap(callback);

            for (final BundleEventListener listener : mListeners.get(type)) {
              ThreadUtils.getUiHandler()
                  .post(() -> listener.handleMessage(type, message, wrappedCallback));
            }
            return true;
          }
        }

        // Subsequent code handles pending queues and error processing
      }
    }

Findings:

  • The aMessage.data passed from GeckoViewActorParent is packed into a GeckoBundle and decomposed into:
    • message (Event body)
    • type (Event type string "GeckoView:*")
  • If a BundleEventListener linked to the type exists, handleMessage(type, message, callback) is called directly on the UI thread.
  • Even here, neither the validity of type nor the verification of fields inside message is checked.

2.4 Concrete Examples on Android Side: Permission / Autofill

2.4.1 Permission: GeckoViewPermissionChild โ†’ Java Permission Handler

File
mobile/shared/actors/GeckoViewPermissionChild.sys.mjs

    export class GeckoViewPermissionChild extends GeckoViewActorChild {
      ...

      async promptPermission(aRequest) {
        const types = aRequest.types.QueryInterface(Ci.nsIArray);
        if (types.length !== 1) {
          return { allow: false };
        }

        const perm = types.queryElementAt(0, Ci.nsIContentPermissionType);
        ...

        const principal =
          perm.type === "storage-access"
            ? aRequest.principal
            : aRequest.topLevelPrincipal;

        let allowOrDeny;
        try {
          allowOrDeny = await this.eventDispatcher.sendRequestForResult({
            type: "GeckoView:ContentPermission",
            uri: principal.URI.displaySpec,
            thirdPartyOrigin: aRequest.principal.origin,
            principal: lazy.E10SUtils.serializePrincipal(principal),
            perm: perm.type,
            value: perm.capability,
            contextId: principal.originAttributes.geckoViewSessionContextId ?? null,
            privateMode: principal.privateBrowsingId != 0,
          });

          if (allowOrDeny === Services.perms.ALLOW_ACTION) {
            if (perm.type === "geolocation") {
              const granted = await this.getAppPermissions([
                PERM_ACCESS_FINE_LOCATION,
              ]);
              allowOrDeny = granted
                ? Services.perms.ALLOW_ACTION
                : Services.perms.DENY_ACTION;
            }
          }
        } catch (error) {
          console.error("Permission error:", error);
          allowOrDeny = Services.perms.DENY_ACTION;
        }

        ...
      }
    }

All fields sent here (uri, thirdPartyOrigin, principal, perm, value, contextId, privateMode) are constructed within the child process JS.

On the Java side, Permission-related code in GeckoSession receives the "GeckoView:ContentPermission" event, creates an object equivalent to ContentPermission from the GeckoBundle, and presents it to the UI or passes it to the app's PermissionDelegate (confirmed in code).


2.4.2 Autofill: GeckoViewAutofill.sys.mjs โ†’ Autofill.Support

JS File
mobile/shared/modules/geckoview/GeckoViewAutofill.sys.mjs

    class Autofill {
      constructor(sessionId, eventDispatcher) {
        this.eventDispatcher = eventDispatcher;
        this.sessionId = sessionId;
      }

      start() {
        this.eventDispatcher.sendRequest({
          type: "GeckoView:StartAutofill",
          sessionId: this.sessionId,
        });
      }

      add(node) {
        return this.eventDispatcher.sendRequestForResult({
          type: "GeckoView:AddAutofill",
          node,
        });
      }

      focus(node) {
        this.eventDispatcher.sendRequest({
          type: "GeckoView:OnAutofillFocus",
          node,
        });
      }

      update(node) {
        this.eventDispatcher.sendRequest({
          type: "GeckoView:UpdateAutofill",
          node,
        });
      }

      commit(node) {
        this.eventDispatcher.sendRequest({
          type: "GeckoView:CommitAutofill",
          node,
        });
      }

      clear() {
        this.eventDispatcher.sendRequest({
          type: "GeckoView:ClearAutofill",
        });
      }
    }

Java File
mobile/android/geckoview/src/main/java/org/mozilla/geckoview/Autofill.java
From Autofill.Support's registerListeners / handleMessage:

    public void registerListeners() {
      mGeckoSession
          .getEventDispatcher()
          .registerUiThreadListener(
              this,
              "GeckoView:StartAutofill",
              "GeckoView:AddAutofill",
              "GeckoView:ClearAutofill",
              "GeckoView:CommitAutofill",
              "GeckoView:OnAutofillFocus",
              "GeckoView:UpdateAutofill");
    }

    @Override
    public void handleMessage(
        final String event, final GeckoBundle message, final EventCallback callback) {
      if ("GeckoView:AddAutofill".equals(event)) {
        addNode(message.getBundle("node"), callback);
      } else if ("GeckoView:StartAutofill".equals(event)) {
        start(message.getString("sessionId"));
      } else if ("GeckoView:ClearAutofill".equals(event)) {
        clear();
      } else if ("GeckoView:OnAutofillFocus".equals(event)) {
        onFocusChanged(message.getBundle("node"));
      } else if ("GeckoView:CommitAutofill".equals(event)) {
        commit(message.getBundle("node"));
      } else if ("GeckoView:UpdateAutofill".equals(event)) {
        update(message.getBundle("node"));
      }
    }

Subsequently, Autofill.Session.Node interprets fields included in node such as uuid, bounds, attributes, type, and hint to construct a node tree for Autofill.

3. Threat Model

  • Attacker:
    • An attacker who has already achieved arbitrary code execution (RCE) within the GeckoView content process.
  • Victim / Target:
    • An Android user using Firefox.
  • Compromised Boundary:
    • Untrusted Zone: Sandboxed Content Process.
    • Trusted Zone: Parent Process (Android App + GeckoView Java Layer) (Possesses privileges for permission management, autofill, UI display, filesystem, etc.).
    • Issue: The Trust Boundary in the IPC bridge (GeckoViewActorParent) between these two zones is not functioning.
  • Prerequisites:
    • The attacker controls native or privileged JS code within the affected content process and can do one of the following:
      • Execute within the context of the relevant JSWindowActorChild.
      • Inject/Modify the Actor's JS module.
    • Under this assumption, the attacker can legitimately obtain the EventDispatcher via EventDispatcher.forActor(this).
  • Attack Vector:
    • The attacker constructs arbitrary DispatcherMessage / DispatcherQuery payloads with a chosen type and body, sending them through GeckoViewActorParent to the Java EventDispatcher. These are dispatched as if they were trusted events from Gecko.
  • Note: This report does not claim that these APIs can be called via Web Content JS alone. The premise is a compromised content process (Post-RCE).

4. Attack Scenario

This section describes a logical reproduction based on the code rather than a fully instrumented end-to-end PoC. It aims to demonstrate the following:

  1. A compromised child process can send arbitrary GeckoView:* events.
  2. These events reach the Java handler without verification by the parent.

Identified Attack Vectors

By exploiting the unvalidated pass-through mechanism of GeckoViewActorParent, the following attacks are possible. These are examples and not exhaustive; any arbitrary GeckoView:* event that a content process can transmit to GeckoViewActorParent can be exploited. Since EventDispatcher.java also transmits to GeckoSession.java without validation, GeckoViewActorParent can abuse functions that should originally be restricted to the child process (e.g., GeckoViewNavigation.sys.mjs).

  • Permission Prompt Origin Spoofing

    • Mechanism: A compromised content process sends a GeckoView:AndroidPermission (or ContentPermission) event as a DispatcherQuery. The Parent Process (GeckoViewActorParent) and EventDispatcher do not verify the authenticity of the sender and pass the uri in the payload directly to the permission handler on the Java side.
    • Attack: While executing code on a page under their control, the attacker constructs a payload spoofing the uri of a trusted site (e.g., trusted-bank.example) and requests sensitive permissions like Geolocation.
    • Impact: Since the request appears to come from a trusted site on the App UI, the user may mistakenly grant the permission (UI/Origin Spoofing). Additionally, the granted permission state may be incorrectly associated with the spoofed origin.
  • Autofill Abuse

    • Mechanism: Send a GeckoView:AddAutofill event, passing a node object containing a spoofed origin, formId, and field data to the Autofill support on the Java side. The Java side processes this information unconditionally as coming from a trusted Gecko source.
    • Attack: The attacker sends fake form information with the origin of a target site (e.g., https://target-site.example), misleading the system into believing the user is currently on that target site.
    • Impact: The autofill flow is triggered in the wrong context. Since Firefox's default behavior autofills passwords based on origin, exploiting this allows the attacker to illicitly acquire (steal) the user's stored credentials (ID/Password) for the target site.
  • URL Bar Spoofing

    • Mechanism: GeckoViewActorChild.sys.mjs sends a GeckoView:LocationChange event to GeckoViewActorParent. EventDispatcher.java transmits only the event name and data, such as the URI, to GeckoSession.java.
    • Attack: A compromised content process displays a reliable domain like google.com or bank.com in the browser's URL bar while actually displaying the attacker's page.
    • Impact: It becomes extremely easy to deceive users into entering credentials on a phishing site.
  • History Sniffing

    • Mechanism: Send a GeckoView:GetVisited event as a DispatcherQuery.
    • Attack: Send an arbitrary URL list and retrieve a list of booleans indicating "whether the user has visited that site" from the Java side HistoryDelegate (mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java#8042-8152).
    • Impact: Bypasses the Same-Origin Policy (SOP) and leaks user history.
  • Drive-by Download

    • Mechanism: Send events such as GeckoView:SavePdf or GeckoView:ExternalResponse.
    • Attack: Forcefully download and save malicious or unwanted files without explicit user interaction.
    • Impact: Consumes storage space or establishes a foothold for malware placement in the download folder.

5. Impact Analysis

At the architectural level, this vulnerability compromises the assumed boundary between:

  • Untrusted Content Processes
  • Android App / GeckoView Java Layer (which has access rights to):
    • Permission prompts and storage
    • Autofill integration
    • Other high-privilege UI and system APIs

This vulnerable design allows an attacker to:

  • Inject arbitrary GeckoView events (GeckoView:*) into the Java layer via IPC without validation by the parent process.
  • Spoof or confuse origin/URI information in permissions and potentially autofill flows, rendering origin-based policies implemented in the app layer ineffective.
  • Evade sandbox expectations:
    • The Java layer assumes messages coming from GeckoViewActorParent are already trusted and verified, but in reality, they are not.

Even if the ultimate impact were limited to "UI/Origin Spoofing only," this is a significant security issue in the context of a browser. Depending on how the Java side uses unvalidated fields, the impact could expand to:

  • Incorrect association of permission decisions with origins.
  • Incorrect attribution of autofill data or unintended disclosure.
  • Other logic errors in embedded apps that assume trusted input from GeckoView.

Because this bug allows a compromised content process to violate high-level security assumptions within the embedding app, we propose a severity of sec-high.

6. Recommended Fixes and Strategic Recommendations

Based on lessons from Chromium's Mojo IPC security model ("Do not trust the renderer," "Validate all inputs"), we recommend multi-layered mitigation measures.

Validation in GeckoViewActorParent

Change GeckoViewActorParent into a validation layer.
Idea: Before forwarding DispatcherMessage / DispatcherQuery to the EventDispatcher, verify that the origin/URI fields in aMessage.data are consistent with the actual browsing context known to the parent process.

In case of a mismatch, similar to Chromium's mojo::ReportBadMessage, the parent process should treat this as an illegal message and take strong measures (e.g., terminating the violating child process).

7. References

  • GeckoView / Fenix Source Files (Version 147.0a1 codebase):
    • mobile/shared/modules/geckoview/GeckoViewActorParent.sys.mjs
    • mobile/shared/modules/geckoview/GeckoViewActorChild.sys.mjs
    • mobile/android/geckoview/src/main/java/org/mozilla/gecko/EventDispatcher.java
    • mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java
Flags: sec-bounty?

I worked on this vulnerability with [Shota Matsuda/user874there@gmail.com].

Component: Security → General
Product: Firefox → GeckoView
See Also: → 1756056, 1983353

owlish, could you please take a look at this? I'm not sure if this is the same or different as the other GeckoView IPC problems you've been looking at. Thanks.

Flags: needinfo?(bugzeeeeee)

There are several distinct issues wrapped up here. I'll call this sec-high over all, but after the eventDispatcher fixes from bug 1756056 and bug 1983353 land we'll have to reevaluate whether the remaining unfixed issues still earn that rating.

Keywords: sec-high
Severity: -- → S2
Flags: needinfo?(bugzeeeeee)
Priority: -- → P2
Group: firefox-core-security → mobile-core-security

Hello team,

As 17 days have passed since the last update, I'm respectfully following up on this bug's progress. I understand that complex security issues require careful handling and that work with dependencies is ongoing.

Could you please share the current status? Also, if any additional technical information, analysis, or anything from my side would be helpful, please let me know.

Hi Daisuke, we are actively working on the bugs Daniel mentioned in the comment above. We think this might be a dupe, but we will get to this one after we are done with those bugs and assess.

Assignee: nobody → bugzeeeeee
Whiteboard: [client-bounty-form] → [client-bounty-form][group6]

Examined the vulnerable code:

We still don't have any validation in the Parent Actors; moreover, when writing and/or reviewing code, you need to be careful to close the loophole that might make it possible to overwrite the event type in the parent actor - this is prone to human error and should be guarded against.

Before forwarding DispatcherMessage / DispatcherQuery to the EventDispatcher, verify that the origin/URI fields in aMessage.data are consistent with the actual browsing context known to the parent process.

In case of a mismatch, similar to Chromium's mojo::ReportBadMessage, the parent process should treat this as an illegal message and take strong measures (e.g., terminating the violating child process).

I think we need to implement that, so this bug is only a partial dupe, and these concerns are still valid.

when writing and/or reviewing code, you need to be careful to close the loophole that might make it possible to overwrite the event type in the parent actor - this is prone to human error and should be guarded against.

This concern of mine I addressed in the second patch for bug 1983353.

Additionally, I examined more closely the Threat Model and the Attack Scenario.

In the Thread Model, one of the prerequisites:

Under this assumption, the attacker can legitimately obtain the EventDispatcher via EventDispatcher.forActor(this).

is no longer there because after fixing the bugs 1756056 and 1983353, EventDispatcher is no longer obtainable from the content process, and EventDispatcher.forActor no longer exists. We still don't check the event payload, however. There is also no schema validation for communication within the actor pair (there is some work started in bug 1885221 but it is not completed yet).

In Attack Scenario section, similarly

A compromised child process can send arbitrary GeckoView:* events.

this concern is no longer true after fixing bug 1983353. However, there is still no verification in the parent.

Almost all the attack vectors (URL Bar Spoofing, History Sniffing, Drive-by Download) will no longer exist after bug 1983353 is merged. The Autofill Abuse attack vector is not possible either; those events are sent from a module which runs in the parent process.

The Permission Prompt Origin Spoofing vector is more interesting - I guess sendQuery can still be hijacked, and there still probably needs to be some sort of a check in the parent process.

I am now going to do some investigation into what sort of checks can we implement for the most critical messages, where things like urls are present.

I investigated the Permission Prompt Origin Spoofing vector defined by the reporter. I came to the conclusion that the logic we currently have in the child actor for permission prompts doesn't actually need to be in the content process at all.

I am actually not sure if there is even a need for a URI spoofing - I think simply because we have that function defined in the content process, if somebody achieves ACE/RCE, they can simply return "allow" from that function. So the problem here is not so much absence of the URI validation, but rather the presence of that function in the content process at all. I experimented with moving that logic (and some of the parent actor logic as well) into the GeckoViewPermission module, and was able to get the tests passing. Before making a patch, I would like to add a couple of tests cases with two GeckoSessions and with multiple subframes, just to make sure everything still functions correctly with my fix.

I will also investigate our other APIs (that are not mentioned in this bug), to make sure we don't have too much critical logic in the content process, and to see if there are any validation checks I can add.

Do we have sandboxing between processes on Android? At one point we were relying on the general app sandboxing that Android provided but not internal sandboxing.

Duplicate of this bug: 2024086
See Also: → 2024086

(In reply to Daniel Veditz [:dveditz] from comment #9)

Do we have sandboxing between processes on Android? At one point we were relying on the general app sandboxing that Android provided but not internal sandboxing.

Yes, as far as I know, the Android version of Firefox uses a multi-process architecture, with the content process and the privileged process (such as the Java layer) isolated from each other through mechanisms like Seccomp-BPF and IPC verification. Additionally, as you mentioned, the Firefox application itself is also sandboxed by the Android app sandbox.

Status: UNCONFIRMED → ASSIGNED
Ever confirmed: true
Attached file (secure) โ€”
Duplicate of this bug: 2026459

(In reply to Daisuke Hatakeyama from comment #12)

(In reply to Daniel Veditz [:dveditz] from comment #9)

Do we have sandboxing between processes on Android? At one point we were relying on the general app sandboxing that Android provided but not internal sandboxing.

Yes, as far as I know, the Android version of Firefox uses a multi-process architecture, with the content process and the privileged process (such as the Java layer) isolated from each other through mechanisms like Seccomp-BPF and IPC verification. Additionally, as you mentioned, the Firefox application itself is also sandboxed by the Android app sandbox.

That is not correct, we haven't shipped isolated processes yet. See https://bugzilla.mozilla.org/show_bug.cgi?id=1565196

(In reply to Daniel Veditz [:dveditz] back 2026-04-08 from comment #9)

Do we have sandboxing between processes on Android? At one point we were relying on the general app sandboxing that Android provided but not internal sandboxing.

Currently we don't

(In reply to [:owlish] ๐Ÿฆ‰ PST from comment #15)

(In reply to Daisuke Hatakeyama from comment #12)

(In reply to Daniel Veditz [:dveditz] from comment #9)

Do we have sandboxing between processes on Android? At one point we were relying on the general app sandboxing that Android provided but not internal sandboxing.

Yes, as far as I know, the Android version of Firefox uses a multi-process architecture, with the content process and the privileged process (such as the Java layer) isolated from each other through mechanisms like Seccomp-BPF and IPC verification. Additionally, as you mentioned, the Firefox application itself is also sandboxed by the Android app sandbox.

That is not correct, we haven't shipped isolated processes yet. See https://bugzilla.mozilla.org/show_bug.cgi?id=1565196

Sorry๏ผŽ I conflated Firefox for Androidโ€™s multi-process architecture and the trust/privilege boundary in GeckoView IPC with Android isolated-process-based internal process isolation.

Comment on attachment 9554726 [details]
(secure)

Security Approval Request

  • How easily could an exploit be constructed based on the patch?: Relatively easy
  • Do comments in the patch, the check-in comment, or tests included in the patch paint a bulls-eye on the security problem?: No
  • Which branches (beta, release, and/or ESR) are affected by this flaw, and do the release status flags reflect this affected/unaffected state correctly?: release
  • If not all supported branches, which bug introduced the flaw?: None
  • Do you have backports for the affected branches?: Yes
  • If not, how different, hard to create, and risky will they be?:
  • How likely is this patch to cause regressions; how much testing does it need?: Hopefully none
  • Is the patch ready to land after security approval is given?: Yes
  • Is Android affected?: Yes
Attachment #9554726 - Flags: sec-approval?
Depends on: 1756056, 1983353
See Also: → 1885221

Comment on attachment 9554726 [details]
(secure)

sec-approval+ to land now, and request uplifts if you're also going to uplift bug 1983353 to Fx150 (which I suspect you aren't) so it gets more regression testing

Attachment #9554726 - Flags: sec-approval? → sec-approval+

Filed Bug 2030475 to audit other content process actors and modules.

Pushed by asilaghi@mozilla.com: https://github.com/mozilla-firefox/firefox/commit/f273a392f174 https://hg.mozilla.org/integration/autoland/rev/381d143a75f6 Revert "Bug 2003171 - Consolidate methods in a module r=geckoview-reviewers,nika" for casuing xpschell failures at modules/Messaging
Pushed by csabou@mozilla.com: https://github.com/mozilla-firefox/firefox/commit/c91b8c1d6bec https://hg.mozilla.org/integration/autoland/rev/860bcf6ebad2 Revert "Bug 2003171 - Consolidate methods in a module r=geckoview-reviewers,nika" for causing ESlint failures on GeckoViewPermission.sys.mjs.

TEST-UNEXPECTED-ERROR | /builds/worker/checkouts/gecko/mobile/shared/components/geckoview/GeckoViewPermission.sys.mjs:11:3 | Unused lazy property EventDispatcher (mozilla/valid-lazy)

Group: mobile-core-security → core-security-release
Status: ASSIGNED → RESOLVED
Closed: 5 months ago
Resolution: --- → FIXED
Target Milestone: --- → 151 Branch
Flags: sec-bounty? → sec-bounty+
QA Whiteboard: [sec] [qa-triage-done-c152/b151]
Whiteboard: [client-bounty-form][group6] → [client-bounty-form][group6][adv-main151+][adv-esr115.36+][adv-esr140.11+]
Whiteboard: [client-bounty-form][group6][adv-main151+][adv-esr115.36+][adv-esr140.11+] → [client-bounty-form][group6][adv-main151+]
Alias: CVE-2026-8945
See Also: → 2049804
Duplicate of this bug: 2022470
Flags: needinfo?(bugzeeeeee)
Group: core-security-release
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: