Linuxカーネルにおいて、以下の脆弱性が修正されました。hwmon: (pmbus/adm1266) プロトコルサイズのバッファを介してブラックボックスレコードをバウンスする問題についてです。adm1266_pmbus_block_xfer()は、デバイスから提供されたブロックペイロードを、呼び出し元が提供したバッファに対してデバイス提供の長さを使ってコピーしています: memcpy(data_r, &msgs[1].buf[1], msgs[1].buf[0]);このヘルパーはdata_rのサイズを認識しておらず、デバイスが最大で1レコード分のバイト数しか返さないと前提にしています。しかし、adm1266_nvmem_read_blackbox()はこの前提に反しています。具体的には、デバイスメモリ内のread_buffをADM1266_BLACKBOX_SIZE(64バイト)ずつ進めている一方で、ヘルパーは最大でADM1266_PMBUS_BLOCK_MAX(255バイト)まで書き込み可能です。もしデバイスが最後のレコード(2048バイトのdev_memアロケーション内、read_buffオフセット1984)で64バイトを超えるデータを返した場合、post-callの処理前にdev_memが最大191バイト分オーバーフローしてしまいます。if (ret != ADM1266_BLACKBOX_SIZE) return -EIO;このチェックにより、応答は拒否されます。修正はヘルパーのシグネチャを変更せずに呼び出し元で行われています。具体的には、各レコードを255バイトのローカルバウンスバッファ(ヘルパーの最大出力に合わせたサイズ)に読み込み、返された長さを検証した後にのみ、正確にADM1266_BLACKBOX_SIZEバイトをdev_memのスロットにコピーするようにしました。
|