Patch "ath10k: check idx validity in __ath10k_htt_rx_ring_fill_n()" has been added to the 4.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    ath10k: check idx validity in __ath10k_htt_rx_ring_fill_n()

to the 4.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     ath10k-check-idx-validity-in-__ath10k_htt_rx_ring_fi.patch
and it can be found in the queue-4.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 3bbf19b19cf845ec4f65b37e46660e0c0ababe27
Author: Zekun Shen <bruceshenzk@xxxxxxxxx>
Date:   Tue Jun 23 18:11:05 2020 -0400

    ath10k: check idx validity in __ath10k_htt_rx_ring_fill_n()
    
    [ Upstream commit bad60b8d1a7194df38fd7fe4b22f3f4dcf775099 ]
    
    The idx in __ath10k_htt_rx_ring_fill_n function lives in
    consistent dma region writable by the device. Malfunctional
    or malicious device could manipulate such idx to have a OOB
    write. Either by
        htt->rx_ring.netbufs_ring[idx] = skb;
    or by
        ath10k_htt_set_paddrs_ring(htt, paddr, idx);
    
    The idx can also be negative as it's signed, giving a large
    memory space to write to.
    
    It's possibly exploitable by corruptting a legit pointer with
    a skb pointer. And then fill skb with payload as rougue object.
    
    Part of the log here. Sometimes it appears as UAF when writing
    to a freed memory by chance.
    
     [   15.594376] BUG: unable to handle page fault for address: ffff887f5c1804f0
     [   15.595483] #PF: supervisor write access in kernel mode
     [   15.596250] #PF: error_code(0x0002) - not-present page
     [   15.597013] PGD 0 P4D 0
     [   15.597395] Oops: 0002 [#1] SMP KASAN PTI
     [   15.597967] CPU: 0 PID: 82 Comm: kworker/u2:2 Not tainted 5.6.0 #69
     [   15.598843] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996),
     BIOS rel-1.12.1-0-ga5cab58e9a3f-prebuilt.qemu.org 04/01/2014
     [   15.600438] Workqueue: ath10k_wq ath10k_core_register_work [ath10k_core]
     [   15.601389] RIP: 0010:__ath10k_htt_rx_ring_fill_n
     (linux/drivers/net/wireless/ath/ath10k/htt_rx.c:173) ath10k_core
    
    Signed-off-by: Zekun Shen <bruceshenzk@xxxxxxxxx>
    Signed-off-by: Kalle Valo <kvalo@xxxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20200623221105.3486-1-bruceshenzk@xxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c
index a65b5d7f59f44..1c6c422dbad64 100644
--- a/drivers/net/wireless/ath/ath10k/htt_rx.c
+++ b/drivers/net/wireless/ath/ath10k/htt_rx.c
@@ -99,6 +99,14 @@ static int __ath10k_htt_rx_ring_fill_n(struct ath10k_htt *htt, int num)
 	BUILD_BUG_ON(HTT_RX_RING_FILL_LEVEL >= HTT_RX_RING_SIZE / 2);
 
 	idx = __le32_to_cpu(*htt->rx_ring.alloc_idx.vaddr);
+
+	if (idx < 0 || idx >= htt->rx_ring.size) {
+		ath10k_err(htt->ar, "rx ring index is not valid, firmware malfunctioning?\n");
+		idx &= htt->rx_ring.size_mask;
+		ret = -ENOMEM;
+		goto fail;
+	}
+
 	while (num > 0) {
 		skb = dev_alloc_skb(HTT_RX_BUF_SIZE + HTT_RX_DESC_ALIGN);
 		if (!skb) {



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux