公開:

【CVE-2024-50164】Linux KernelのBPF verifier脆弱性が発見、読み取り専用マップへの書き込みが可能に

text: XEXEQ編集部
(記事は執筆時の情報に基づいており、現在では異なる場合があります)


記事の要約

  • Linuxカーネルの BPF verifierに脆弱性を発見
  • 読み取り専用マップへの書き込みが可能になる問題を修正
  • MEM_UNINITの意味の重複による脆弱性を解消

Linux Kernelの BPF verifier脆弱性CVE-2024-50164

Linux Kernelの BPF verifierにおいて、読み取り専用として指定されたマップに対して書き込みが可能となる脆弱性【CVE-2024-50164】が2024年11月7日に公開された。この脆弱性は Lonialによって報告され、check_mem_size_reg()内でバッファサイズを含むレジスタが固定サイズでない場合に書き込みチェックが行われないという問題が発見された。[1]

この脆弱性は、MEM_UNINITが持つ2つの意味、すなわち「BPFヘルパーに渡されるバッファの初期化が不要」という本来の意味と「渡されたバッファに書き込みが行われる」という後から追加された意味が重複することで発生している。バウンダリーチェックは行われているものの、メモリへの書き込みチェックがバイパスされ、読み取り操作としてのみ扱われる問題が確認された。

対策として、MEM_UNINITを本来の意味に戻し、メモリへの書き込みを示す注釈としてMEM_WRITEを BPFヘルパーに追加することで、 BPF verifierによるメモリ書き込みチェックを正しく機能させる修正が実施された。この修正により、ARG_CONST_SIZEやARG_CONST_SIZE_OR_ZEROに対する check_arg_pair_ok()での検証が確実に行われるようになっている。

Linux Kernelのバージョン別影響範囲まとめ

項目 詳細
影響を受けるバージョン 5.19以降
影響を受けないバージョン 5.19未満
修正済みバージョン 6.6.59以降, 6.11.6以降, 6.12以降
修正コミット 48068ccaea95, 54bc31682660, 8ea607330a39
報告者 Lonial

BPF verifierについて

BPF verifierとは、Linuxカーネルにおける BPF(Berkeley Packet Filter)プログラムの安全性を検証するためのコンポーネントのことを指す。主な特徴として、以下のような点が挙げられる。

  • BPFプログラムのメモリアクセスの安全性を検証
  • バッファオーバーフローや不正なメモリ操作を防止
  • カーネル空間での実行前にプログラムの妥当性を確認

BPF verifierは、メモリ境界チェックやアクセス権限の検証など、カーネルの安全性を担保するための重要な役割を果たしている。今回の脆弱性では、バッファサイズの検証とメモリ書き込み権限のチェックにおいて、MEM_UNINITの意味の重複により本来の検証がバイパスされる問題が発生した。

Linux Kernel BPF verifier脆弱性に関する考察

BPF verifierの脆弱性は、メモリ安全性に関する重要な問題を提起している。特にMEM_UNINITの意味の重複は、長年の機能追加による設計の複雑化が引き起こした典型的な例であり、セキュリティ機能の設計において明確な意味づけと一貫性の維持が重要であることを示している。

今後は同様の問題を防ぐため、BPFヘルパー関数の設計においてより厳密な意味の定義と検証が必要になるだろう。特に、メモリアクセスに関する属性や機能の追加時には、既存の機能との相互作用を慎重に評価し、意図しない副作用が発生しないよう注意を払う必要がある。

さらに、BPFプログラムの検証メカニズム全体の見直しも検討に値する。メモリアクセスの検証ロジックをより明確に分離し、各チェックの意図と効果を文書化することで、将来の機能拡張時にも一貫性のある安全な実装を維持できるようになるだろう。

参考サイト

  1. ^ CVE. 「CVE Record | CVE」. https://www.cve.org/CVERecord?id=CVE-2024-50164, (参照 24-11-27).

※上記コンテンツはAIで確認しておりますが、間違い等ある場合はコメントよりご連絡いただけますと幸いです。

「セキュリティ」に関するコラム一覧「セキュリティ」に関するニュース一覧
ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。