
CVE-2021-21017の概念実証エクスプロイト。Adobe Readerの型混乱により、領域外読み取りとヒープオーバーフローを引き起こすもので、技術的分析と検出ガイダンスを含む。
# IA32プラグイン、ver. 2020.013.20074。
char * __cdecl FUN_2581894c(char *base_url,LPCSTR rel_url)
{
............................................................
............................................................
if ((base_url != (char *)0x0) && (rel_url != (LPCSTR)0x0)) {
if ((*base_url == -2) && (base_url[1] == -1)) {
iVar6 = bytes_len(base_url);
pcVar7 = base_url + iVar6;
pcVar8 = rel_url + 2;
do {
do {
cVar3 = *pcVar8;
pcVar1 = pcVar8 + 2;
*pcVar7 = cVar3;
pcVar2 = pcVar7 + 2;
cVar4 = pcVar8[1];
pcVar7[1] = cVar4;
pcVar7 = pcVar2;
pcVar8 = pcVar1;
} while (cVar3 != '\0');
} while (cVar4 != '\0');
}
else {
lstrcatA(base_url,rel_url);
}
return base_url;
}
.............................................................
.............................................................
}
PDFドキュメントのbaseURLを基準とした相対URLから絶対URLを構築し、app.launchURL、document.submitForm、app.media.createPlayerなどのAPIで使用する場合、
baseURLがUTF-16BE文字列のように見えると、連結の実行時に相対URLもUTF-16BE文字列として扱われますが、実際にはANSI文字列です。
これは、一方では範囲外読み取りアクセスを引き起こす可能性があります。もう一方では、宛先バッファを保持するためのメモリを割り当てる際、相対URLはANSI文字列として「測定」されます。もちろん、範囲外読み取りが発生した場合にはこれでは不十分です。(文字列とNULL終端文字がヒープチャンク全体を埋め尽くします)。
これは何を意味するのでしょうか?
これはほとんどの場合クラッシュを引き起こし、時にはArrayBufferのbyteLengthを0xFFに上書きします。
ご質問があれば、Twitterでお気軽にご連絡ください: https://twitter.com/Zeusb0x
PDFドキュメントカタログには、辞書オブジェクトへの間接参照を保持するURIエントリがあります。この辞書オブジェクトにはBaseエントリがあり、これが実際のbaseURLです。これはおそらく16進数表記で存在し、文字\xFE\xFFで始まります。(PoCを参照)。幸いなことに、通常の非特権コンテキストでドキュメントのbaseURLを変更する方法はこれだけです。JavaScriptから変更しようとすると、セキュリティ例外がスローされます。