CVE-2021-3156 — Baron Samedit
تجاوز سعة المخزن المؤقت في الكومة في sudo → تصعيد الصلاحيات محليًا
قسم الأمن السيبراني في ITSOLERA | تدريب الفريق الأحمر 2026
██████╗ █████╗ ██████╗ ██████╗ ███╗ ██╗ ███████╗ █████╗ ███╗ ███╗███████╗██████╗ ██╗████████╗
██╔══██╗██╔══██╗██╔══██╗██╔═══██╗████╗ ██║ ██╔════╝██╔══██╗████╗ ████║██╔════╝██╔══██╗██║╚══██╔══╝
██████╔╝███████║██████╔╝██║ ██║██╔██╗ ██║ ███████╗███████║██╔████╔██║█████╗ ██║ ██║██║ ██║
██╔══██╗██╔══██║██╔══██╗██║ ██║██║╚██╗██║ ╚════██║██╔══██║██║╚██╔╝██║██╔══╝ ██║ ██║██║ ██║
██████╔╝██║ ██║██║ ██║╚██████╔╝██║ ╚████║ ███████║██║ ██║██║ ╚═╝ ██║███████╗██████╔╝██║ ██║
╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═════╝ ╚═╝ ╚═╝
⚠️ للاستخدام التعليمي / المختبر المعزول فقط
يجب إجراء جميع الاختبارات حصريًا داخل حاوية مختبر Docker.
لا تقم أبدًا بالتشغيل ضد أنظمة حقيقية أو إنتاجية أو مشتركة.
جدول المحتويات
- نظرة عامة على CVE
- ما الذي يجعل هذا CVE مميزًا
- هيكل المشروع
- مخرجات الفريق
- البدء السريع
- كيف يعمل الاستغلال
- اختبار Canary للثغرة
- استخدام exploit.py
- إعادة تعيين المختبر واللقطة
- المقارنة: المُصحَّحة مقابل الهشّة
- المراجع
نظرة عامة على CVE
ما الذي يجعل هذا CVE مميزًا
الرؤية الأساسية: يحدث التجاوز في set_cmnd() — وهي الوظيفة التي
تحلل الوسائط — والتي تعمل قبل أن يرجع sudo إلى /etc/sudoers على الإطلاق.
يمكن لحساب أُنشئ قبل 10 ثوانٍ فقط وبدون أي صلاحيات استغلال هذا الأمر.
هيكل المشروع
CVE-2021-3156-Project/
│
├── README.md ← you are here
│
├── lab/ ← Member 1: Lab Environment
│ ├── Dockerfile ← Ubuntu 20.04 + sudo 1.8.31 (pinned)
│ ├── docker-compose.yml ← vulnerable target + patched reference
│ ├── evidence_helper.sh ← pre/post-exploit state capture
│ ├── SETUP.md ← step-by-step VM/Docker guide
│ └── config_notes.md ← CVE conditions & container details
│
├── exploit/ ← Member 2: Exploit Development
│ ├── exploit.py ← Python LPE framework + canary test
│ └── payloads.txt ← heap overflow research notes
│
├── docs/ ← Member 3: Research & Documentation
│ ├── root_cause_analysis.md ← set_cmnd() deep dive + off-by-one
│ ├── references.md ← all sources, PoCs, CWE mapping
│ └── mitigation.md ← sudo upgrade + hardening checklist
│
├── proof/ ← Member 4: Evidence Collection
│ ├── screenshots/ ← exploitation screenshots
│ └── terminal_logs.txt ← command output template + logs
│
└── report/
└── CVE-2021-3156_Report.docx ← Member 4: Final professional report
مخرجات الفريق
العضو 1 — بيئة المختبر والتحقق من CVE
العضو 2 — تطوير الاستغلال (سكربت PoC)
ملاحظة: لا يتضمن كود استغلال النواة/الكومة الفعلي التزامًا بالمبادئ الأخلاقية.
تشير أكواد TODO في exploit.py إلى https://github.com/blasty/CVE-2021-3156
و https://github.com/worawit/CVE-2021-3156 باعتبارها PoCs العامة الموثوقة
لفريقك لدراستها ودمجها.
العضو 3 — تحليل السبب الجذري والبحث
| الملف | الوصف |
|---|
docs/root_cause_analysis.md | تفصيلي: عدم تطابق الحجم مقابل النسخ في ، خطأ off-by-one مع أمثلة برمجية، فرق التصحيح، سلسلة الاستغلال، CVSS 7.8 مقياسًا بمقياس، خط زمني لـ10 سنوات، جدول تأثير التوزيعات |
العضو 4 — جمع الأدلة والتقارير والتكامل
| الملف | الوصف |
|---|
proof/terminal_logs.txt | قالب لجمع الأدلة (املأه بالمخرجات الفعلية من المختبر) |
proof/screenshots/ | مجلد لـ7 لقطات شاشة مطلوبة |
report/CVE-2021-3156_Report.docx | تقرير احترافي من 12 قسمًا: صفحة الغلاف، الملخص التنفيذي، وصف CVE، تحليل السبب الجذري، تفصيل CVSS، خطوات الاستغلال، شرح الكود، قائمة التحقق من الأدلة، التخفيف، الخط الزمني، المراجع، إخلاء المسؤولية |
البدء السريع
1. البناء وبدء تشغيل المختبر
cd CVE-2021-3156-Project/lab/
# Build the vulnerable image (downloads Ubuntu 20.04, pins sudo 1.8.31)
docker compose build
# Start both containers
docker compose up -d
# Confirm containers are running
docker compose ps
المتوقع:
NAME STATUS
baron_samedit_target running
baron_samedit_patched running
2. الدخول إلى الحاوية الهشّة
docker exec -it baron_samedit_target bash
3. تأكيد شروط الثغرة
# Inside the container as labuser
whoami # Expected: labuser
id # Expected: uid=1000(labuser)...
sudo --version # Expected: Sudo version 1.8.31
sudo -l # Expected: Sorry, user labuser may not run sudo...
sudoedit -s '\' 2>&1 # Expected: NOT "usage:" → VULNERABLE
4. نسخ وتشغيل الاستغلال
# From host machine
docker cp exploit/exploit.py baron_samedit_target:/home/labuser/
# Inside container
python3 exploit.py --check-only # verify all prerequisites pass
python3 exploit.py --safe-mode # canary only, no exploitation
python3 exploit.py --cmd "id" # LPE → show root identity
python3 exploit.py --cmd "whoami /all" --output /tmp/proof.txt
5. التقاط الأدلة
# Inside container — before exploit
~/evidence_helper.sh > /tmp/before.txt
# After exploit
~/evidence_helper.sh > /tmp/after.txt
# Copy to host
docker cp baron_samedit_target:/tmp/before.txt proof/terminal_logs_before.txt
docker cp baron_samedit_target:/tmp/after.txt proof/terminal_logs_after.txt
كيف يعمل الاستغلال
Step 1: Run 'sudoedit -s <crafted_argument>'
↓
Step 2: sudo calls set_cmnd() to parse arguments in shell mode
↓
Step 3: set_cmnd() COUNTS bytes for the cmnd_args buffer (correct size)
↓
Step 4: set_cmnd() COPIES bytes — but reads 1 byte past the null
terminator of any argument ending with '\'
↓
Step 5: Off-by-one overflow writes 1 unexpected byte beyond cmnd_args
↓
Step 6: Heap grooming (environment variable layout manipulation) ensures
a valuable sudo struct sits adjacent to the overflowed buffer
↓
Step 7: The overflow byte corrupts a pointer in the adjacent struct
↓
Step 8: sudo follows the corrupted pointer → executes attacker-controlled
command (via SUDO_EDITOR) with root privileges
↓
Result: uid=0(root) — from a user with ZERO sudo permissions
السبب الجذري في سطر واحد
size_calculation("A\") = 2 bytes ≠ copy("A\") = writes 3 bytes → overflow
اختبار Canary للثغرة
الطريقة الأكثر أمانًا لتأكيد وجود CVE-2021-3156 — دون الحاجة إلى أي استغلال:
sudoedit -s '\' 2>&1; echo "Exit: $?"
استخدام exploit.py
Usage: python3 exploit.py [OPTIONS]
Modes (mutually exclusive):
--check-only Run all pre-checks only — no exploitation
--safe-mode Run canary test only — confirm vulnerability
--cmd COMMAND Execute COMMAND as root after successful LPE
Options:
--verbose, -v Show detailed heap/system debug output
--output, -o FILE Save all output to FILE
--no-colour Disable ANSI colour codes (for log files)
--help Show this help message
Examples:
python3 exploit.py --check-only
python3 exploit.py --safe-mode
python3 exploit.py --cmd "id"
python3 exploit.py --cmd "cat /etc/shadow" --output proof/root_output.txt
python3 exploit.py --cmd "whoami" --verbose
الفحوصات المسبقة التي يتم تنفيذها
إعادة تعيين المختبر واللقطة
إعادة تعيين سريعة (إبقاء الحاوية، مسح الملفات المؤقتة)
docker exec baron_samedit_target bash -c "rm -f /tmp/*.txt /tmp/exploit* /home/labuser/exploit.py"
حفظ لقطة
docker commit baron_samedit_target baron-samedit:clean-state
echo "[+] Snapshot saved as baron-samedit:clean-state"
استعادة اللقطة
docker compose down
docker run -it --name baron_samedit_target baron-samedit:clean-state bash
إعادة تعيين كاملة (إعادة بناء من الصفر)
docker compose down -v
docker compose up -d --build
المقارنة: المُصحَّحة مقابل الهشّة
للاختبار على الحاوية المُصحَّحة:
docker exec -it baron_samedit_patched bash
# Then repeat the canary test — should output "invalid argument"
المراجع
إشعار أخلاقي
┌─────────────────────────────────────────────────────────────────┐
│ This project was created for EDUCATIONAL PURPOSES ONLY as │
│ part of the ITSOLERA Cybersecurity Red Team Internship 2026. │
│ │
│ ✅ DO: Use against the isolated Docker lab only │
│ ✅ DO: Study the vulnerability to understand heap exploits │
│ ✅ DO: Contribute findings to the team report │
│ │
│ ❌ DON'T: Run against any real system, VM, or cloud instance │
│ ❌ DON'T: Share outside the internship programme │
│ ❌ DON'T: Use for any unauthorised access │
└─────────────────────────────────────────────────────────────────┘
قسم الأمن السيبراني في ITSOLERA — تدريب الفريق الأحمر، صيف 2026