Closed Bug 2043139 (CVE-2026-12299) Opened 5 months ago Closed 5 months ago

HTMLElement.innerText and outerText are marked [Pure] but can run script via MozScrolledAreaChanged

Categories

(Core :: DOM: Core & HTML, defect)

defect

Tracking

()

RESOLVED FIXED
153 Branch
Tracking Status
firefox-esr115 152+ fixed
firefox-esr140 152+ fixed
firefox151 --- wontfix
firefox152 + fixed
firefox153 + fixed

People

(Reporter: deayzl, Assigned: smaug)

References

Details

(Keywords: csectype-jit, reporter-external, sec-high, Whiteboard: [client-bounty-form][adv-main152+][adv-esr115.37+][adv-esr140.12+])

Attachments

(5 files, 2 external files)

Summary

  1. Optimized JIT code hoists a typed-array backing-store pointer across an HTMLElement.innerText getter.
  2. innerText flushes layout and dispatches MozScrolledAreaChanged.
  3. The event handler runs script and calls ab.transfer(0) on an XHR-backed ArrayBuffer.
  4. The original 2048-byte ArrayBuffer backing allocation is freed.
  5. A canvas setLineDash() spray reclaims that same heap address as an nsTArray<gfx::Float> buffer.
  6. The optimized loop resumes and performs the stale typed-array store into the reclaimed allocation.
  7. The stale write overwrites the nsTArrayHeader with 0x4141414141414141.
  8. getLineDash() later trusts the corrupted mLength and reads past the real 2048-byte allocation, producing ASAN heap-buffer-overflow.

Reproduction

testd commit version: 0e1add40350764cc84e5d7e2e2ee94906c7d2734

build firefox with:

mk_add_options MOZ_OBJDIR=/home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser

ac_add_options --enable-project=browser
ac_add_options --enable-address-sanitizer
ac_add_options --disable-install-strip
ac_add_options --disable-jemalloc
ac_add_options --disable-crashreporter
ac_add_options --disable-profiling

# Keep stack use reasonable while retaining useful line information.
ac_add_options --enable-optimize="-O1"
ac_add_options --enable-debug-symbols=-gline-tables-only

# Optional but useful for GC-sensitive SpiderMonkey reproduction work.
ac_add_options --enable-gczeal

prepare server with attached html:

truncate -s 2048 payload.bin
python3 -m http.server 8765 --bind 127.0.0.1

make firefox render:

ASAN_OPTIONS='quarantine_size_mb=0' /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dist/bin/firefox 'http://127.0.0.1:8765/firefox-innertext-xhr-canvas-dash-uaf.html?warmup=2200&warmupIters=20&attempts=20&triggerIters=120&payloadSize=2048&dashLength=510&sprayCanvases=8000&getDashStride=1' > asan.log 2>&1

Result:

REPRO_STATUS mode=xhr-canvas-dash-uaf
REPRO payloadSize=2048
REPRO dashLength=510
REPRO preTouch=false
REPRO warming calls=2200 iters=20
REPRO warmup 250/2200
REPRO warmup 500/2200
REPRO warmup 750/2200
REPRO warmup 1000/2200
REPRO warmup 1250/2200
REPRO warmup 1500/2200
REPRO warmup 1750/2200
REPRO warmup 2000/2200
REPRO warmup done
REPRO starting attempts=20 sprayCanvases=8000
REPRO_XHR status=200 bytes=2048
=================================================================
==1187140==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x708feed95680 at pc 0x6ebfdaa3bcbe bp 0x7fff35789e60 sp 0x7fff35789e58
READ of size 4 at 0x708feed95680 thread T0 (Isolated Web Co)
/home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dist/bin/llvm-symbolizer: error: '[anon:js-executable-memory]': No such file or directory
    #0 0x6ebfdaa3bcbd in Construct<const float &> /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dist/include/nsTArray.h:554:36
    #1 0x6ebfdaa3bcbd in AppendElementInternal<nsTArrayInfallibleAllocator, const float &> /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dist/include/nsTArray.h:2587:3
    #2 0x6ebfdaa3bcbd in AppendElement<const float &> /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dist/include/nsTArray.h:2717:24
    #3 0x6ebfdaa3bcbd in mozilla::dom::CanvasRenderingContext2D::GetLineDash(nsTArray<double>&) const [...]firefox/dom/canvas/CanvasRenderingContext2D.cpp:5514:15
    #4 0x6ebfda25a7f8 in mozilla::dom::CanvasRenderingContext2D_Binding::getLineDash(JSContext*, JS::Handle<JSObject*>, void*, JSJitMethodCallArgs const&) [...]/dom/bindings/CanvasRenderingContext2DBinding.cpp:6347:24
    #5 0x6ebfda8460c5 in bool mozilla::dom::binding_detail::GenericMethod<mozilla::dom::binding_detail::NormalThisPolicy, mozilla::dom::binding_detail::ThrowExceptions>(JSContext*, unsigned int, JS::Value*) [...]dom/bindings/BindingUtils.cpp:3217:13
    #6 0x6ebfe3cc2d20 in CallJSNative /home/slave/firefox-bug-bounty/firefox/js/src/vm/Interpreter.cpp:498:13
    ...

0x708feed95680 is located 0 bytes after 2048-byte region [0x708feed94e80,0x708feed95680)
allocated by thread T0 (Isolated Web Co) here:
    #0 0x634ce9eeb7ec in realloc /builds/worker/fetches/llvm-project/compiler-rt/lib/asan/asan_malloc_linux.cpp:81:3
    #1 0x6ebfd3b3f23d in Realloc /home/slave/firefox-bug-bounty/
    ...
SUMMARY: AddressSanitizer: heap-buffer-overflow /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dist/include/nsTArray.h:554:36 in Construct<const float &>
Shadow bytes around the buggy address:
  0x708feed95400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x708feed95480: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x708feed95500: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x708feed95580: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x708feed95600: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x708feed95680:[fa]fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x708feed95700: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x708feed95780: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x708feed95800: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x708feed95880: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x708feed95900: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==1187140==ABORTING
[Parent 1186885, IPC I/O Parent] WARNING: process 1187140 exited with status 1: file firefox/ipc/chromium/src/chrome/common/process_watcher_posix_sigchld.cc:155
Flags: sec-bounty?
Attached file asan.log —
Attachment #9590870 - Attachment mime type: text/x-log → text/plain

Jan, it sounds like maybe this is a problem with a JIT optimization and not the canvas 2d code? Or should I move it elsewhere. Thanks.

Group: firefox-core-security → javascript-core-security
Component: Security → JavaScript Engine: JIT
Flags: needinfo?(jdemooij)
Product: Firefox → Core

(I've edited comment 0 to add 4 more frames to the ASan stack for clarity.)

(In reply to Hyeonjun Ahn [:deayzl] from comment #0)

  1. Optimized JIT code hoists a typed-array backing-store pointer across an HTMLElement.innerText getter.

Assuming that the writeup is accurate, this is the bug. We should not be able to do this. Looking at the JSJitInfo that the DOM provides for HTMLElement.innerText, its alias set is JSJitInfo::AliasDOMSets, which implies that it has no side-effects (and that its value can only be changed by changing something in the DOM). If it can trigger a callback that runs arbitrary code (here, MozScrolledAreaChanged), then it should instead have JSJitInfo::AliasEverything.

I'm not an expert on how webidl turns into JSJitInfo, but cross-referencing some other getters with the same alias set, it looks the Pure annotation is to blame here.

Okay, great. I guess a bad annotation for innerText would make this more of a DOM issue then.

Group: javascript-core-security → dom-core-security
Component: JavaScript Engine: JIT → DOM: Core & HTML
Keywords: csectype-uaf

Clearing the NI since Iain already looked at this.

Flags: needinfo?(jdemooij)

The [Pure] of outerText is also problematic, so heap-buffer-overflow is reproducible using it.

ASAN_OPTIONS='quarantine_size_mb=0' \
  /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dist/bin/firefox \
  'http://127.0.0.1:8765/firefox-outertext-xhr-canvas-dash-uaf.html?warmup=2200&warmupIters=20&attempts=20&triggerIters=1&payloadSize=2048&dashLength=510&sprayCanvases=8000&getDashStride=1&p
reTouch=1'

Result:

=================================================================
==3587411==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x791c399a0a80 at pc 0x774c2543bcbe bp 0x7ffd56fddc20 sp 0x7ffd56fddc18
READ of size 4 at 0x791c399a0a80 thread T0 (Isolated Web Co)
    #0 0x774c2543bcbd in Construct<const float &> /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dist/include/nsTArray.h:554:36
    ...
    #37 0x774c22f8c9ae in mozilla::dom::Document::FlushPendingNotifications(mozilla::ChangesToFlush) /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dom/base/./../../../firefox/dom/base/Document.cpp:11635:16
    #38 0x774c267406b9 in nsGenericHTMLElement::GetInnerText(mozilla::dom::DOMString&, mozilla::ErrorResult&) /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dom/html/./../../../firefox/dom/html/nsGenericHTMLElement.cpp:3393:10
    #39 0x774c235d6c82 in GetOuterText /home/slave/firefox-bug-bounty/firefox/dom/html/nsGenericHTMLElement.h:270:12
    #40 0x774c235d6c82 in mozilla::dom::HTMLElement_Binding::get_outerText(JSContext*, JS::Handle<JSObject*>, void*, JSJitGetterCallArgs) /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dom/bindings/./HTMLElementBinding.cpp:1387:24
    #41 0x352de352eef8  ([anon:js-executable-memory]+0x10ef8)
    #42 0x352de34fe3bd  ([anon:js-executable-memory]+0x3bd)
    #43 0x774c2e4d9cc8 in EnterJit /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/js/src/jit/./../../../../firefox/js/src/jit/Jit.cpp:105:5
    #44 0x774c2e4d9cc8 in js::jit::MaybeEnterJit(JSContext*, js::RunState&) /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/js/src/jit/./../../../../firefox/js/src/jit/Jit.cpp:253:10

(you can see mozilla::dom::HTMLElement_Binding::get_outerText in attached asan-outertext-canvas-dash.log)

So I applied below patch, and both htmls that i attached did not reproduce the bug.

diff --git a/dom/webidl/HTMLElement.webidl b/dom/webidl/HTMLElement.webidl
index 034aa0de194f..e5d4fea347ee 100644
--- a/dom/webidl/HTMLElement.webidl
+++ b/dom/webidl/HTMLElement.webidl
@@ -25,9 +25,9 @@ interface HTMLElement : Element {
   [CEReactions, SetterThrows, Pure]
            attribute DOMString dir;
 
-  [CEReactions, GetterThrows, Pure]
+  [CEReactions, GetterThrows]
            attribute [LegacyNullToEmptyString] DOMString innerText;
-  [CEReactions, GetterThrows, SetterThrows, Pure]
+  [CEReactions, GetterThrows, SetterThrows]
            attribute [LegacyNullToEmptyString] DOMString outerText;
 
   // user interaction

I don't understand how they can be "Pure" which translates to Affects=Nothing. That can't be true?

Olli, do you remember the background behind bug 923913, other than "it's faster that way"?

Flags: needinfo?(smaug)

For confirming its highest impact, here's a reproducer for pc control.

  1. The optimized loop reads generic HTMLElement.innerText.
  2. The same loop performs an in-bounds typed-array store.
  3. Warmup compiles the loop.
  4. After warmup, the script makes the descendant of the same div dirty by child.style.height = (230000 + index) + "px";.
  5. The large child height changes the scroll area during GetInnerText’s flush, so the layout flush dispatches MozScrolledAreaChanged.
  6. The event handler detaches the buffer and makeListBucket() sprays new datalist elements and accesses each dl.options to reclaim the freed ArrayBuffer backing-store as ContentList object.
  7. The stale typed-array store overwrites ContentList::mFunc with 0x414141414141 at offset 240, then options.length triggers ContentList::Match() which executes return (*mFunc)(aElement, mMatchNameSpaceId, mXMLMatchAtom, mData);.
ASAN_OPTIONS='quarantine_size_mb=0' /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dist/bin/firefox 'http://127.0.0.1:8765/firefox-innertext-xhr-datalist-mfunc-call.html?payload=payload-280.bin?x=1&warmup=2200&warmupIters=20&attempts=40&triggerIters=120&payloadSize=280&sprayLists=12000&writeIndex=30&callTarget=0x0000414141414141&preTouch=1' > pc-control.log 2>&1

Result:

...
REPRO warmup 2000/2200
REPRO warmup done
REPRO starting attempts=40
REPRO_XHR status=200 bytes=280
AddressSanitizer:DEADLYSIGNAL
=================================================================
==3940175==ERROR: AddressSanitizer: SEGV on unknown address 0x414141414141 (pc 0x414141414141 bp 0x7ffcc2d22db0 sp 0x7ffcc2d22d78 T0)
==3940175==The signal is caused by a READ memory access.
AddressSanitizer:DEADLYSIGNAL
AddressSanitizer: nested bug in the same thread, aborting.
[Parent 3939949, IPC I/O Parent] WARNING: process 3940175 exited with status 1: file firefox/ipc/chromium/src/chrome/common/process_watcher_posix_sigchld.cc:155

(In reply to Kagami Rosylight [:saschanaz] (they/them) from comment #10)

I don't understand how they can be "Pure" which translates to Affects=Nothing. That can't be true?

Olli, do you remember the background behind bug 923913, other than "it's faster that way"?

This is not about innerHTML, but innerText. They are quite different beasts.
innerHTML should be fine

Flags: needinfo?(smaug)
Assignee: nobody → smaug

And innetHTML is "purer" than innerText? 🤔 Still confused

I haven't verified this yet, but it sounds plausible, so I'll mark it sec-high. I think the underlying issue here is around JIT optimization, so I'll change it to csectype-jit although this is more of a misrepresentation by DOM code than the fault of the actual JIT.

I'm still trying to reproduce this. No luck with my normal asan build, but perhaps gczeal is needed.

(In reply to Olli Pettay [:smaug][bugs@pettay.fi] from comment #17)

I'm still trying to reproduce this. No luck with my normal asan build, but perhaps gczeal is needed.

I haven't tried to reproduce this but make sure the loop runs for at least a few thousand iterations, to hit Ion. javascript.options.ion.offthread_compilation = false might also help.

with that and ASAN_OPTIONS='quarantine_size_mb=0' I managed to reproduce. And removing Pure helps as expected.

Status: UNCONFIRMED → ASSIGNED
Ever confirmed: true
Summary: heap-buffer-overflow from corrupted canvas line dash metadata → HTMLElement.innerText and outerText are marked [Pure] but can run script via MozScrolledAreaChanged

I added JS::AutoAssertNoGC nogc; to the start of nsGenericHTMLElement::GetInnerText and it fires off when we are creating the reflector for MozScrolledAreaChanged, which can give you a sense of how we're running content JS. That's not exactly the invariant we probably would want, but there's a JS::Call later on in HandleEvent. Here's an excerpt from that stack:

    #11 0x000133758604 in mozilla::dom::EventListener::HandleEvent(mozilla::dom::BindingCallContext&, JS::Handle<JS::Value>, mozilla::dom::Event&, mozilla::ErrorResult&)
    #18 0x0001397fa5a8 in mozilla::ScrollContainerFrame::FireScrolledAreaEvent()
    #19 0x0001397fa2c0 in mozilla::ScrollContainerFrame::ScrolledAreaEvent::Run()
    #20 0x000131625a68 in nsContentUtils::RemoveScriptBlocker()
    #21 0x000139638ab4 in mozilla::PresShell::ProcessReflowCommands(bool)
    #22 0x00013960f184 in mozilla::PresShell::DoFlushPendingNotifications(mozilla::ChangesToFlush)
    #23 0x000131aac778 in mozilla::dom::Document::FlushPendingNotifications(mozilla::ChangesToFlush)
    #24 0x000134e2f444 in nsGenericHTMLElement::GetInnerText(mozilla::dom::DOMString&, mozilla::ErrorResult&)
    #25 0x0001321d6cb4 in mozilla::dom::HTMLElement_Binding::get_innerText(JSContext*, JS::Handle<JSObject*>, void*, JSJitGetterCallArgs)
Attached file (secure) —

(In reply to Andrew McCreight [:mccr8] from comment #20)

I added JS::AutoAssertNoGC nogc; to the start of nsGenericHTMLElement::GetInnerText and it fires off when we are creating the reflector for MozScrolledAreaChanged, which can give you a sense of how we're running content JS. That's not exactly the invariant we probably would want, but there's a JS::Call later on in HandleEvent. Here's an excerpt from that stack:

Can event dispatch run JS code? This is from an older build, but I see things like this (which uses gfx::VRManager, so perhaps not too relevant):

mozilla::ScrollContainerFrame::FireScrolledAreaEvent()
mozilla::EventDispatcher::Dispatch(mozilla::dom::EventTarget*, nsPresContext*, mozilla::WidgetEvent*, mozilla::dom::Event*, uint32*, mozilla::EventDispatchingCallback*, nsTArray<mozilla::dom::EventTarget*>*)
mozilla::EventTargetChainItem::HandleEventTargetChain(nsTArray<mozilla::EventTargetChainItem>&, mozilla::EventChainPostVisitor&, mozilla::EventDispatchingCallback*, mozilla::ELMCreationDetector&)
mozilla::EventTargetChainItem::PostHandleEvent(mozilla::EventChainPostVisitor&)
mozilla::dom::EventTarget.PostHandleEvent:0
nsGlobalWindowInner.PostHandleEvent:0
nsGlobalWindowInner::PostHandleEvent(mozilla::EventChainPostVisitor&)
mozilla::dom::VREventObserver::NotifyAfterLoad()
mozilla::gfx::VRManagerChild::FireDOMVRDisplayConnectEventsForLoad(mozilla::gfx::VRManagerEventObserver*)
nsContentUtils::AddScriptRunner(already_AddRefed<nsIRunnable>)
nsIRunnable.Run:0
(js-code)

or if you don't like the VR stuff:

mozilla::ScrollContainerFrame::FireScrolledAreaEvent()
mozilla::EventDispatcher::Dispatch(mozilla::dom::EventTarget*, nsPresContext*, mozilla::WidgetEvent*, mozilla::dom::Event*, uint32*, mozilla::EventDispatchingCallback*, nsTArray<mozilla::dom::EventTarget*>*)
mozilla::dom::PerformanceMainThread* nsPresContext::GetPerformanceMainThread() const
mozilla::dom::Performance* nsPIDOMWindowInner::GetPerformance()
nsPIDOMWindowInner::CreatePerformanceObjectIfNeeded()
mozilla::dom::Performance::CreateForMainThread(nsPIDOMWindowInner*, nsIPrincipal*, nsDOMNavigationTiming*, nsITimedChannel*)
mozilla::dom::PerformanceMainThread::PerformanceMainThread(nsPIDOMWindowInner*, nsDOMNavigationTiming*, nsITimedChannel*)
_ZN7mozilla3dom21PerformanceMainThreadC4EP18nsPIDOMWindowInnerP21nsDOMNavigationTimingP15nsITimedChannel
mozilla::dom::PerformanceMainThread::CreateNavigationTimingEntry()
PerformanceMainThread.cpp:void mozilla::dom::{anonymous}::GetURLSpecFromChannel(nsITimedChannel*, const nsTSubstring<char16_t>&)
nsIChannel.GetURI:0
(js-code)

(but this is from the hazard analysis, which is excessively conservative about such things in Gecko code.)

(In reply to Steve Fink [:sfink] [:s:] from comment #22)

Can event dispatch run JS code?

Yes as it triggers event listeners which are JS functions.

Severity: -- → S2

Comment on attachment 9591549 [details]
(secure)

Security Approval Request

  • How easily could an exploit be constructed based on the patch?: I think it is not very obvious
  • 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?: all
  • If not all supported branches, which bug introduced the flaw?: None
  • Do you have backports for the affected branches?: No
  • If not, how different, hard to create, and risky will they be?: I think backports are the same patch except excluding the EditContext part (an API which isn't shipping yet anywhere)
  • How likely is this patch to cause regressions; how much testing does it need?: If this causes regressions, those should be performance issues. Possible, but not very likely.
  • Is the patch ready to land after security approval is given?: Yes
  • Is Android affected?: Yes
Attachment #9591549 - Flags: sec-approval?
Attachment #9591549 - Flags: sec-approval? → sec-approval+

The initial patch applies cleanly to beta.
esr140/115 need another patch.

Attached file (secure) —
Group: dom-core-security → core-security-release
Status: ASSIGNED → RESOLVED
Closed: 5 months ago
Resolution: --- → FIXED
Target Milestone: --- → 153 Branch

The patch landed in nightly and beta is affected.
:smaug, is this bug important enough to require an uplift?

For more information, please visit BugBot documentation.

Flags: needinfo?(smaug)
Whiteboard: [client-bounty-form] → [client-bounty-form][adv-esr115.37+]
Whiteboard: [client-bounty-form][adv-esr115.37+] → [client-bounty-form]
Flags: needinfo?(smaug)

Comment on attachment 9592700 [details]
(secure)

ESR Uplift Approval Request

  • If this is not a sec:{high,crit} bug, please state case for ESR consideration:
  • User impact if declined: Unsafe crashes
  • Fix Landed on Version: 153
  • Risk to taking this patch: Low
  • Why is the change risky/not risky? (and alternatives if risky): This removes couple of JIT<->DOM optimizations
Attachment #9592700 - Flags: approval-mozilla-esr140?
Attachment #9592700 - Flags: approval-mozilla-esr115?

This still needs a Beta request.

Flags: needinfo?(smaug)

Comment on attachment 9591549 [details]
(secure)

Beta/Release Uplift Approval Request

  • User impact if declined/Reason for urgency: Unsafe crashes
  • Is this code covered by automated tests?: No
  • Has the fix been verified in Nightly?: Yes
  • Needs manual test from QE?: No
  • If yes, steps to reproduce: Use ASAN build
  • List of other uplifts needed: None
  • Risk to taking this patch: Low
  • Why is the change risky/not risky? (and alternatives if risky): Removing some JIT<->DOM optimizations
  • String changes made/needed: NA
  • Is Android affected?: Yes
Flags: needinfo?(smaug)
Attachment #9591549 - Flags: approval-mozilla-beta?

Comment on attachment 9591549 [details]
(secure)

Approved for 152.0b8.

Attachment #9591549 - Flags: approval-mozilla-beta? → approval-mozilla-beta+

Comment on attachment 9592700 [details]
(secure)

Approved for 140.12esr and 115.37esr.

Attachment #9592700 - Flags: approval-mozilla-esr140?
Attachment #9592700 - Flags: approval-mozilla-esr140+
Attachment #9592700 - Flags: approval-mozilla-esr115?
Attachment #9592700 - Flags: approval-mozilla-esr115+
QA Whiteboard: [sec] [uplift] [qa-triage-done-c153/b152]
Whiteboard: [client-bounty-form] → [client-bounty-form][adv-main152+]
Whiteboard: [client-bounty-form][adv-main152+] → [client-bounty-form][adv-main152+][adv-esr115.37+]
Whiteboard: [client-bounty-form][adv-main152+][adv-esr115.37+] → [client-bounty-form][adv-main152+][adv-esr115.37+][adv-esr140.12+]
Alias: CVE-2026-12299
Flags: sec-bounty? → sec-bounty+
Group: core-security-release

FWIW bug 2079865 unshipped the MozScrolledAreaChanged event. There are probably other ways to run script tho.

See Also: → 2079865
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: