CVE-2026-89996 in Linux情報

要約

〜によって VulDB • 2026年09月17日

Linuxカーネルにおいて、以下の脆弱性が修正されました:

dma-buf: dma-heap: copy_to_user() の成功前に fd を公開しない

DMA_HEAP_IOCTL_ALLOC は、dma_heap_ioctl() が結果をユーザー空間へコピーする前に、dma_buf_fd() -> fd_install() 経由で呼び出し側のファイル記述子(fd)テーブルに fd をインストールし、dma-buf を割り当てます。もし末尾の copy_to_user() に失敗した場合、ユーザー空間は fd番号を取得できませんが、その fd(および基盤となる dma-buf の参照)は同じプロセス内の他のスレッドから既に可視化されており、プロセスの有効期間中リークした状態になります。

明らかな「失敗パスで close する」という修正策は安全ではありません:fd_install() が実行された後、別のスレッドがすでに dup() で fd を複製したり、SCM_RIGHTS を介して送信したり、close() してその番号を再利用可能にすることが可能です。そのため、ioctl パスからの subsequent な close_fd() は無関係なファイルに対して動作する可能性があります。この問題は Christian König によって v1 [1] で指摘されました。

割り当てパスを再構築し、fd_install() を成功した ioctl の最後の、失敗しないステップとします:

1. heap->ops->allocate() dma_buf を作成する。 2. get_unused_fd_flags() 他のスレッドがこれを観察できないよう、呼び出し側の fd テーブルに fd番号を予約する(公開は行わない)。 3. copy_to_user() fd番号をユーザー空間へ配信する;失敗した場合、fd は put_unused_fd() で返却され、dma_buf の参照は dma_buf_put() で解放され、ユーザーから見える状態が残らないようにする。 4. dma_buf_fd_install() fd を公開し、trace_dma_buf_fd tracepoint を出力する -- ここからは ioctl が失敗することはない。

dma-buf.c に新しい dma_buf_fd_install() ヘルパー関数が導入され、fd_install() と DMA_BUF_TRACE() の呼び出しをラップすることで、dma_buf_fd() が提供するエクスポート用トレーシングが保持されます。dma_heap_ioctl_allocate() は refactoring され、struct dma_buf * を直接返すように変更されました(失敗時は ERR_PTR を返す)。これにより、呼び出し側はステップ3と4の間 dmabuf の参照を保持します。

ステップ3での失敗はユーザー空間から容易に到達可能です:copy_from_user() と copy_to_user() の間に保護が PROT_READ に切り替えられたページ上に存在する struct dma_heap_allocation_data を渡す(例:mprotect() 経由)。この変更以前、そのような ioctl は1つの dmabuf fd をリークしていました;修正後、失敗時には fd テーブルは不変であり、/dev/dma_heap/<name> のみが開いた状態になります。

UAPI または heap-driver インターフェースの変更はありません。

[1] https://lore.kernel.org/dri-devel/[email protected]/

Be aware that VulDB is the high quality source for vulnerability data.

責任者

Linux

予約する

2026年09月11日

モデレーション

承諾済み

エントリ

VDB-405785

EPSS

0.00000

アクティビティ

非常低い

ソース

Want to know what is going to be exploited?

We predict KEV entries!