在Linux內核4.19.6以前,本地用戶能夠經過在Sound / USB /card.c.的usb_audio_probe中錯誤處理一個惡意USB聲音設備(沒有接口)來利用ALSA驅動程序中的一個UAF。若是USB聲卡報告0個接口,將觸發一個錯誤條件,函數usb_audio_probe錯誤輸出。在錯誤路徑中,存在一個在空閒後使用的漏洞,即首先釋放卡的內存對象,而後減小活動芯片的數量。將減量移動到atomic_dec之上能夠修復UAF。linux
diff --git a/sound/usb/card.c b/sound/usb/card.c index 2bfe4e8..a105947 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c @@ -682,9 +682,12 @@ static int usb_audio_probe(struct usb_interface *intf, __error: if (chip) { + /* chip->active is inside the chip->card object, + * decrement before memory is possibly returned. + */ + atomic_dec(&chip->active); if (!chip->num_interfaces) snd_card_free(chip->card); - atomic_dec(&chip->active); } mutex_unlock(®ister_mutex); return err;
只是將atomic_dec(&chip->active)這個函數移動了一個位置。UAF出在snd_card_free之中。這個漏洞貌似仍是比較容易理解,一般咱們編寫程序的時候都會注意到,退出路徑中,先減小索引,若是索引爲0則釋放對象。可是這裏卻能夠直接進入釋放階段,只要chip->num_interfaces爲0。根據這個函數的註釋,在音頻設備中若是有過個控制接口這個函數會被調用屢次。那這個意思就是應該當作USB總線上鏈接多個不一樣的設備ide