
Proof-of-Concept-Exploit für CVE-2020-1349, ein Zero-Click Heap-Überlauf im MIME-Parsing von Outlook 2019, der EIP-Kontrolle durch Heap-Spray und Feng Shui auf Koreanisch Windows 10 x64 erreicht.
Diese Schwachstelle tritt in Outlook 2019 (16.0.12624.20424) auf, installiert auf Koreanisch Windows 10 1909 x64, codepage 949.

Ich war nicht in der Lage, ASLR mit dieser Schwachstelle zu umgehen, aber ich habe einen Outlook 2019 32-Bit-Exploit geschrieben, der einen Taschenrechner öffnet, indem er die Adresse einer Systembibliothek verwendet, die beim Booten festgelegt ist. Und diese Schwachstelle ist eine Zero-Click-Schwachstelle. Wenn das Konto eines anderen Mail-Dienstes als des „outlook.com“-Kontos mit Outlook 2019 über IMAP verknüpft ist, wird sie allein durch den Empfang von E-Mails ausgelöst.
v26 = IsDBCSLeadByte(*v13);
v12 = 0;
if ( v26 )
{
LODWORD(v5) = v5 - 1;
*v11++ = *v13++;
--v8;
}
LODWORD(v5) = v5 - 1;
*v11++ = *v13++;
--v8;
goto LABEL_51;
[OUTLMIME!CloseAllSockets+0x50804 Pseudo code]
Der Absturz tritt auf, und der Teil, in dem die Schwachstelle existiert, ist wie oben dargestellt. Wenn die Zeichenfolge des geparsten To-Headers oder From-Headers Multibyte ist, wird die Variable, die die verbleibenden zu parsenden Zeichenfolgen zählt, um 2 verringert, und es kommt zu einem Integer-Underflow, wenn die Variable 1 ist und um 2 verringert wird.
if ( v23 != '=' )
{
if ( v23 == 34 )
v15 = 6;
goto LABEL_48;
}
v15 = 1;
}
if ( v15 )
goto LABEL_40;
[OUTLMIME!CloseAllSockets+0x50804 Pseudo code]
LABEL_40:
v24 = v13[v14];
if ( v24 )
{
if ( v5 == v14 )
goto LABEL_52;
if ( v8 != v14 )
{
v25 = IsDBCSLeadByte(v24);
v12 = 0;
if ( v25 )
++v14;
++v14;
}
}
goto LABEL_51;
}
[OUTLMIME!CloseAllSockets+0x50804 Pseudo code]
LABEL_51:
if ( v5 <= v14 )
goto EXIT_0;
}
[OUTLMIME!CloseAllSockets+0x50804 Pseudo code]
if ( v15 )
{
if ( v15 == 1 )
{
v15 = 2;
v21 = v13[v14];
v22 = v14 + 1;
if ( v21 != '?' )
v22 = v14;
if ( v21 != '?' )
v15 = v12;
v14 = v22;
}
[OUTLMIME!CloseAllSockets+0x50804 Pseudo code]
else if ( v15 > 1 )
{
if ( v15 <= 3 )
{
v18 = v13[v14];
v19 = v14 + 1;
if ( v18 != '?' )
v19 = v14;
v14 = v19;
v20 = v15 + 1;
if ( v18 != '?' )
v20 = v15;
v15 = v20;
}
[OUTLMIME!CloseAllSockets+0x50804 Pseudo code]
if ( v15 == 4 )
{
if ( v13[v14] == '?' )
v15 = 5;
LABEL_40:
v24 = v13[v14];
if ( v24 )
{
if ( v5 == v14 )
goto LABEL_52;
if ( v8 != v14 )
{
v25 = IsDBCSLeadByte(v24);
v12 = 0;
if ( v25 )
++v14;
++v14;
}
}
goto LABEL_51;
}
[OUTLMIME!CloseAllSockets+0x50804 Pseudo code]
if ( v15 == 5 )
{
v16 = v14;
v17 = v14 + 1;
v30 = v13[v16];
if ( v30 == '=' )
{
*v11++ = 34;
--v8;
}
memcpy(v11, v13, v17);
v13 += v17;
v11 += v17;
LODWORD(v5) = v5 - v17;
v8 -= v17;
if ( v30 == '=' )
{
*v11++ = 34;
--v8;
}
v12 = 0;
v14 = 0;
v15 = 0;
goto LABEL_51;
}
[OUTLMIME!CloseAllSockets+0x50804 Pseudo code]
else
{
v23 = v13[v14];
if ( v23 != '=' )
{
if ( v23 == '"' )
v15 = 6;
goto LABEL_48;
}
v15 = 1;
}
if ( v15 )
goto LABEL_40;
[OUTLMIME!CloseAllSockets+0x50804 Pseudo code]
LABEL_48:
v26 = IsDBCSLeadByte(*v13);
v12 = 0;
if ( v26 )
{
LODWORD(v5) = v5 - 1;
*v11++ = *v13++;
--v8;
}
LODWORD(v5) = v5 - 1;
*v11++ = *v13++;
--v8;
goto LABEL_51;
[OUTLMIME!CloseAllSockets+0x50804 Pseudo code]
Als ich jedoch einen Heap-Overflow mit dem obigen Bug auslöste, konnte ich die Bedingung, die Schleife wieder zu verlassen, nicht erfüllen, sodass ich die partielle Überschreibung nicht so lange durchführen konnte, wie ich wollte. Also musste ich eine Eingabe finden, die eine bestimmte Bedingung erfüllt, um die Schleife zu verlassen. Aus dem gleichen Grund wie oben habe ich den umgebenden Code-Teil streng auditiert und statt den Eingabewert zu finden, der die Schleife verlassen kann, habe ich den Bug gefunden, der zu einer Endlosschleife führt, ohne dass der Index erhöht oder beim Verarbeiten einer speziellen Zeichenfolge geschrieben wird.

Nach der Durchführung von Heap-Spray und Heap Feng Shui gelang das EIP-Hijacking, indem die vftable des laufenden Objekts in einem anderen Thread überschrieben wurde, der nicht in einer Endlosschleife gefangen war, unter Verwendung des obigen Bugs.