CVE-2023-2163: eBPF Linuxカーネル脆弱性の発見と修正
背景
- eBPFは、複雑なカーネルモジュールを書かずに、実行時にLinuxカーネルの機能を拡張できる技術。
- eBPFプログラムは特定のイベント発生時に実行され、ロード前に安全性の検証を受ける必要がある。
- 検証器(verifier)は複雑なコードで構成されており、多くの脆弱性が見つかっている。
- Googleは、eBPF verifierを自動監査するファザー(fuzzer)であるBuzzerを開発した。
Buzzerのポインタ算術戦略
- BuzzerはeBPF向けの新しいファザーで、論理バグを引き起こすことを狙った戦略を用いる。
- ポインタ算術戦略は次のような段階で構成される:
- レジスタを任意の値で初期化するヘッダーを生成
- 任意の算術命令およびジャンプ命令を生成
- 任意のレジスタを選択し、eBPFマップ要素へのポインタとの加算を実行
- その要素にマジック値を書き込む
eBPFのパス枝刈り
- eBPF verifierは、プログラムが安全に実行できるかを確認する役割を担う。
- 条件文がある場合、あらゆる可能な状態をシミュレートする。
- 条件付きジャンプが多い場合は、性能向上のためにパス枝刈り戦略を使用する。
バグ
- CVE-2023-2163は「正確な追跡」という概念を導入し、パス枝刈りをより効率的にした。
- バグは、r9レジスタがr6の正確性に寄与していることを見落としたために発生した。
エクスプロイト
- CVE-2023-2163を悪用することで任意の読み取り/書き込みを達成し、LPEおよびコンテナ脱出を実行できる。
- 主な段階:
- 任意の読み取り/書き込みを達成
- プロセスの資格情報を見つけて権限を昇格
修正
- CVE-2023-2163を修正するため、正確なレジスタに影響を与える演算で、不正確なレジスタを正確としてマークするようにした。
- 性能への影響は不明だが、追加の問題は見つかっていない。
今後のアイデア
- eBPFプログラムの安全性を保証することは、検証プロセスの複雑さゆえに難しい。
- GoogleはBuzzerを通じてこの問題の解決に取り組んでおり、オープンソースコミュニティからの貢献を歓迎している。
GN⁺のまとめ
- この記事は、eBPF verifierの脆弱性を発見し修正する過程を説明している。
- eBPFはカーネルセキュリティ研究における重要な技術であり、その安全性を保証するのは難しい。
- GoogleはBuzzerというファザーを開発し、eBPF verifierの脆弱性を自動監査している。
- この記事はセキュリティ研究者や開発者にとって有用であり、eBPFのような複雑なシステムの安全性を保証する助けとなる。
- 類似機能を持つプロジェクトとして、eBPFに関連する他のファザー系ツールがある。
まだコメントはありません。