Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2025-62821 — Microsoft HEIF Erweiterung (msheif_store.dll) OOB-read | Kitploit
Tools/GitHubGitHub/hyunjungg/cve-2025-62821
SpeicherforensikSchwachstellenanalyseExploitationReverse EngineeringFuzzingBinäranalyse
GitHubhyunjungg/cve-2025-62821

CVE-2025-62821

Microsoft HEIF Erweiterung (msheif_store.dll) OOB-read

Repository anzeigen
19vor 1 JahrNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Microsoft HEIF Image Extensions (msheif_store.dll): Unterallokation des Quellpuffers im CopyPixels-Pfad führt zu lesendem Speicherzugriff außerhalb der Grenzen und Zugriffsverletzung (DoS)

Beim Dekodieren eines manipulierten HEIF-Bildes über WIC allokiert der msheif-Codec einen 1-Byte-Quellpuffer, versucht aber später, eine sehr große Menge an Pixeldaten aus diesem Puffer während CopyPixels zu kopieren. Die Kopie verwendet memmove mit einer Größe, die aus stride × ROI‑Höhe abgeleitet wird, ohne die tatsächliche Länge des Quellpuffers zu validieren. Dies führt zu einem lesenden Speicherzugriff außerhalb der Grenzen und sofort zu einer Zugriffsverletzung (Absturz). In der Praxis verursacht das Öffnen oder die Vorschau des schädlichen HEIF eine Dienstverweigerung in jedem WIC‑Konsumenten, der über die HEIF‑Image‑Extensions läuft.

Hinweis zur Benennung: Variablennamen wie roi_height wurden aus dem Disassembling zur besseren Lesbarkeit abgeleitet und entsprechen nicht den Hersteller-Symbolnamen.

ProduktMicrosoft HEIF Image Extensions
Modulmsheif_store.dll
BetriebssystemWindows 11
Erweiterungsversion1.2.22.0 (Microsoft.HEIFImageExtension_1.2.22.0_x64__8wekyb3d8bbwe\x64\msheif_store.dll)
  1. Ursachenanalyse

    a. Detaillierte Beschreibung der Sicherheitslücke

    • Die Dekodierungspipeline berechnet eine große Kopierlänge für memmove basierend auf der Bildgeometrie (z. B. copy_size = stride * abs(roi_height)).
    • Der Quellpuffer, der die dekodierten Frame/Item‑Daten enthalten soll, wird auf 1 Byte unterallokiert, weil:
      • CHEIFStreamReader_ReadItemData ruft CHEIFItemInfoEntry_GetDataSize auf, um die Datenlänge des Items zu berechnen.
      • In einem bestimmten Fehlerzweig gibt CHEIFItemInfoEntry_GetDataSize zwar Erfolg zurück, lässt aber die berechnete Größe auf 0.
      • CHEIFStreamReader_ReadItemData ruft dann MFCreateMemoryBuffer(0, &ppBuffer) auf. Gemäß MF‑Verhalten erzeugt dies einen Puffer mit einer Mindestallokation von 1 Byte.
    • Nachgelagert validiert CopyPixels die Größe des Zielpuffers, aber nicht die Länge des Quellpuffers im Vergleich zur angeforderten Kopiergröße vor dem Aufruf von memmove.
    • Ergebnis: memmove(dst, src, large_size) liest weit über das 1‑Byte‑src hinaus und verursacht einen Fehler bei der vektorisierten Ladung.

    Dieser Fehler wird unabhängig davon verstärkt, wenn die Bild‑/ROI‑Breite falsch geparst wird (z. B. 0x01000100 = 16.777.472), was stride und die endgültige Kopiergröße aufbläht. Die Kernschwachstelle ist jedoch, dass die Quellpufferlänge nicht gegen die berechnete Kopierlänge geprüft wird.

(7de0.78e4): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
msheif_store!DllCanUnloadNow+0x228b1d:
00007ffd`841bc45d c5fe6f02        vmovdqu ymm0,ymmword ptr [rdx] ds:000002b0`65be6ff0=c0

0:000> !heap -p -a rdx
    address 000002b065be6ff0 found in
    _DPH_HEAP_ROOT @ 2b05bed1000
    in busy allocation (  DPH_HEAP_BLOCK:         UserAddr         UserSize -         VirtAddr         VirtSize)
                             2b062c2f2d8:      2b065be6ff0                1 -      2b065be6000             2000
    ...
    00007ffe75b90563 MFPlat!operator new+0x0000000000000023
    00007ffe75b83d36 MFPlat!MFCreateMemoryBuffer+0x0000000000000056
    00007ffd840157b1 msheif_store!DllCanUnloadNow+0x0000000000081e71
		...

0:000> r r8
r8=0000000001000100

b. Code-Ablauf vom Eingang

0:000> k
 # Child-SP          RetAddr               Call Site
00 0000005d`6a9aed98 00007ffe`6fdefcc2     msheif_store!DllCanUnloadNow+0x228b21
01 0000005d`6a9aeda0 00007ffe`6fcb3adc     msheif_store!DllCanUnloadNow+0x18c382
02 0000005d`6a9aee00 00007ffe`6fcb4513     msheif_store!DllCanUnloadNow+0x5019c
03 0000005d`6a9aeef0 00007ffe`6fcb96da     msheif_store!DllCanUnloadNow+0x50bd3
04 0000005d`6a9af0a0 00007fff`318551d5     msheif_store!DllCanUnloadNow+0x55d9a
05 0000005d`6a9af1a0 00007fff`318082eb     windowscodecs!CPyramidBase::CopyPixels+0xf5
06 0000005d`6a9af260 00007fff`31857e52     windowscodecs!CFormatConverter::CopyPixels+0x22b
07 0000005d`6a9af3e0 00007ff6`15fb0f5d     windowscodecs!CFormatConverterResolver::CopyPixels+0xc2
08 0000005d`6a9af480 00007ff6`15fb04ab     heif_decoder!HEIF_LoadBitmapFromMemory+0x34d [C:\\\\Users\\\\test\\\\source\\\\repos\\\\heif_decoder\\\\heif_decoder\\\\heif_decoder.cpp @ 256]
09 0000005d`6a9af670 00007ff6`15fb1754     heif_decoder!HEIF_FuzzMemory+0x9b [C:\\\\Users\\\\test\\\\source\\\\repos\\\\heif_decoder\\\\heif_decoder\\\\heif_decoder.cpp @ 357]
0a 0000005d`6a9af830 00007ff6`15fb3039     heif_decoder!wmain+0x394 [C:\\\\Users\\\\test\\\\source\\\\repos\\\\heif_decoder\\\\heif_decoder\\\\heif_decoder.cpp @ 524]
0b 0000005d`6a9afaa0 00007ff6`15fb2ee2     heif_decoder!invoke_main+0x39 [D:\\\\a\\\\_work\\\\1\\\\s\\\\src\\\\vctools\\\\crt\\\\vcstartup\\\\src\\\\startup\\\\exe_common.inl @ 91]
0c 0000005d`6a9afaf0 00007ff6`15fb2d9e     heif_decoder!__scrt_common_main_seh+0x132 [D:\\\\a\\\\_work\\\\1\\\\s\\\\src\\\\vctools\\\\crt\\\\vcstartup\\\\src\\\\startup\\\\exe_common.inl @ 288]
0d 0000005d`6a9afb60 00007ff6`15fb30ce     heif_decoder!__scrt_common_main+0xe [D:\\\\a\\\\_work\\\\1\\\\s\\\\src\\\\vctools\\\\crt\\\\vcstartup\\\\src\\\\startup\\\\exe_common.inl @ 331]
0e 0000005d`6a9afb90 00007fff`3847e8d7     heif_decoder!wmainCRTStartup+0xe [D:\\\\a\\\\_work\\\\1\\\\s\\\\src\\\\vctools\\\\crt\\\\vcstartup\\\\src\\\\startup\\\\exe_wmain.cpp @ 17]
0f 0000005d`6a9afbc0 00007fff`3939c34c     KERNEL32!BaseThreadInitThunk+0x17
10 0000005d`6a9afbf0 00000000`00000000     ntdll!RtlUserThreadStart+0x2c

Aufgelöste interne Aufrufe (zur Klarheit umbenannt):

CWICHeifDecoderFrame::CopyPixels
 → CWICHeifBitmapSourceBase::CopyPixels_Transform
   → CWICHeifBitmapSourceBase::CopyPixels_Base
     → sub_7FFD8411FC40  // führt memmove aus
       → memmove         // AV (vmovdqu-Ladung aus src)

c. Puffergröße

  • Manipuliertes HEIF, das CHEIFItemInfoEntry_GetDataSize dazu veranlasst, einen frühen „Erfolg mit Größe 0“-Pfad zu nehmen (z. B., wenn sub_7FFD8408B898 fehlschlägt und die Funktion mit sizeBuffer = 0 Erfolg zurückgibt).

  • Quellpuffer: Allokiert über MFCreateMemoryBuffer(0) ⇒ 1 Byte.

  • Kopiergröße: Abgeleitet als copy_size = stride * abs(roi_height). Bei falsch geparster Breite (z. B. 0x01000100) und typischem BPP ist stride enorm, was zu einer sehr großen copy_size führt.

  • Gefährdeter Aufruf:

    __int64 sub_7FFD8411FC40(__m128i* dst, __int64 a2, __m128i* src, int a4,
                             unsigned int stride, unsigned int abs_roi_height)
    {
      if (src && dst) {
        if (stride == a2 && stride == a4) {
          // Keine Validierung, dass 'src' mindestens (stride * abs_roi_height) Bytes enthält
          memmove(dst, src, (size_t)abs_roi_height * stride); // AV hier
        }
      }
    }
    
  • Warum der Quellpuffer 1 Byte groß ist (Allokationspfad):

    __int64 __fastcall CHEIFStreamReader_ReadItemData(__int64 *a1, __int64 *a2, IMFMediaBuffer **a3)
    {
      ppBuffer = 0i64;
      if ( v7(a2) )
      {
        *cbMaxLength = 0i64;
        result = (*(*a2 + 0xA0))(a2, cbMaxLength); // CHEIFItemInfoEntry_GetDataSize
        if ( result < 0 )
        {
          goto LABEL_10;
        }
        if ( *cbMaxLength > 0xC800000ui64 )
        {
          result = 0xC00D36BE;
          goto LABEL_23;
        }
        // cbMaxLength kann immer noch 0 sein, wenn GetDataSize früh erfolgreich zurückkehrte
        result = MFCreateMemoryBuffer(cbMaxLength[0], &ppBuffer);
        if ( result < 0 )
        {
          goto LABEL_34;
        }
        ...
    }
    
Tool herunterladen