
إثبات مفهوم لاستغلال CVE-2021-21017، وهو خلل في الخلط بين الأنواع في Adobe Reader يؤدي إلى قراءة خارج الحدود وتجاوز في سعة الكومة، مع تحليل تقني وإرشادات للكشف.
# IA32 plugin, 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;
}
.............................................................
.............................................................
}
عند بناء عنوان URL مطلق من عنوان نسبي إلى baseURL الخاص بمستند PDF لاستخدامه في واجهات برمجة التطبيقات مثل: app.launchURL أو document.submitForm أو app.media.createPlayer،
إذا كان baseURL يبدو كسلسلة UTF-16BE، فسيتم التعامل مع العنوان النسبي أيضاً كسلسلة UTF-16BE عند إجراء عملية الدمج، على الرغم من أنه في الواقع سلسلة ANSI.
قد يؤدي هذا إلى قراءة خارج الحدود (Out-of-bounds read) من ناحية. ومن ناحية أخرى، عند تخصيص ذاكرة لاستيعاب المخزن المؤقت الوجهة، يتم "قياس" العنوان النسبي كسلسلة ANSI. وهذا بالطبع غير كافٍ إذا حدثت قراءة خارج الحدود. (سلسلة + فاصل NULL يملأان كتلة heap كاملة).
ماذا يعني هذا؟
سيؤدي هذا في أغلب الأحيان إلى انهيار (crash) وأحياناً إلى الكتابة فوق byteLength لكائن ArrayBuffer بقيمة 0xFF.
إذا كانت لديك أسئلة، فلا تتردد في التواصل معي على تويتر: https://twitter.com/Zeusb0x
سيحتوي كتالوج مستند PDF على إدخال URI يحمل مرجعاً غير مباشر إلى كائن قاموس. وسيحتوي هذا بدوره على إدخال Base، وهو baseURL الفعلي. وسيكون موجوداً على الأرجح بترميز سداسي عشري وسيبدأ بالأحرف \xFE\xFF. (انظر PoC). لحسن الحظ، هذه هي الطريقة الوحيدة لتغيير baseURL الخاص بمستند في سياق عادي غير مميز. محاولة القيام بذلك من JavaScript ستؤدي إلى استثناء أمني.