
استغلال إثبات المفهوم لثغرة CVE-2023-1999 التي تستهدف مكتبة WebP codec على نظام Android 10 (r33). يُظهر ثغرة تجاوز سعة المخزن المؤقت في الكومة (heap buffer overflow) في مكتبة libwebp، مما يتيح تنفيذ تعليمات برمجية عن بُعد عبر صورة WebP مُصنّعة.
/ \\/ \/ _ \/ _ )/ _ \
\ / __/ _ \ __/
\__\__/\____/\_____/__/ ____ ___
/ _/ / \ \ / _ \/ _/
/ \_/ / / \ \ __/ \__
\____/____/\_____/_____/____/v1.0.2
برنامج ترميز WebP: مكتبة لتشفير وفك تشفير الصور بتنسيق WebP. تحتوي هذه الحزمة على المكتبة التي يمكن استخدامها في برامج أخرى لإضافة دعم WebP، بالإضافة إلى أدوات سطر الأوامر 'cwebp' و 'dwebp'.
انظر http://developers.google.com/speed/webp
شجرة المصدر الأحدث متوفرة على https://chromium.googlesource.com/webm/libwebp
تم إصدارها بموجب نفس ترخيص مشروع WebM. انظر http://www.webmproject.org/license/software/ أو ملف "COPYING" للحصول على التفاصيل. يمكن العثور على منحة إضافية لحقوق الملكية الفكرية في ملف PATENTS.
عن طريق تشغيل:
nmake /f Makefile.vc CFG=release-static RTLIBCFG=static OBJDIR=output
سيحتوي الدليل output\release-static(x64|x86)\bin على الأدوات cwebp.exe و dwebp.exe. سيحتوي الدليل output\release-static(x64|x86)\lib على مكتبة libwebp الثابتة. يتم اكتشاف البنية المستهدفة (x86/x64) بواسطة Makefile.vc من مترجم Visual Studio (cl.exe) المتاح في مسار النظام.
على الأنظمة الأساسية المثبت عليها أدوات GNU (gcc و make)، يؤدي تشغيل
make -f makefile.unix
إلى بناء الثنائيات examples/cwebp و examples/dwebp، بالإضافة إلى المكتبة الثابتة src/libwebp.a. لا يتم توفير تثبيت على مستوى النظام، حيث أن هذا بديل بسيط لنظام التثبيت الكامل القائم على أدوات autoconf (انظر أدناه). يرجى الرجوع إلى makefile.unix للحصول على تفاصيل إضافية وتخصيصات.
المتطلبات الأساسية: مترجم (مثل gcc)، make، autoconf، automake، libtool. على نظام يشبه Debian، يجب أن يقوم ما يلي بتثبيت كل ما تحتاجه لبناء أساسي: $ sudo apt-get install gcc make autoconf automake libtool
عند البناء من مصادر git، ستحتاج إلى تشغيل autogen.sh لإنشاء نص التهيئة.
./configure make make install
يجب أن يكون كل ما تحتاجه للحصول على الملفات التالية
/usr/local/include/webp/decode.h /usr/local/include/webp/encode.h /usr/local/include/webp/types.h /usr/local/lib/libwebp.* /usr/local/bin/cwebp /usr/local/bin/dwebp
مثبتة.
ملاحظة: مكتبة فك التشفير فقط، libwebpdecoder، متوفرة باستخدام العلم '--enable-libwebpdecoder'. يتم بناء مكتبة التشفير بشكل منفصل ويمكن تثبيتها بشكل مستقل باستخدام تعديل بسيط في ملفات Makefile.am configure المقابلة (انظر التعليقات هناك). انظر './configure --help' لمزيد من الخيارات.
يمكن العثور على إصدارات مستقرة من سلسلة أدوات MIPS Linux على: https://community.imgtec.com/developers/mips/tools/codescape-mips-sdk/available-releases/
export PATH=$PATH:/path/to/toolchain/bin
HOST=mips-mti-linux-gnu
MIPS_CFLAGS="-O3 -mips32r5 -mabi=32 -mtune=p5600 -mmsa -mfp64
-msched-weight -mload-store-pairs -fPIE"
MIPS_LDFLAGS="-mips32r5 -mabi=32 -mmsa -mfp64 -pie"
HOST=mips-img-linux-gnu
MIPS_CFLAGS="-O3 -mips64r6 -mabi=64 -mtune=i6400 -mmsa -mfp64
-msched-weight -mload-store-pairs -fPIE"
MIPS_LDFLAGS="-mips64r6 -mabi=64 -mmsa -mfp64 -pie"
./configure --host=${HOST} --build=config.guess
CC="${HOST}-gcc -EL"
CFLAGS="$MIPS_CFLAGS"
LDFLAGS="$MIPS_LDFLAGS"
make
make install
باستخدام CMake، يمكنك تجميع libwebp، cwebp، dwebp، gif2web، img2webp، webpinfo وارتباطات JS.
المتطلبات الأساسية: مترجم (مثل gcc مع autotools) و CMake. على نظام يشبه Debian، يجب أن يقوم ما يلي بتثبيت كل ما تحتاجه لبناء أساسي: $ sudo apt-get install build-essential cmake
عند البناء من مصادر git، ستحتاج إلى تشغيل cmake لإنشاء ملفات make.
mkdir build && cd build && cmake ../ make make install
إذا كنت تريد أيضًا أيًا من البرامج القابلة للتنفيذ، فستحتاج إلى تمكينها من خلال CMake، على سبيل المثال:
cmake -DWEBP_BUILD_CWEBP=ON -DWEBP_BUILD_DWEBP=ON ../
أو من خلال واجهتك المفضلة (مثل ccmake أو cmake-qt-gui).
استخدم الخيار -DWEBP_UNICODE=ON لدعم Unicode على Windows (مع chcp 65001).
أخيرًا، بمجرد التثبيت، يمكنك أيضًا استخدام WebP في مشروع CMake الخاص بك عن طريق:
find_package(WebP)
والذي سيحدد متغيرات CMake WebP_INCLUDE_DIRS و WebP_LIBRARIES.
دعم Gradle ضئيل: يساعدك فقط في تجميع libwebp و cwebp و dwebp و webpmux_example.
المتطلبات الأساسية: مترجم (مثل gcc مع autotools) و gradle. على نظام يشبه Debian، يجب أن يقوم ما يلي بتثبيت كل ما تحتاجه لبناء أساسي: $ sudo apt-get install build-essential gradle
عند البناء من مصادر git، ستحتاج إلى تشغيل Gradle wrapper مع الهدف المناسب، على سبيل المثال:
./gradlew buildAllExecutables
لتوليد ارتباطات اللغة من swig/libwebp.swig، يلزم على الأقل swig-1.3 (http://www.swig.org).
حاليًا، يتم تعيين الوظائف التالية: فك التشفير: WebPGetDecoderVersion WebPGetInfo WebPDecodeRGBA WebPDecodeARGB WebPDecodeBGRA WebPDecodeBGR WebPDecodeRGB
التشفير: WebPGetEncoderVersion WebPEncodeRGBA WebPEncodeBGRA WebPEncodeRGB WebPEncodeBGR WebPEncodeLosslessRGBA WebPEncodeLosslessBGRA WebPEncodeLosslessRGB WebPEncodeLosslessBGR
انظر swig/README للحصول على تعليمات بناء أكثر تفصيلاً.
ارتباطات Java:
لبناء كود غلاف JNI الذي تم إنشاؤه بواسطة swig، يلزم على الأقل JDK-1.5 (أو ما يعادله) لدعم التعداد. الإخراج المقصود هو كائن مشترك / DLL يمكن تحميله عبر System.loadLibrary("webp_jni").
ارتباطات Python:
لبناء كود إضافة Python الذي تم إنشاؤه بواسطة swig، يلزم على الأقل Python 2.6. قد يعمل Python < 2.6 مع بعض التغييرات الطفيفة في libwebp.swig أو الكود المُنشأ، لكنه غير مختبر.
يحتوي دليل examples/ على أدوات للتشفير (cwebp) وفك التشفير (dwebp) للصور.
يجب أن يكون الاستخدام الأسهل على النحو التالي: cwebp input.png -q 80 -o output.webp والذي سيحول ملف الإدخال إلى ملف WebP باستخدام عامل جودة 80 على مقياس 0->100 (0 أدنى جودة، 100 الأفضل. القيمة الافتراضية هي 75). قد ترغب أيضًا في تجربة العلم -lossless، والذي سيضغط المصدر (بتنسيق RGBA) دون أي خسارة. ستتحكم معلمة الجودة -q في هذه الحالة في مقدار وقت المعالجة الذي يتم إنفاقه في محاولة جعل ملف الإخراج صغيرًا قدر الإمكان.
قائمة أطول من الخيارات متاحة باستخدام علم سطر الأوامر -longhelp:
cwebp -longhelp الاستخدام: cwebp [-preset <...>] [options] in_file [-o out_file]
إذا لم يتم تحديد حجم الإدخال (-s) لصورة، فمن المفترض أن يكون ملف PNG أو JPEG أو TIFF أو WebP.
الخيارات: -h / -help ............. مساعدة قصيرة -H / -longhelp ......... مساعدة طويلة -q ............. عامل الجودة (0:صغير..100:كبير)، الافتراضي=75 -alpha_q ......... جودة ضغط الشفافية (0..100)، الافتراضي=100 -preset ........... إعداد مسبق، واحد من: default, photo, picture, drawing, icon, text -preset يجب أن يأتي أولاً، لأنه يلغي المعلمات الأخرى -z ............... ينشط الإعداد المسبق بدون فقدان مع مستوى معين في [0:سريع, ..., 9:أبطأ]
-m ............... طريقة الضغط (0=سريع، 6=أبطأ)، الافتراضي=4 -segments ........ عدد الشرائح المراد استخدامها (1..4)، الافتراضي=4 -size ............ الحجم المستهدف (بالبايت) -psnr .......... PSNR المستهدف (بالديسيبل. عادةً: 42)