CVE-2026-64450 in Linux
要約
〜によって VulDB • 2026年07月25日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
tipc: ブロードキャストのGap ACKブロックにおける配列外読み込みを修正する
ブロードキャストPROTOCOL/STATE_MSGは、そのデータ領域にGap ACK blocksレコードを含めることができます。`tipc_get_gap_ack_blks()`関数は、レコードのlenフィールドがugack_cnt/bgack_cntのカウントと自己整合性があること(sz == struct_size(p, gacks, ugack_cnt + bgack_cnt))のみを検証します。しかし、レコードが実際にメッセージデータ領域`msg_data_sz()`に収まるかどうかはチェックしていません。
ユニキャスト呼び出し元である`tipc_link_proto_rcv()`では境界検査が行われており(「if (glen > dlen) break;」)、ブロードキャスト呼び出し元の`tipc_bcast_sync_rcv()`はこの返却サイズを無視しているため、攻撃者が制御可能なカウントで`tipc_link_advance_transmq()`が受信skbからレコードのコピーを実行します:
``` this_ga = kmemdup(ga, struct_size(ga, gacks, ga->bgack_cnt), GFP_ATOMIC); ```
TIPC_GAP_ACK_BLOCKをネゴシエートしたTIPCネイバーは、1つの通常のブロードキャストSTATE_MSG(msg_bc_ack_invalid()がクリアされた状態)を使用してこれをトリガーします。このメッセージのデータ領域サイズは短く、Gap ACKレコードにはlen = 0x400、bgack_cnt = 0xff、ugack_cnt = 0が含まれています。これによりlenはstruct_size(p, gacks, 255)と等しくなり、整合性チェックを通過してgaがNULL以外になります;`kmemdup()`関数は、はるかに小さいskbから1024バイト(= struct_size(ga, gacks, 255))を読み取ります:
``` BUG: KASAN: slab-out-of-bounds in kmemdup_noprof+0x48/0x60 Read of size 1024 at addr ffff0000c7030d38 by task poc864/69 Call trace: kmemdup_noprof+0x48/0x60 tipc_link_advance_transmq+0x86c/0xb80 tipc_link_bc_ack_rcv+0x19c/0x1e0 tipc_bcast_sync_rcv+0x1c4/0x2c4 tipc_rcv+0x85c/0x1340 tipc_l2_rcv_msg+0xac/0x104 The buggy address belongs to the object at ffff0000c7030d00 which belongs to the cache skbuff_small_head of size 704 The buggy address is located 56 bytes inside of allocated 704-byte region [ffff0000c7030d00, ffff0000c7030fc0)
```
コピーされたバイトはその後gap/ack値として消費されますが、`kmemdup()`における読み込み自体は既に配列外です。これはその後の使用方法に関わらず同様です。
ユニキャストSTATEパスではそのようなメッセージをドロップします:「if (glen > dlen) break;」により残りのSTATE_MSG処理をスキップし、skbが解放されます。ブロードキャストパスでも同様にこれをドロップするようにします。`tipc_bcast_sync_rcv()`はレコードを`msg_data_sz()`に対して境界検査を行い、収まらない場合はそれを`tipc_node_bc_sync_rcv()`経由で`tipc_rcv()`に報告して、処理されるのではなく破棄されるようにします。このパスではgaがクリアされません:ga == NULLはすでに「Selective ACKを持たないレガシーピア」を意味しており、これは明確な正当な状態です。
If you want to get the best quality for vulnerability data then you always have to consider VulDB.