
تلف الكومة في منتقي الوسائط في واتساب
فساد الكومة (Heap corruption) في منتقي الوسائط في واتساب يؤثر على واتساب للأندرويد قبل الإصدار 2.19.291
يتم تقسيم ملف GIF إلى أجزاء، يتم تمييز كل جزء ببايت محدد:
وفقًا للكود المصدري، تستدعي renderFrame الدالة DDGifSlurp لتحليل ملف GIF، والدالة getBitmap لعرض ملف GIF. يتم تخصيص مخزن مؤقت rasterBits بواسطة الدالة، ويُحسب حجمه بضرب العرض في الارتفاع للصورة التي تتم معالجتها حاليًا. ربما لتوفير مساحة الذاكرة والوقت، سيتم استخدام نفس المخزن المؤقت rasterBits لجميع الإطارات/الصور في ملف GIF. لذلك، من المطلوب أن يكون المخزن قادرًا على احتواء أكبر صورة موصوفة في الملف. وعلى هذا النحو، يتم إعادة تخصيص المخزن وفقًا لذلك إذا كان قسم صورة آخر داخل نفس ملف GIF يصف صورة أكبر (تتطلب مساحة أكبر).
يقوم DDGifSlurp بتحليل ملف GIF في حلقة، معالجةً كل صورة/إطار في الملف، وينتهي عند مواجهة سجل الإنهاء. عندما يُرجع DGifGetImageDesc القيمة GIF_ERROR (a)، سيؤدي ذلك إلى إنهاء مبكر (في حالة switch)، مما يتسبب في تخطي الكود الذي يعيد تخصيص المخزن المؤقت rasterBits. فيما يلي مقتطف من DDGifSlurp:
void DDGifSlurp(GifInfo *info, bool decode, bool exitAfterFrame) {
...
do {
...
switch (RecordType) {
case IMAGE_DESC_RECORD_TYPE:
if (DGifGetImageDesc(gifFilePtr, isInitialPass) == GIF_ERROR) { <-- [a]
break;
}
...
if (decode) {
...
const uint_fast32_t newRasterSize = gifFilePtr->Image.Width * gifFilePtr->Image.Height;
if (newRasterSize > info->rasterSize || widthOverflow > 0 || heightOverflow > 0) {
void *tmpRasterBits = reallocarray(info->rasterBits, newRasterSize, sizeof(GifPixelType));
...
}
}while (RecordType != TERMINATE_RECORD_TYPE);
}
ستؤدي صورة GIF بالتنسيق التالي إلى حدوث انهيار: