Medium firefox UAF 🔧 Commit mapped

Overview

Medium
Severity
CVSS
No
Exploited ITW
Fixed
Fix Status
Impactmoderate
DescriptionSandbox escape due to use-after-free in the Disability Access APIs component
ComponentCore
Bug ClassUAF
Tracker2029511
Fix commit1937c1632d5d (firefox) +12/-5
CISA KEVNot listed
CreditedSteven Julian
Disclosed2026-05-19

Changed Functions

FunctionChangeNotes
AccessibleEnumerator
accessible/windows/msaa/MsaaAccessible.cpp
modified
for
accessible/windows/msaa/MsaaAccessible.cpp
modified
Clone
accessible/windows/msaa/MsaaAccessible.cpp
modified

Files Changed

  • accessible/windows/msaa/MsaaAccessible.cpp
diff --git a/accessible/windows/msaa/MsaaAccessible.cpp b/accessible/windows/msaa/MsaaAccessible.cpp
index e9025f46d8d..8fe30455891 100644
--- a/accessible/windows/msaa/MsaaAccessible.cpp
+++ b/accessible/windows/msaa/MsaaAccessible.cpp
@@ -917,7 +917,13 @@ MsaaAccessible::get_accFocus(
 class AccessibleEnumerator final : public IEnumVARIANT {
  public:
   explicit AccessibleEnumerator(const nsTArray<Accessible*>& aArray)
-      : mArray(aArray.Clone()), mCurIndex(0) {}
+      : mCurIndex(0) {
+    mArray.SetCapacity(aArray.Length());
+    for (Accessible* acc : aArray) {
+      mArray.AppendElement(MsaaAccessible::GetFrom(acc));
+    }
+  }
+
   AccessibleEnumerator(const AccessibleEnumerator& toCopy)
       : mArray(toCopy.mArray.Clone()), mCurIndex(toCopy.mCurIndex) {}
   ~AccessibleEnumerator() {}
@@ -936,7 +942,7 @@ class AccessibleEnumerator final : public IEnumVARIANT {
   STDMETHODIMP Clone(IEnumVARIANT FAR* FAR* ppenum);
 
  private:
-  nsTArray<Accessible*> mArray;
+  nsTArray<RefPtr<MsaaAccessible>> mArray;
   uint32_t mCurIndex;
 };
 
@@ -971,8 +977,9 @@ AccessibleEnumerator::Next(unsigned long celt, VARIANT FAR* rgvar,
 
   // Copy the elements of the array into rgvar.
   for (uint32_t i = 0; i < celt; ++i, ++mCurIndex) {
+    RefPtr<IDispatch> disp = mArray[mCurIndex];
     rgvar[i].vt = VT_DISPATCH;
-    rgvar[i].pdispVal = MsaaAccessible::NativeAccessible(mArray[mCurIndex]);
+    disp.forget(&rgvar[i].pdispVal);
   }
 
   if (pceltFetched) *pceltFetched = celt;
@@ -982,8 +989,8 @@ AccessibleEnumerator::Next(unsigned long celt, VARIANT FAR* rgvar,
 
 STDMETHODIMP
 AccessibleEnumerator::Clone(IEnumVARIANT FAR* FAR* ppenum) {
-  *ppenum = new AccessibleEnumerator(*this);
-  NS_ADDREF(*ppenum);
+  RefPtr newEnum = new AccessibleEnumerator(*this);
+  newEnum.forget(ppenum);
   return S_OK;
 }
 
Loading diff…