
تعزيز الاختبارات الاندفاعية لـ tmux باستخدام OSS-Fuzz. يشمل أدوات اختبار مخصصة `cmd-fuzzer` و `argument-fuzzer` لتحسين تغطية الكود ونموذج إثبات المفهوم لثغرة `CVE-2020-27347`
أمن البرمجيات @ EPFL، ربيع 2025
في هذا المختبر، قمنا بتحسين جهود التعتيم لـ tmux كمضاعف الطرفية ضمن بنية OSS-Fuzz من Google. قمنا أولاً بتحديد خط الأساس عن طريق تقييم تغطية الأسطر للأداة الحالية input-fuzzer، مع وبدون مجموعة البذور المقدمة، مع ملاحظة تغطية أولية مماثلة. بعد ذلك، حددنا منطقتين للكود في tmux يتم التمرين عليهما بشكل ضعيف بواسطة أداة التعتيم الأساسية. لمعالجة هذه الفجوات في التغطية، قمنا بتطوير وتقييم أداتين جديدتين مستهدفتين للتعتيم، cmd-fuzzer و argument-fuzzer، مما يثبت قدرتهما على تحسين التغطية في هذه المناطق التي كانت تحت الاختبار سابقًا. نظرًا لأن هذه التحسينات في التعتيم لم تكشف عن ثغرات حرجة جديدة ضمن الإطار الزمني للمشروع، فإن تحليلنا للانهيارات ركز على ثغرة تاريخية معروفة. قمنا بتطوير دليل إثبات المفهوم (PoC) لـ CVE-2020-27347 (تجاوز سعة المخزن المؤقت القائم على المكدس)، وقمنا بتحليل السبب الجذري، وناقشنا الإصلاح المطبق، وقمنا بتقييم آثاره الأمنية.
هدف هذا المشروع إلى تطبيق وتحسين تقنيات التعتيم على مضاعف الطرفية مفتوح المصدر tmux، باستخدام إطار OSS-Fuzz. شمل المشروع عدة مراحل رئيسية:
تقييم خط الأساس (الجزء 1):
input-fuzzer الحالية لـ tmux.تحليل فجوة التغطية (الجزء 2):
tmux التي لم يتم التمرين عليها بشكل كافٍ بواسطة input-fuzzer.arguments.c) ومنطق تحليل/تنفيذ الأوامر (cmd-parse.c، وحدات cmd-*.c) كمجالات رئيسية للتحسين.تحسين أداة التعتيم (الجزء 3):
argument-fuzzer: مصممة خصيصًا لاختبار منطق تحليل وسائط سطر الأوامر في arguments.c.cmd-fuzzer: مصممة لاختبار مسارات تحليل وتنفيذ الأوامر، مستهدفة cmd-parse.c ووحدات cmd-*.c المختلفة.تحليل الأعطال (الجزء 4):
tmux (CVE-2020-27347) للتحليل المتعمق.التسليم النهائي منظم على النحو التالي (ضمن دليل submission/):
submission/
├── README.md # This file
├── part_1/ # Files for Part 1: Baseline Evaluation
│ ├── oss-fuzz.diff # Diff for removing seed corpus for input-fuzzer
│ ├── project.diff # (Likely empty or minor for Part 1)
│ ├── remove_seed_corpus.patch # The actual patch file used
│ ├── report/ # HTML Coverage reports for input-fuzzer
│ │ ├── w_corpus/
│ │ └── wo_corpus/
│ ├── run.w_corpus.sh # Script to run input-fuzzer with corpus
│ └── run.wo_corpus.sh # Script to run input-fuzzer without corpus
├── part_3/ # Files for Part 3: Fuzzer Improvements
│ ├── coverage_noimprove/ # Baseline coverage (e.g., from input-fuzzer without corpus)
│ │ └── ...
│ ├── improve1/ # Improvement 1: argument-fuzzer
│ │ ├── coverage_improve1/ # Coverage report for argument-fuzzer
│ │ ├── oss-fuzz.diff # OSS-Fuzz config changes for argument-fuzzer
│ │ ├── project.diff # Tmux changes for argument-fuzzer (e.g., new .cc, Makefile.am)
│ │ └── run.improve1.sh # Script to run argument-fuzzer
│ └── improve2/ # Improvement 2: cmd-fuzzer
│ ├── coverage_improve2/ # Coverage report for cmd-fuzzer
│ ├── oss-fuzz.diff # OSS-Fuzz config changes for cmd-fuzzer
│ ├── project.diff # Tmux changes for cmd-fuzzer
│ └── run.improve2.sh # Script to run cmd-fuzzer
├── part_4/ # Files for Part 4: Crash Analysis (CVE-2020-27347)
│ ├── environment/ # Docker environment for PoC
│ │ ├── Dockerfile
│ │ ├── run_tmux_cve_test.sh # Core PoC test logic
│ │ ├── test_fixed.sh
│ │ └── test_vulnerable.sh
│ └── run.poc.sh # Script to build Docker image and run PoC tests
└── report.pdf # The comprehensive project report
(ملاحظة: دليل scripts/ الذي يحتوي على _run_fuzz_core.sh هو مساعد وسيكون جزءًا من الجذر إذا كان ملف README هذا موجودًا في جذر المشروع الحقيقي إلى جانب submission/)
جميع حملات التعتيم وإعادة إنتاج PoC لـ CVE مصممة للتشغيل ضمن بيئات Docker التي يتم تنسيقها بواسطة نصوص shell.
جميع حملات التعتيم وإعادة إنتاج PoC لـ CVE مصممة للتشغيل ضمن بيئات Docker التي يتم تنسيقها بواسطة نصوص shell.
المتطلبات الأساسية:
bash وعميل git.[email protected] إذا كانت النصوص بحاجة لاستنساخ oss-fuzz (تحاول الاستنساخ إذا لم يتم العثور على oss-fuzz/ في جذر المشروع). بدلاً من ذلك، يمكنك استنساخ https://github.com/google/oss-fuzz.git مسبقًا في جذر المشروع.هندسة النصوص العامة:
يستخدم المشروع نصًا أساسيًا مركزيًا، scripts/_run_fuzz_core.sh (غير مضمن في دليل submission/ ولكنه جزء من هيكل المشروع العام الذي يفترضه هذا README). النصوص المنفردة الموجودة في submission/part_1/، submission/part_3/improve1/، submission/part_3/improve2/، و submission/part_4/ مسؤولة عن:
oss-fuzz.diff الخاصة بالتشغيل على نسخة نظيفة من مستودع oss-fuzz (متوقع أن يكون في ../../oss-fuzz بالنسبة لمعظم نصوص التشغيل).PROJECT، HARNESS، LABEL، مسارات التصحيحات الخاصة بالمشروع، وأدلة الإخراج)._run_fuzz_core.sh، الذي يتولى بعد ذلك:
tmux).submission/.تشغيل النصوص:
يوصى عمومًا بتنفيذ نصوص التشغيل من دليل جذر المشروع لضمان حل مسارات نسبية صحيحة لـ oss-fuzz/ وأدلة الإخراج.
1. الجزء 1: تقييم خط الأساس (input-fuzzer)
تقوم هذه النصوص بتقييم أداة input-fuzzer الحالية لـ tmux.
# From the project root directory:
./submission/part_1/run.w_corpus.sh # Run input-fuzzer with default seed corpus
./submission/part_1/run.wo_corpus.sh # Run input-fuzzer without seed corpus
يستخدم run.w_corpus.sh سلوك بناء tmux الافتراضي فيما يتعلق بالبذور.
يطبق run.wo_corpus.sh التصحيح submission/part_1/remove_seed_corpus.patch (عبر ملف oss-fuzz.diff المحلي الذي يستدعي هذا التصحيح أو يدمج تغييراته) على oss-fuzz/projects/tmux/build.sh لضمان عدم استخدام أي مجموعة بذور أولية. يتم تصدير تقارير التغطية إلى submission/part_1/report/w_corpus/ و submission/part_1/report/wo_corpus/ على التوالي.
2. الجزء 3: تحسينات أداة التعتيم (input-fuzzer)
التحسين 1 (argument-fuzzer): يستهدف arguments.c.
# From the project root directory:
./submission/part_3/improve1/run.improve1.sh
التحسين 2 (cmd-fuzzer): يستهدف cmd-parse.c وتنفيذ الأوامر.
# From the project root directory:
./submission/part_3/improve2/run.improve2.sh
كل نص run.improveX.sh يطبق ملف oss-fuzz.diff المحلي ويضبط PROJECT_PATCH_FILE إلى ملف project.diff المحلي (الذي يضيف كود أداة التعتيم الجديدة إلى tmux ويحدث Makefile.am). يتم تصدير تقارير التغطية إلى الدلائل submission/part_3/improveX/coverage_improveX/ المعنية. يحتوي دليل submission/part_3/coverage_noimprove/ على تغطية خط الأساس من الجزء 1 للمقارنة.
# From the project root directory:
./submission/part_4/run.poc.sh
يقوم هذا النص ببناء صورة Docker مخصصة (من submission/part_4/environment/Dockerfile) ويختبر tmux 3.1b (ضعيف) مقابل الالتزام المصحح a868bac.
(يمكن العثور على الشروحات التفصيلية والأشكال والجداول في التقرير الكامل report.pdf)
input-fuzzer الحالية.arguments.c)، تحليل/تنفيذ الأوامر (cmd-parse.c، cmd-*.c)، ومنطق العميل/الخادم (client.c، server.c)، كانت غير ممارسة إلى حد كبير (مثال: arguments.c بحوالي 5.8% تغطية الأسطر).argument-fuzzer (يستهدف arguments.c): حققت 66.62% تغطية أسطر لـ arguments.c، وهي زيادة كبيرة من خط الأساس البالغ ~5.8%.cmd-fuzzer (يستهدف تحليل الأوامر وتنفيذها): زادت تغطية الأسطر لـ cmd-parse.c إلى 42.58% (من ~27%) وتغطية الدوال إلى 77.78%.arguments.c إلى 45.54% من خلال هذه الأداة.cmd.c إلى 39.14% تغطية أسطر.cmd-*.c المختلفة (مثل cmd-bind-key.c، cmd-set-options.c إلى 50% تغطية دوال) وإجراءات معالجة المفاتيح (key-string.c إلى 30% تغطية أسطر، key-bindings.c إلى 6.05% تغطية أسطر).6a33a12) باستخدام الحمولة \033[::::::7::1:2:3::5:6:7:m.a868bac (الذي يتضمن الإصلاح ويؤدي إلى الإصدار 3.1c) لم يكن عرضة للانهيار.argument-fuzzer، cmd-fuzzer) تطلب فهمًا جيدًا لمنطق معالجة الوسائط والأوامر الداخلي لـ tmux لاستهداف مسارات كود محددة غير ممارسة.cmd-fuzzer لتغطية مجموعة أوسع من وحدات cmd-*.c، خاصة تلك التي تتعامل مع تفاعلات الحالة المعقدة مثل معالجات النوافذ أو التخطيط أو اللوحات.cmd-parse.y لتوليد تسلسلات أوامر صالحة نحويًا وأكثر تعقيدًا.