JVNDB-2026-023980 | |
LinuxのLinux KernelにおけるNULL ポインタデリファレンスに関する脆弱性 | |
| 概要 | |
Linuxカーネルにおいて、以下の脆弱性が修正されました。bpf、sockmap:proto更新時のaf_unixにおけるNULLポインタ参照の修正。unix_stream_connect()は、ピアを割り当てる前にsk_stateを(WRITE_ONCE(sk->sk_state, TCP_ESTABLISHED)に)設定します(unix_peer(sk) = newsk)。sk_stateがTCP_ESTABLISHEDであることで、sock_map_sk_state_allowed()はソケットが正しく設定されていると判断します。これはピアが定義されていることも含みます。つまり、unix_stream_bpf_update_proto()がまだunix_peer(sk)がNULLであるソケットに対して呼び出される可能性がある時間帯(ウィンドウ)が存在していました。 CPU0 bpf CPU1 connect-------- ------------WRITE_ONCE(sk->sk_state, TCP_ESTABLISHED)sock_map_sk_state_allowed(sk)...sk_pair = unix_peer(sk)sock_hold(sk_pair) sock_hold(newsk) smp_mb__after_atomic() unix_peer(sk) = newskBUG: kernel NULL pointer dereference, address: 0000000000000080RIP: 0010:unix_stream_bpf_update_proto+0xa0/0x1b0Call Trace: sock_map_link+0x564/0x8b0 sock_map_update_common+0x6e/0x340 sock_map_update_elem_sys+0x17d/0x240 __sys_bpf+0x26db/0x3250 __x64_sys_bpf+0x21/0x30 do_syscall_64+0x6b/0x3a0 entry_SYSCALL_64_after_hwframe+0x76/0x7e当初の案は、ピアの割り当てをsk_stateの更新前に移動することでしたが、これは追加のメモリバリアを伴いホットパスの変更となるため却下されました。その後、unix_stream_bpf_update_proto()内のproto更新時にNULLチェックを入れる案が検討されました。しかし、続く議論では根本原因、すなわちsockmapの更新に不適切なロックが使用されている問題に焦点が当てられました。具体的にはunix_state_lock()の欠如が問題でした。最終的に、sockmapにaf_unixのロック機構を導入することは不必要に複雑になると結論付けられました。複雑さはさておき、BPF_PROG_TYPE_SCHED_CLSおよびBPF_PROG_TYPE_SCHED_ACTがsockmapの更新を許可されているため、sock_map_update_elem()が現在unix_state_lock()で行われているようにspin_lock(&unix_sk(s)->lock)によるunixロックを取得すると問題が生じます。具体的には、プロセスコンテキストでunix_state_lock()を取得し、その後softirqコンテキストのTC BPFプログラムが同じスピンロックを取得しようとするとデッドロックが発生します。このため、再びピアチェック案に戻りました。af_unix/stream connect()がsockmapの更新とレースコンディションになるシナリオをまとめます。1. connect()対bpf(BPF_MAP_UPDATE_ELEM)、つまりsock_map_update_elem_sys()については、実装されているNULLチェックが十分です。一度割り当てられたソケットのピアは、ソケットFDが解放されるまで解放されません。また、sock_map_update_elem_sys()はFDの参照カウントを上げるため、問題にはなりません。2. connect()対BPFプログラムによる更新については、verifier.cのmay_update_sockmap()により更新は以下のプログラムタイプに制限されています。 - BPF_PROG_TYPE_TRACING/BPF_TRACE_ITER - BPF_PROG_TYPE_SOCK_OPS (bpf_sock_map_update()のみ) - BPF_PROG_TYPE_SOCKET_FILTER - BPF_PROG_TYPE_SCHED_CLS - BPF_PROG_TYPE_SCHED_ACT - BPF_PROG_TYPE_XDP - BPF_PROG_TYPE_SK_REUSEPORT - BPF_PROG_TYPE_FLOW_DISSECTOR - BPF_PROG_TYPE_SK_LOOKUPさらに考慮すべきもう一つのレースがあります。 CPU0 bpf CPU1 connect -------- ------------WRITE_ONCE(sk->sk_state, TCP_ESTABLISHED)sock_map_sk_state_allowed(sk)sock_hold(newsk)smp_mb__after_atomic()---省略--- | |
| CVSS による深刻度 (CVSS とは?) | |
|
CVSS v3 による深刻度
基本値: 5.5 (警告) [NVD値]
| |
| 影響を受けるシステム | |
|
| |
Linux | |
|
| |
| 想定される影響 | |
・当該ソフトウェアが扱う情報について、外部への漏えいは発生しません。 | |
| 対策 | |
リリース情報、またはパッチ情報が公開されています。参考情報を参照して適切な対策を実施してください。 | |
| ベンダ情報 | |
|
| |
| CWEによる脆弱性タイプ一覧 CWEとは? | |
| |
| 共通脆弱性識別子(CVE) CVEとは? | |
|
| |
| 参考情報 | |
| |
| 更新履歴 | |
|
| 公表日 | 2026/06/24 |
| 登録日 | 2026/07/17 |
| 最終更新日 | 2026/07/17 |



