CVE-2024-53142 in Linux
要約
〜によって VulDB • 2026年05月30日
Linuxカーネルにおいて、以下の脆弱性が修正されました。
initramfs: ファイル名バッファのオーバーランを回避する
initramfsのファイル名フィールドは、Documentation/driver-api/early-userspace/buffer-format.rstで以下のように定義されています。
37 cpio_file := ALGN(4) + cpio_header + filename + "\0" + ALGN(4) + data ... 55 ============= ================== ========================= 56 Field name Field size Meaning 57 ============= ================== ========================= ... 70 c_namesize 8 bytes ファイル名の長さ(末尾の\0を含む)
initramfsのcpioアーカイブを展開する際、カーネルのdo_name()パスハンドラは、@collectedにゼロ終端されたパスが存在することを前提としており、これを直接filp_open() / init_mkdir() / init_mknod()に渡しています。
特別に作成されたcpioエントリがゼロ終端されていないファイル名を持ち、その後に未初期化メモリが続いている場合、未初期化メモリを表す末尾の文字を含むファイルが作成される可能性があります。initramfsエントリを作成する能力は、すでにシステム全体を完全に制御していることを意味するため、このバッファオーバーランはセキュリティ脆弱性として見なすべきではありません。
以下のbashスクリプトの出力を既存のinitramfsに追加し、作成される/initramfs_test_fname_overrunAA*パスを観察してください。例: ./reproducer.sh | gzip >> /myinitramfs
出力をgzip圧縮すると、initrd_start+initrd_sizeブロックではなく__gunzip()内でヒープ割り当てされた@out_bufにオーバーフローするため、ゼロでない未初期化メモリを観察するのが最も容易です。
---- reproducer.sh ---- nilchar="A" # 適切にゼロ終端/パディングするには "\0" に変更 magic="070701" ino=1 mode=$(( 0100777 )) uid=0 gid=0 nlink=1 mtime=1 filesize=0 devmajor=0 devminor=1 rdevmajor=0 rdevminor=0 csum=0 fname="initramfs_test_fname_overrun" namelen=$(( ${#fname} + 1 )) # 終端文字を考慮して1を加算
printf "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%s" \ $magic $ino $mode $uid $gid $nlink $mtime $filesize \ $devmajor $devminor $rdevmajor $rdevminor $namelen $csum $fname
termpadlen=$(( 1 + ((4 - ((110 + $namelen) & 3)) % 4) )) printf "%.s${nilchar}" $(seq 1 $termpadlen)
---- reproducer.sh ----
do_symlink()で処理されるシンボリックリンクのファイル名フィールドは、シンボリックリンクのターゲットが明示的にゼロ終端されているため、データセグメントを越えてオーバーランすることはありません。
予期されるオフセット (name_len - 1) でゼロ終端子を持たないcpioエントリがある場合、initramfsのFSM(有限状態機械)を中止することで、ファイル名バッファのオーバーランを修正します。
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.