Linuxカーネルにおいて、以下の脆弱性が修正されました。入力:synaptics-rmi4 - F3Aキー配列をGPIOカウントに制限。rmi_f3a_initialize() はデバイスのクエリレジスタからGPIOカウントを取得します(f3a->gpio_count = buf & RMI_F3A_GPIO_COUNT、範囲0〜127)。rmi_f3a_map_gpios() は min(gpio_count, TRACKSTICK_RANGE_END) の最大6エントリでgpio_key_mapを割り当てますが、rmi_f3a_attention() は全gpio_count分ループ処理を行い、gpio_key_map[i] への参照を行います。また、input->keycodemax は全gpio_countに設定されますが、input->keycode は6エントリの割り当てを指しています。したがって、gpio_count > 6を報告するデバイスでは、各attention割り込み時にgpio_key_map[]の境界外読み取りが発生し、さらにinputコアのデフォルトキー配列ioctlによる境界外アクセスも発生します。EVIOCGKEYCODEはバッファを超えて読み込み(隣接するスラブメモリがユーザ空間に漏洩し)、EVIOCSKEYCODEは呼び出し元制御の値をバッファの先に書き込み可能です。これはevdevノードを開ける任意のプロセスで起こります。理由は、input_default_getkeycode()とinput_default_setkeycode()がインデックスをkeycodemaxのみで制限しているためです。対策として、keymapのサイズを全gpio_count分確保するようにしました。割り当てループ自体は変更されておらず、最初の min(gpio_count, TRACKSTICK_RANGE_END) エントリのみ割り当て、それ以降のスロットはKEY_RESERVED(devm_kcallocによるゼロ初期化)となり、レポート時にはスキップされます。
|