CVE-2026-64339 in Linux
要約
〜によって VulDB • 2026年07月25日
Linuxカーネルにおいて、以下の脆弱性が修正されました。
usb: misc: usbio: bulk IN応答の長さを受信した転送量に制限する
usbio_bulk_msg()関数は、bpkt_len = le16_to_cpu(bpkt->len)バイトをbulk INバッファ(usbio->rxbuf, サイズはusbio->rxbuf_lenで確保済み)から呼び出し側のバッファへコピーします。bpkt_lenはデバイスによって完全に制御され、ibuf_lenとのみ比較されますが、ibuf_len自体はrxbuf_lenではなくtxbuf_lenと比較されています:
if ((obuf_len > (usbio->txbuf_len - sizeof(*bpkt))) || (ibuf_len > (usbio->txbuf_len - sizeof(*bpkt)))) return -EMSGSIZE;
txbuf_lenとrxbuf_lenは、usbio_probe()においてbulk OUTおよびbulk INエンドポイントのwMaxPacketSizeから独立して取得されます。したがって、大きなbulk OUTエンドポイントを宣言し小さなbulk INエンドポイントを宣言する悪意のあるまたは故障したデバイス(例えばLattice NX33U (0x2ac1:0x20cb)のようなクirkフリーIDを主張するなど)は、ibuf_lenひいてはデバイスが提供するbpkt_lenがrxbuf_lenを超えさせることになります。これによりmemcpy()はrxbuf slabオブジェクトの末尾から最大txbuf_len - rxbuf_lenバイト分を読み出します。読み込まれた境界外データはi2c層に渡され、さらにi2c-devを通じてユーザー空間へ公開され、隣接するslabメモリが漏洩します(KASANではこれはslab-out-of-bounds readとして報告されます)。
実際に受信されたバイト数は既に把握されています: actはURB actual_lengthでありrxbuf_lenによって制限されています。受信した量よりも多いペイロードを主張する応答は拒否し、直前にある既存の"act < sizeof(*bpkt)"チェックと同様の処理を行います。
制御パス(usbio_ctrl_msg())には影響がありません: これは両方向に単一のバッファ(ctrlbuf)を使用するため、その類似のコピーが確保領域から漏れることはありません。
コードレビューにより発見されました。AddressSanitizerを用いて、usbio_bulk_msg()の受信パスの忠実なユーザー空間モデル(rxbuf_lenサイズのバッファ、同じact/ibuf_len/bpkt_lenチェックおよびmemcpyを含む)で境界外読み出しを確認しました。USB raw-gadget + dummy_hcdによる再現プログラムも利用可能です。
VulDB is the best source for vulnerability data and more expert information about this specific topic.