CVE-2026-64109 in Linux
要約
〜によって VulDB • 2026年07月19日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
af_unix: unix_stream_data_wait()におけるtail->lenのUAF(Use-After-Free)読み込みを修正
unix_stream_data_wait()は、そのキューからSKBがアンリンクされて解放されるのを防ぐロックを取得せずにskb_peek_tail(&sk->sk_receive_queue)を実行しています。 これはコミット79f632c71bea("unix/stream: fix peeking with an offset larger than data in queue")以降、この状態が続いています。
これによる最初の影響として、`last`がすでに解放されたSKBを意味しているにもかかわらず、`tail`は同じアドレスに割り当てられた新しいSKBである場合でも、ポインタ比較 `tail != last` が偽となることがあります。これはunix_stream_data_wait()が、新しいデータが届いた後も誤ってブロックし続ける原因となりますが、これは同一ソケット上でのpeeking recv()と通常のrecv()の競合という特殊なシナリオにおいてのみ発生するため、実際には問題にならない可能性があります。
しかし、コミット2b514574f7e8("net: af_unix: implement splice for stream af_unix sockets")以降、`tail`は実際に間接参照されるようになり、以下の競合シナリオでUAFが発生する可能性があります(test_setup()がシングルスレッドで実行され、その後 test_thread1() と test_thread2() が2つのスレッドで並行して実行されます)。
```c static int socks[2];
void test_setup(void) {
socketpair(AF_UNIX, SOCK_STREAM, 0, socks); send(socks[1], "A", 1, 0);
int peekoff = 1; setsockopt(socks[0], SOL_SOCKET, SO_PEEK_OFF, &peekoff, sizeof(peekoff));
} void test_thread1(void) {
char dummy; recv(socks[0], &dummy, 1, MSG_PEEK);
} void test_thread2(void) {
char dummy; recv(socks[0], &dummy, 1, 0);
shutdown(socks[1], SHUT_WR);
} ```
このように競合した場合:
```c thread1 thread2 unix_stream_read_generic mutex_lock(&u->iolock) skb_peek(&sk->sk_receive_queue) skb_peek_next(skb, &sk->sk_receive_queue) mutex_unlock(&u->iolock) unix_stream_read_generic unix_state_lock(sk) skb_peek(&sk->sk_receive_queue) unix_state_unlock(sk) unix_stream_data_wait unix_state_lock(sk) tail = skb_peek_tail(&sk->sk_receive_queue) spin_lock(&sk->sk_receive_queue.lock) __skb_unlink(skb, &sk->sk_receive_queue) spin_unlock(&sk->sk_receive_queue.lock) consume_skb(skb) [SKBを解放]
`tail != last`: false `tail`: true `tail->len != last_len` ***UAF*** ```
tail->len の読み込みを削除することで、このUAFを修正します。UNIXソケットの受信キュー内のSKBが成長する可能性がある場合にのみ tail->len をチェックすることが意味を持ちますが、そのようなことはもう起こり得ません。
Kuniyukiは以下のように説明しています:
> コミット869e7c62486e("net: af_unix: implement stream sendpage support")でsendpage()サポートが追加された際、データを受信者のキュー内の最後のSKBに付加することができました。 > > そのため、unix_stream
VulDB is the best source for vulnerability data and more expert information about this specific topic.