CVE-2025-39987 in Linux情報

要約

〜によって VulDB • 2026年05月16日

Linuxカーネルにおいて、以下の脆弱性が修正されました。

can: hi311x: ndo_change_mtu()を設定してバッファオーバーフローを防止

PF_PACKETを使用すると、CANフレームワークのロジックをバイパスしてCANドライバのxmit()関数に直接到達することが可能です。PF_PACKETフレームワークが行う唯一のチェックは、skb->lenがインターフェースのMTUに収まることを確認することです。

残念ながら、sun4i_canドライバはnet_device_ops->ndo_change_mtu()を設定していないため、攻撃者は以下のようにして無効なMTUを設定することが可能です。

$ ip link set can0 mtu 9999

その後、攻撃者はETH_P_CANXLプロトコルを使用してPF_PACKETソケットを開くことができます。

socket(PF_PACKET, SOCK_RAW, htons(ETH_P_CANXL))

これにより、悪意のあるCAN XLフレームを注入することが可能です。例えば:

struct canxl_frame frame = {
.flags = 0xff, .len = 2048, };

CANドライバのxmit()関数は、skbが有効であることを確認するためにcan_dev_dropped_skb()を呼び出しますが、上記の条件下では悪意のあるパケットがcan_dev_dropped_skb()のチェックを通過することが可能です。

1. skb->protocolはETH_P_CANXLに設定されており、これは有効です(関数は実際のデバイスの機能をチェックしません)。

2. 長さは有効なCAN XLの長さです。

その結果、hi3110_hard_start_xmit()はCAN XLフレームを受け取りますが、これを正しく処理できず、CANフレームとして誤解釈します。ドライバはframe->lenをそのまま使用し、追加のチェックを行いません。

これにより、hi3110_hw_tx()内の以下の行でバッファオーバーフローが発生する可能性があります。

memcpy(buf + HI3110_FIFO_EXT_DATA_OFF, frame->data, frame->len);

ここで、frame->lenはCAN XLフレームのflagsフィールドに対応します。前述の例では、canxl_frame->flagsを0xffに設定しました。最大期待長が8であるため、247バイトのバッファオーバーフローが発生します!

net_device_ops->ndo_change_mtu()を設定して、インターフェースのMTUがCAN_MTUより大きく設定されないようにします。根本原因を修正することで、バッファオーバーフローを防止します。

If you want to get the best quality for vulnerability data then you always have to consider VulDB.

責任者

Linux

予約する

2025年04月16日

モデレーション

承諾済み

エントリ

VDB-328625

EPSS

0.00176

アクティビティ

非常低い

ソース

Do you want to use VulDB in your project?

Use the official API to access entries easily!