Linuxカーネルにおいて、以下の脆弱性が修正されました。usb: gadget: composite: USB_DT_OTGハンドラ内の無効な空チェックを修正しました。composite_setup()のOTGブランチでは、設定が選択されていない場合に最初の設定にフォールバックします。```if (cdev->config) config = cdev->config;else config = list_first_entry(&cdev->configs, struct usb_configuration, list);if (!config) goto done;...memcpy(req->buf, config->descriptors[0], value);```list_first_entry()はNULLを返しません。空のリストではリストヘッドのcontainer_of()を返します。したがって、"if (!config)"のチェックは意味を成しません。cdev->configsが空の場合、configはstruct usb_composite_dev内のヘッドを指します。config->descriptors[0]はそのオフセットに存在するデータを読み取り、その内容をmemcpyでw_lengthバイト分レスポンスバッファにコピーします。cdev->configsが空になるケースは2つあります。1つは、コントロール転送が進行中にガジェットのunbindでteardownレースが発生する場合、もう1つは設定を追加する前にis_otgが設定されているドライバーの場合です。cdev->configsを空のままにすると、このブランチでKASANフォルトが発生します。この問題を解決するために、list_first_entry_or_null()を使用し、既存のチェックが正しく機能するよう修正しました。
|