Closed Bug 2053326 (CVE-2026-16357) Opened 3 months ago Closed 3 months ago

COLRv1 ItemVariationData extent overflow causes web-font OOB read on Windows x86

Categories

(Core :: Graphics, defect)

defect

Tracking

()

RESOLVED FIXED
154 Branch
Tracking Status
firefox-esr115 153+ fixed
firefox-esr140 153+ fixed
firefox152 --- wontfix
firefox153 + fixed
firefox154 + fixed

People

(Reporter: 5up3rh3i, Assigned: jfkthame, NeedInfo)

Details

(Keywords: csectype-bounds, reporter-external, sec-moderate, Whiteboard: [client-bounty-form][adv-main153+][adv-ESR140.13+][adv-ESR115.38+])

Attachments

(14 files)

380 bytes, text/html
Details
1.46 MB, font/ttf
Details
48 bytes, text/x-phabricator-request
Details | Review
48 bytes, text/x-phabricator-request
Details | Review
48 bytes, text/x-phabricator-request
Details | Review
48 bytes, text/x-phabricator-request
Details | Review
48 bytes, text/x-phabricator-request
Details | Review
48 bytes, text/x-phabricator-request
Details | Review
48 bytes, text/x-phabricator-request
Details | Review
48 bytes, text/x-phabricator-request
Details | Review
48 bytes, text/x-phabricator-request
Details | Review
48 bytes, text/x-phabricator-request
Details | Review
48 bytes, text/x-phabricator-request
Details | Review
48 bytes, text/x-phabricator-request
Details | Review
Attached file inner2.html —

Summary

Firefox accepts a malformed COLRv1 web font on Windows x86 while the same font is rejected on x64. The accepted x86 font reaches COLRv1 variation rendering and crashes a sandboxed content process with an out-of-bounds read in COLRFonts.cpp.

The malformed font uses an ItemVariationData record whose logical delta-set byte extent is larger than the physical COLR table. On Windows x86, validation arithmetic wraps and the font is accepted. Rendering then computes a delta-set pointer from the attacker-controlled variation index and reads outside the valid table data.

The trigger is a normal web path: a page loads the font with @font-face and renders text.

Tested Build

Firefox source commit: cea5f8cacbe1ba3c8c95a7b17a309ce6704a4c7d
Affected platform: Windows x86 Firefox build
Control platform: Windows x64 Firefox build
Firefox version: 154.0a1
Build ID: 20260627203348

Affected Code

gfx/ots/src/variations.cc
gfx/thebes/COLRFonts.cpp

OTS validates the variation data subtable with multiplication in size_t:

if (!subtable.Skip(valueSize * size_t(itemCount) *
                   (size_t(wordDeltaCount) + size_t(*regionIndexCount)))) {
  return OTS_FAILURE_MSG("Failed to read delta data");
}

Gecko's COLRv1 validator and consumer then compute delta-set extents and delta-set pointers:

uint32_t deltaSetSize =
    (uint16_t(regionIndexCount) + uint16_t(wordDeltaCount)) << longWords;
const uint8_t* deltaData =
    reinterpret_cast<const uint8_t*>(deltaSets) + deltaSetSize * innerIndex;

Root Cause

The validation path does not enforce an overflow-safe logical extent for ItemVariationData delta sets on 32-bit builds.

PoC parameters:

regionIndexCount = 32768
wordDeltaCount   = 0x8001  (LONG_WORDS | 1)
itemCount        = 65535
deltaSetSize     = (32768 + 1) << 1 = 65538 bytes
logical extent   = 65535 * 65538 = 4,295,032,830 bytes
physical COLR table length: about 1.5 MB

The logical delta array cannot fit inside the COLR table. On Windows x86, the relevant pointer/extent arithmetic wraps and validation accepts the font. On x64, the same font is rejected.

After acceptance on x86, ApplyVariation() uses the variation index to derive a deltaData pointer and reads outside the valid table contents.

Proof of Concept

Attached files:

poc/colrv1_x86_varstore_inner2.ttf
poc/inner2.html

Run Firefox x86 against inner2.html. The page loads the attached font through @font-face and renders text that reaches the COLRv1 variation code.

Evidence

The malformed font is accepted on x86:

{
  "arch": "x86",
  "fontsStatus": "loaded",
  "faces": [{"family": "XColr", "status": "loaded"}],
  "check": true
}

The same malformed font is rejected on x64:

{
  "arch": "x64",
  "fontsStatus": "loaded",
  "faces": [{"family": "XColr", "status": "error"}],
  "check": false
}

The crash is a content-process out-of-bounds read while rendering the web font:

Crash reason:  EXCEPTION_ACCESS_VIOLATION_READ

Thread 0 MainThread (crashed)
 0  xul.dll!(anonymous namespace)::ApplyVariation(...) [COLRFonts.cpp:452]
 1  xul.dll!(anonymous namespace)::PaintVarRadialGradient::MakePattern(...) [COLRFonts.cpp:1176]
 2  xul.dll!(anonymous namespace)::DispatchMakePattern(...) [COLRFonts.cpp:2023]
 3  xul.dll!(anonymous namespace)::PaintGlyph::Paint(...) [COLRFonts.cpp:1300]
 5  xul.dll!(anonymous namespace)::PaintColrGlyph::DoPaint(...) [COLRFonts.cpp:1363]
 6  xul.dll!mozilla::gfx::COLRFonts::PaintGlyphGraph(...) [COLRFonts.cpp:2554]
 7  xul.dll!gfxFont::RenderColorGlyph(...) [gfxFont.cpp:2795]
 8  xul.dll!gfxFont::DrawOneGlyph<1>(...) [gfxFont.cpp:2223]
 10 xul.dll!gfxFont::Draw(...) [gfxFont.cpp:2627]
 12 xul.dll!gfxTextRun::Draw(...) [gfxTextRun.cpp:680]
 15 xul.dll!nsTextFrame::DrawText(...) [nsTextFrame.cpp:8232]
 16 xul.dll!nsTextFrame::PaintText(...) [nsTextFrame.cpp:7905]

Crash metadata:

ProductName=Firefox
Version=154.0a1
BuildID=20260627203348
ProcessType=content
ContentSandboxLevel=9
ContentSandboxWin32kState=Win32k Lockdown enabled

Security Impact

A web page can provide a malformed COLRv1 font and trigger a content-process out-of-bounds read on Windows x86 Firefox during normal text rendering. The report does not claim code execution or an out-of-bounds write.

Suggested Fix

Use checked arithmetic for all ItemVariationData extent calculations in both OTS and Gecko's COLRv1 validation. Reject any table whose logical delta-set array does not fit inside the COLR table before any pointer addition. The same checked extent should be used by ApplyVariation() before computing deltaSetSize * innerIndex.

Flags: sec-bounty?
Group: firefox-core-security → gfx-core-security
Component: Security → Graphics
Product: Firefox → Core

Jonathan, could you have a look?

Flags: needinfo?(jfkthame)
Attached file (secure) —
Assignee: nobody → jfkthame
Status: UNCONFIRMED → ASSIGNED
Ever confirmed: true
Attached file (secure) —

I don't have a 32-bit build locally at the moment, but AFAICS the above patches should avoid the problem, rejecting the malformed font during OTS validation, and also detecting the issue during Gecko's COLRFonts validation (in case such a font were to be installed locally, bypassing OTS).

Flags: needinfo?(jfkthame)
Attached file (secure) —

The rating assigned by our bug rating tool (currently under development) is:

Rating: sec-high

Explanation: Valid, confirmed by assignee (patches attached). COLRFonts.cpp ApplyVariation (lines 405-407) computes deltaData = deltaSets + deltaSetSize*innerIndex using unchecked, attacker-controlled font values, then dereferences it (lines 453-455) with no verification that the delta-set range fits inside the COLR table. OTS validation fails to reject the malformed ItemVariationData on 32-bit builds due to extent overflow. Reachable via normal web browsing: any page can load the font via @font-face and render text (crash stack shows the standard nsTextFrame::PaintText -> RenderColorGlyph -> ApplyVariation path). This is a web-reachable memory-safety out-of-bounds read in a content process; attacker controls both stride and inner index, so the read can target adjacent heap memory (plausible info disclosure) as well as crash. Per rules, x86-only manifestation is not a mitigating factor (platforms treated equally). Rated sec-high as a memory-safety issue triggered by normal browsing.

Keywords: sec-high
Pushed by jkew@mozilla.com: https://github.com/mozilla-firefox/firefox/commit/21544d2260eb https://hg.mozilla.org/integration/autoland/rev/9c69ea2ecce4 Check size_t range in ParseVariationDataSubtable. r=gfx-reviewers,lsalzman https://github.com/mozilla-firefox/firefox/commit/cec35ed3931a https://hg.mozilla.org/integration/autoland/rev/968476513d38 Check offset computations in ItemVariationData::Validate. r=gfx-reviewers,lsalzman https://github.com/mozilla-firefox/firefox/commit/5ac3207a2cc1 https://hg.mozilla.org/integration/autoland/rev/03e6c8e786cd Also range-check the deltaData during ApplyVariation(). r=gfx-reviewers,lsalzman
Pushed by abutkovits@mozilla.com: https://github.com/mozilla-firefox/firefox/commit/dd2738ac8745 https://hg.mozilla.org/integration/autoland/rev/0a9594251be0 Revert "Bug 2053326 - Also range-check the deltaData during ApplyVariation(). r=gfx-reviewers,lsalzman" for causing failures at 1938548.html.
[task 2026-07-09T10:45:16.621+00:00] 10:45:16     INFO - REFTEST TEST-START | gfx/tests/crashtests/1938548.html
[task 2026-07-09T10:45:16.622+00:00] 10:45:16     INFO - REFTEST TEST-LOAD | file:///builds/worker/workspace/build/tests/reftest/tests/gfx/tests/crashtests/1938548.html | 872 / 4213 (20%)
[task 2026-07-09T10:45:16.648+00:00] 10:45:16     INFO - ../../../../../checkouts/gecko/gfx/ots/src/variations.cc:99:57: runtime error: division by zero
[task 2026-07-09T10:45:17.386+00:00] 10:45:17     INFO -     #0 0x7b41cc0fd7e9 in ParseVariationDataSubtable /builds/worker/workspace/obj-build/gfx/ots/src/./../../../../../checkouts/gecko/gfx/ots/src/variations.cc:99:57
[task 2026-07-09T10:45:17.386+00:00] 10:45:17     INFO -     #1 0x7b41cc0fd7e9 in ots::ParseItemVariationStore(ots::Font const*, unsigned char const*, unsigned long, std::vector<unsigned short, std::allocator<unsigned short>>*) /builds/worker/workspace/obj-build/gfx/ots/src/./../../../../../checkouts/gecko/gfx/ots/src/variations.cc:155:10
[task 2026-07-09T10:45:17.387+00:00] 10:45:17     INFO -     #2 0x7b41cc05a31e in ParseVariationStore /builds/worker/workspace/obj-build/gfx/ots/src/./../../../../../checkouts/gecko/gfx/ots/src/cff.cc:606:8
[task 2026-07-09T10:45:17.388+00:00] 10:45:17     INFO -     #3 0x7b41cc05a31e in (anonymous namespace)::ParseDictData(ots::Buffer&, ots::Buffer&, unsigned short, unsigned long, (anonymous namespace)::DICT_DATA_TYPE, ots::OpenTypeCFF*) /builds/worker/workspace/obj-build/gfx/ots/src/./../../../../../checkouts/gecko/gfx/ots/src/cff.cc:676:14
[task 2026-07-09T10:45:17.388+00:00] 10:45:17     INFO -     #4 0x7b41cc059c99 in ots::OpenTypeCFF2::Parse(unsigned char const*, unsigned long) /builds/worker/workspace/obj-build/gfx/ots/src/./../../../../../checkouts/gecko/gfx/ots/src/cff.cc:1360:8
[task 2026-07-09T10:45:17.389+00:00] 10:45:17     INFO -     #5 0x7b41cc0e02cf in ots::Font::ParseTable(ots::TableEntry const&, unsigned char const*, ots::Arena&) /builds/worker/workspace/obj-build/gfx/ots/src/./../../../../../checkouts/gecko/gfx/ots/src/ots.cc:1018:20
[task 2026-07-09T10:45:17.390+00:00] 10:45:17     INFO -     #6 0x7b41cc10a256 in (anonymous namespace)::ProcessGeneric(ots::FontFile*, ots::Font*, unsigned int, ots::OTSStream*, unsigned char const*, unsigned long, std::vector<ots::TableEntry, std::allocator<ots::TableEntry>> const&, ots::Buffer&) /builds/worker/workspace/obj-build/gfx/ots/src/./../../../../../checkouts/gecko/gfx/ots/src/ots.cc:698:18
[task 2026-07-09T10:45:17.390+00:00] 10:45:17     INFO -     #7 0x7b41cc0e5ebb in (anonymous namespace)::ProcessTTF(ots::FontFile*, ots::Font*, ots::OTSStream*, unsigned char const*, unsigned long, unsigned int) /builds/worker/workspace/obj-build/gfx/ots/src/./../../../../../checkouts/gecko/gfx/ots/src/ots.cc:282:10
[task 2026-07-09T10:45:17.391+00:00] 10:45:17     INFO -     #8 0x7b41cc0e36a9 in ots::OTSContext::Process(ots::OTSStream*, unsigned char const*, unsigned long, unsigned int) /builds/worker/workspace/obj-build/gfx/ots/src/./../../../../../checkouts/gecko/gfx/ots/src/ots.cc:1176:14
[task 2026-07-09T10:45:17.392+00:00] 10:45:17     INFO -     #9 0x7b41cc427cfe in Process /builds/worker/workspace/obj-build/gfx/thebes/./../../../../checkouts/gecko/gfx/thebes/gfxUserFontSet.cpp:174:32
[task 2026-07-09T10:45:17.392+00:00] 10:45:17     INFO -     #10 0x7b41cc427cfe in gfxUserFontEntry::SanitizeOpenTypeData(unsigned char const*, unsigned int, unsigned int&, gfxUserFontType&, nsTArray<gfxUserFontEntry::OTSMessage>&) /builds/worker/workspace/obj-build/gfx/thebes/./../../../../checkouts/gecko/gfx/thebes/gfxUserFontSet.cpp:216:19
[task 2026-07-09T10:45:17.393+00:00] 10:45:17     INFO -     #11 0x7b41cc42e734 in gfxUserFontEntry::StartPlatformFontLoadOnBackgroundThread(unsigned int, unsigned char const*, unsigned int, nsMainThreadPtrHandle<nsIFontLoadCompleteCallback>) /builds/worker/workspace/obj-build/gfx/thebes/./../../../../checkouts/gecko/gfx/thebes/gfxUserFontSet.cpp:697:7
[task 2026-07-09T10:45:17.394+00:00] 10:45:17     INFO -     #12 0x7b41cc4549fc in operator()<StoreCopyPassByConstLRef<unsigned int> &, StoreConstPtrPassByConstPtr<unsigned char> &, StoreCopyPassByConstLRef<unsigned int> &, StoreCopyPassByConstLRef<nsMainThreadPtrHandle<nsIFontLoadCompleteCallback> > &> /builds/worker/workspace/obj-build/dist/include/nsThreadUtils.h:1076:18
[task 2026-07-09T10:45:17.395+00:00] 10:45:17     INFO -     #13 0x7b41cc4549fc in __invoke_impl<void, (lambda at /builds/worker/workspace/obj-build/dist/include/nsThreadUtils.h:1075:9), StoreCopyPassByConstLRef<unsigned int> &, StoreConstPtrPassByConstPtr<unsigned char> &, StoreCopyPassByConstLRef<unsigned int> &, StoreCopyPassByConstLRef<nsMainThreadPtrHandle<nsIFontLoadCompleteCallback> > &> /builds/worker/fetches/sysroot-x86_64-linux-gnu/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/invoke.h:60:14
[task 2026-07-09T10:45:17.396+00:00] 10:45:17     INFO -     #14 0x7b41cc4549fc in __invoke<(lambda at /builds/worker/workspace/obj-build/dist/include/nsThreadUtils.h:1075:9), StoreCopyPassByConstLRef<unsigned int> &, StoreConstPtrPassByConstPtr<unsigned char> &, StoreCopyPassByConstLRef<unsigned int> &, StoreCopyPassByConstLRef<nsMainThreadPtrHandle<nsIFontLoadCompleteCallback> > &> /builds/worker/fetches/sysroot-x86_64-linux-gnu/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/invoke.h:95:14
[task 2026-07-09T10:45:17.397+00:00] 10:45:17     INFO -     #15 0x7b41cc4549fc in __apply_impl<(lambda at /builds/worker/workspace/obj-build/dist/include/nsThreadUtils.h:1075:9), std::tuple<StoreCopyPassByConstLRef<unsigned int>, StoreConstPtrPassByConstPtr<unsigned char>, StoreCopyPassByConstLRef<unsigned int>, StoreCopyPassByConstLRef<nsMainThreadPtrHandle<nsIFontLoadCompleteCallback> > > &, 0UL, 1UL, 2UL, 3UL> /builds/worker/fetches/sysroot-x86_64-linux-gnu/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/tuple:1740:14
[task 2026-07-09T10:45:17.398+00:00] 10:45:17     INFO -     #16 0x7b41cc4549fc in apply<(lambda at /builds/worker/workspace/obj-build/dist/include/nsThreadUtils.h:1075:9), std::tuple<StoreCopyPassByConstLRef<unsigned int>, StoreConstPtrPassByConstPtr<unsigned char>, StoreCopyPassByConstLRef<unsigned int>, StoreCopyPassByConstLRef<nsMainThreadPtrHandle<nsIFontLoadCompleteCallback> > > &> /builds/worker/fetches/sysroot-x86_64-linux-gnu/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/tuple:1751:14
[task 2026-07-09T10:45:17.399+00:00] 10:45:17     INFO -     #17 0x7b41cc4549fc in apply<gfxUserFontEntry, void (gfxUserFontEntry::*)(unsigned int, const unsigned char *, unsigned int, nsMainThreadPtrHandle<nsIFontLoadCompleteCallback>)> /builds/worker/workspace/obj-build/dist/include/nsThreadUtils.h:1074:12
[task 2026-07-09T10:45:17.399+00:00] 10:45:17     INFO -     #18 0x7b41cc4549fc in mozilla::detail::RunnableMethodImpl<gfxUserFontEntry*, void (gfxUserFontEntry::*)(unsigned int, unsigned char const*, unsigned int, nsMainThreadPtrHandle<nsIFontLoadCompleteCallback>), true, (mozilla::RunnableKind)0, unsigned int, unsigned char const*, unsigned int, nsMainThreadPtrHandle<nsIFontLoadCompleteCallback>>::Run() /builds/worker/workspace/obj-build/dist/include/nsThreadUtils.h:1125:13
[task 2026-07-09T10:45:17.400+00:00] 10:45:17     INFO -     #19 0x7b41ca64f4e7 in nsThreadPool::Run() /builds/worker/workspace/obj-build/xpcom/threads/./../../../../checkouts/gecko/xpcom/threads/nsThreadPool.cpp:442:14
[task 2026-07-09T10:45:17.400+00:00] 10:45:17     INFO -     #20 0x7b41ca64145a in nsThread::ProcessNextEvent(bool, bool*) /builds/worker/workspace/obj-build/xpcom/threads/./../../../../checkouts/gecko/xpcom/threads/nsThread.cpp:1173:16
[task 2026-07-09T10:45:17.401+00:00] 10:45:17     INFO -     #21 0x7b41ca64b6a9 in NS_ProcessNextEvent(nsIThread*, bool) /builds/worker/workspace/obj-build/xpcom/threads/./../../../../checkouts/gecko/xpcom/threads/nsThreadUtils.cpp:472:10
[task 2026-07-09T10:45:17.401+00:00] 10:45:17     INFO -     #22 0x7b41ca850829 in mozilla::ipc::MessagePumpForNonMainThreads::Run(base::MessagePump::Delegate*) /builds/worker/workspace/obj-build/ipc/glue/./../../../../checkouts/gecko/ipc/glue/MessagePump.cpp:297:20
[task 2026-07-09T10:45:17.402+00:00] 10:45:17     INFO -     #23 0x7b41ca7532d4 in RunInternal /builds/worker/workspace/obj-build/ipc/chromium/./../../../../checkouts/gecko/ipc/chromium/src/base/message_loop.cc:371:10
[task 2026-07-09T10:45:17.402+00:00] 10:45:17     INFO -     #24 0x7b41ca7532d4 in RunHandler /builds/worker/workspace/obj-build/ipc/chromium/./../../../../checkouts/gecko/ipc/chromium/src/base/message_loop.cc:364:3
[task 2026-07-09T10:45:17.403+00:00] 10:45:17     INFO -     #25 0x7b41ca7532d4 in MessageLoop::Run() /builds/worker/workspace/obj-build/ipc/chromium/./../../../../checkouts/gecko/ipc/chromium/src/base/message_loop.cc:346:3
[task 2026-07-09T10:45:17.403+00:00] 10:45:17     INFO -     #26 0x7b41ca639a2e in nsThread::ThreadFunc(void*) /builds/worker/workspace/obj-build/xpcom/threads/./../../../../checkouts/gecko/xpcom/threads/nsThread.cpp:374:10
[task 2026-07-09T10:45:17.404+00:00] 10:45:17     INFO -     #27 0x7f41e67ababf in _pt_root /builds/worker/workspace/obj-build/config/external/nspr/pr/./../../../../../../checkouts/gecko/nsprpub/pr/src/pthreads/ptthread.c:190:3
[task 2026-07-09T10:45:17.404+00:00] 10:45:17     INFO -     #28 0x55f8b552cca6 in asan_thread_start(void*) /builds/worker/fetches/llvm-project/compiler-rt/lib/asan/asan_interceptors.cpp:239:28
[task 2026-07-09T10:45:17.404+00:00] 10:45:17     INFO -     #29 0x7f41e6d3aaa3 in start_thread nptl/pthread_create.c:447:8
[task 2026-07-09T10:45:17.405+00:00] 10:45:17     INFO -     #30 0x7f41e6dc7a33 in clone misc/../sysdeps/unix/sysv/linux/x86_64/clone.S:100
[task 2026-07-09T10:45:17.405+00:00] 10:45:17     INFO - SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior ../../../../../checkouts/gecko/gfx/ots/src/variations.cc:99:57
[task 2026-07-09T10:45:17.454+00:00] 10:45:17    ERROR - A content process crashed and MOZ_CRASHREPORTER_SHUTDOWN is set, shutting down
[task 2026-07-09T10:45:17.820+00:00] 10:45:17     INFO - 1783593917819	Marionette	TRACE	Received observer notification quit-application
[task 2026-07-09T10:45:17.820+00:00] 10:45:17     INFO - 1783593917819	Marionette	TRACE	Application is shutting down with reason: "shutdown"
[task 2026-07-09T10:45:17.821+00:00] 10:45:17     INFO - 1783593917819	Marionette	INFO	Stopped listening on port 2828
[task 2026-07-09T10:45:18.054+00:00] 10:45:18     INFO - 1783593918053	Marionette	DEBUG	Marionette stopped listening
[task 2026-07-09T10:45:18.097+00:00] 10:45:18     INFO - [Parent 1448, IPC I/O Parent] WARNING: process 2890 exited with status 1: file checkouts/gecko/ipc/chromium/src/chrome/common/process_watcher_posix_sigchld.cc:155
[task 2026-07-09T10:45:18.113+00:00] 10:45:18     INFO - !!! error running onStopped callback: TypeError: callback is not a function
[task 2026-07-09T10:45:18.706+00:00] 10:45:18     INFO - 1783593918705	Marionette	TRACE	Received observer notification xpcom-shutdown
[task 2026-07-09T10:45:18.775+00:00] 10:45:18     INFO - 1783593918774	Marionette	TRACE	Received observer notification xpcom-shutdown-threads
[task 2026-07-09T10:45:19.247+00:00] 10:45:19     INFO - REFTEST TEST-UNEXPECTED-FAIL | gfx/tests/crashtests/1938548.html | application terminated with exit code 245
[task 2026-07-09T10:45:19.264+00:00] 10:45:19     INFO - REFTEST INFO | Process mode: e10s
Flags: needinfo?(jfkthame)
Pushed by jkew@mozilla.com: https://github.com/mozilla-firefox/firefox/commit/dfaf35cf8ae4 https://hg.mozilla.org/integration/autoland/rev/7f0d02280ff1 Check size_t range in ParseVariationDataSubtable. r=gfx-reviewers,lsalzman https://github.com/mozilla-firefox/firefox/commit/1dcebf749298 https://hg.mozilla.org/integration/autoland/rev/8dc76e537f50 Check offset computations in ItemVariationData::Validate. r=gfx-reviewers,lsalzman https://github.com/mozilla-firefox/firefox/commit/89d7f796ec29 https://hg.mozilla.org/integration/autoland/rev/baa382c50b37 Also range-check the deltaData during ApplyVariation(). r=gfx-reviewers,lsalzman
Group: gfx-core-security → core-security-release
Status: ASSIGNED → RESOLVED
Closed: 3 months ago
Resolution: --- → FIXED
Target Milestone: --- → 154 Branch
Attached file (secure) —
Attachment #9606621 - Flags: approval-mozilla-beta?
Attached file (secure) —
Attachment #9606622 - Flags: approval-mozilla-beta?

firefox-beta Uplift Approval Request

  • User impact if declined/Reason for urgency: Out-of-bounds read leading to content-process crash or potential information leakage on Windows x86. (Probably also on other 32-bit systems.)
  • Code covered by automated testing?: no
  • Fix verified in Nightly?: no
  • Needs manual QE testing?: no
  • Steps to reproduce for manual QE testing:
  • Risk associated with taking this patch: low
  • Explanation of risk level: Simple addition of missing overflow checks when size_t is 32-bit.
  • String changes made/needed?: none
  • Is Android affected?: yes
Attachment #9606623 - Flags: approval-mozilla-beta?
Attached file (secure) —

:jfkthame, ESr140 and ESR115 also seem affected, could you also add uplift requests?

Attachment #9606621 - Flags: approval-mozilla-beta? → approval-mozilla-beta+
Attachment #9606622 - Flags: approval-mozilla-beta? → approval-mozilla-beta+
Attachment #9606623 - Flags: approval-mozilla-beta? → approval-mozilla-beta+
Attached file (secure) —
Attachment #9608737 - Flags: approval-mozilla-esr140?
Attached file (secure) —
Attachment #9608738 - Flags: approval-mozilla-esr140?

firefox-esr140 Uplift Approval Request

  • User impact if declined/Reason for urgency: Out-of-bounds read leading to content-process crash or potential information leakage on Windows x86. (Probably also on other 32-bit systems.)
  • Code covered by automated testing?: no
  • Fix verified in Nightly?: no
  • Needs manual QE testing?: no
  • Steps to reproduce for manual QE testing:
  • Risk associated with taking this patch: low
  • Explanation of risk level: Simple addition of missing overflow checks when size_t is 32-bit.
  • String changes made/needed?: none
  • Is Android affected?: yes
Attachment #9608739 - Flags: approval-mozilla-esr140?
Attached file (secure) —
Attached file (secure) —
Attachment #9608740 - Flags: approval-mozilla-esr115?
Attached file (secure) —
Attachment #9608741 - Flags: approval-mozilla-esr115?

firefox-esr115 Uplift Approval Request

  • User impact if declined/Reason for urgency: Out-of-bounds read leading to content-process crash or potential information leakage on Windows x86. (Probably also on other 32-bit systems.)
  • Code covered by automated testing?: no
  • Fix verified in Nightly?: no
  • Needs manual QE testing?: no
  • Steps to reproduce for manual QE testing:
  • Risk associated with taking this patch: low
  • Explanation of risk level: Simple addition of missing overflow checks when size_t is 32-bit.
  • String changes made/needed?: none
  • Is Android affected?: yes
Attachment #9608742 - Flags: approval-mozilla-esr115?
Attached file (secure) —
Attachment #9608742 - Flags: approval-mozilla-esr115? → approval-mozilla-esr115+
Attachment #9608741 - Flags: approval-mozilla-esr115? → approval-mozilla-esr115+
Attachment #9608740 - Flags: approval-mozilla-esr115? → approval-mozilla-esr115+
Attachment #9608739 - Flags: approval-mozilla-esr140? → approval-mozilla-esr140+
Attachment #9608738 - Flags: approval-mozilla-esr140? → approval-mozilla-esr140+
Attachment #9608737 - Flags: approval-mozilla-esr140? → approval-mozilla-esr140+
QA Whiteboard: [sec] [qa-triage-done-c154/b153]
Keywords: csectype-bounds
Whiteboard: [client-bounty-form] → [client-bounty-form][adv-main153+][adv-ESR140.13+][adv-ESR115.38+]
Alias: CVE-2026-16357
Flags: sec-bounty? → sec-bounty+
Keywords: sec-high → sec-moderate
Group: core-security-release
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: