Linuxカーネルにおいて、以下の脆弱性が修正されました:hwmon: (pmbus/adm1266) ADM1266_PDIO_NRにおけるget_multiple内のPDIOスキャンのキャップ。adm1266_gpio_get_multiple()は、呼び出し元が提供するマスクのPDIO部分を以下のようにイテレートしています。for_each_set_bit_from(gpio_nr, mask, ADM1266_GPIO_NR + ADM1266_PDIO_STATUS) { ...}ここでADM1266_PDIO_STATUSはPMBusコマンドコード(0xE9、すなわち233)であり、PDIOピンの数ではありません。想定されている上限はADM1266_GPIO_NR + ADM1266_PDIO_NR = 25です。gpiolibはgc.ngpioのサイズに合わせたマスク(このチップでは25ビット)を渡すため、イテレーションはfind_next_bit()を最大242まで実行し、呼び出し元スタックのマスクの末尾を超えた217ビットまで(64ビット環境であれば4ワード、32ビット環境であれば7ワードのunsigned longに相当)読み取ります。その範囲内の偶発的にセットされたビットは、set_bit(gpio_nr, bits)の呼び出しを引き起こし、呼び出し元のbits配列の範囲外にも書き込んでしまいます。これらはいずれも境界外アクセスでした。この問題は、定数の代わりにADM1266_PDIO_NRを使用してスキャンを最後の実際のPDIOビットで停止させることで修正されました。
|