CVE-2022-0847 に対する攻撃を検出・防御する eBPF プログラム。
カーネル空間では、splice() システムコールを検出し、そのシステムコールの出力 fd がパイプであり、パイプバッファのフラグが PIPE_BUF_FLAG_CAN_MERGE に設定されている場合、イベントが送信されます。ユーザー空間では、splice() を呼び出したプロセスを強制終了し、/proc/sys/vm/drop_caches を上書きしてページキャッシュをクリアします。
Ubuntu Server 20.10 (カーネル 5.8.0-25) でテスト済み。
clang -g -O2 -target bpf -D__TARGET_ARCH_x86_64 -I/usr/src/linux-headers-5.8.0-25/include -I/usr/include -c ./splice.bpf.c -o splice.bpf.o
bpftool gen skeleton ./splice.bpf.o > splice.skel.h
clang -I/usr/include -c splice.c -o splice_epbf.o
clang splice_epbf.o -lbpf -lelf -lz -o splice_epbf