JVNDB-2025-025274 | |
LinuxのLinux Kernelにおける不特定の脆弱性 | |
| 概要 | |
Linuxカーネルにおいて、以下の脆弱性が修正されました:net: enetc: xdp_do_redirect()失敗時のバッファリークを回避します。enetc_clean_rx_ring_xdp()は、xdp_do_redirect()を呼び出す前に、RXリング内のインデックスorig_iからiまでの各ソフトウェアBDに対し、そのページの参照カウント(refcount)が二つの値のうちのいずれかであることを確認します。現在処理中のバッファの所有者であるため、refcountは少なくとも1です。RXリングの反対側のインデックスにあるバッファの現在の所有者がまだkfree()を呼んでいなければ、このページのrefcountは2になることもあります。enetc_flip_rx_buff()内のenetc_page_reusable()はページのrefcountが1かどうかをチェックし、もし2なら再利用しません。しかし、enetc_flip_rx_buff()をxdp_do_redirect()の後に置くと、ページrefcountは0も含め3つの値を取り得ます。これは、他のページ半分に所有者がおらず、このバッファに対するxdp_do_redirect()がdevmap/cpumapのバルクキューのフラッシュを引き起こし、そのキューの消費者もバッファを解放してしまった場合があるためです。このため、enetc_flip_rx_buff()はxdp_do_redirect()の前に呼ばれますが、大きな欠陥があります。具体的には、enetc_flip_rx_buff()はenetc_page_reusable()の分岐の両側でrx_swbd-pageをNULLに設定します。もしxdp_do_redirect()がエラーを返すとenetc_xdp_free()が呼ばれますが、これはそれにうまく対処できません。実際の挙動は特異で、ページrefcountは1から始まり、enetc_flip_rx_buff()が再利用可能と判断して、これらのrx_swbd-pageポインタをenetc_reuse_page()内の別のrx_swbdに転送し、refcountを2に増やします。xdp_do_redirect()がエラーを返すと、何もしないenetc_xdp_free()が呼ばれますが、まだページへの参照は失われていません。コピーはrx_ring-next_to_allocにあり、refcountは2で、同時にrefcountを減らす所有者もいません。本当に問題を引き起こすのは二回目にrx_swbd-pageを反転させる時であり、refcountが2の場合ページは再利用不可能となり、実際にリークが発生します。さらにenetc_new_page()が新しいページを割り当て、xdp_do_redirect()のエラーが続くと再びリークが生じます。問題を要約すると、rx_swbd-pageを完全に処理し終える前にNULL化(ゼロイング)するため、エラーパスで適切に扱えなくなっていることです。パケットは複数バッファの可能性があり、rx_swbd-pageは配列の場合もあるため、古いポインタをenetc_flip_rx_buff()からenetc_xdp_free()へ手動で渡すことは困難です。簡単な解決策として、xdp_do_redirect()との競合状態を許容し、反転処理をリダイレクト成功時のみ実行するように移動しました。競合とは、enetcがrefcountが0のため再利用不可と判断することがあるが、リークは発生しないことを意味します。これを受け入れて、XDP_REDIRECT失敗時のバッファの扱いを改善しました。半ページ反転を行っていないため行わず、その結果enetc_xdp_free()を完全に回避し、ページ全体がスラブアロケータに渡ることを防ぎます。代わりにenetc_xdp_drop()を呼び出し、この半分のバッファをRXリングに再利用します。 | |
| CVSS による深刻度 (CVSS とは?) | |
|
CVSS v3 による深刻度
基本値: 5.5 (警告) [NVD値]
| |
| 影響を受けるシステム | |
|
| |
Linux | |
|
| |
| 想定される影響 | |
当該ソフトウェアが扱う情報について、外部への漏えいは発生しません。 | |
| 対策 | |
リリース情報、またはパッチ情報が公開されています。参考情報を参照して適切な対策を実施してください。 | |
| ベンダ情報 | |
|
| |
| CWEによる脆弱性タイプ一覧 CWEとは? | |
| |
| 共通脆弱性識別子(CVE) CVEとは? | |
|
| |
| 参考情報 | |
| |
| 更新履歴 | |
|
| 公表日 | 2025/10/04 |
| 登録日 | 2026/01/26 |
| 最終更新日 | 2026/01/26 |



