Patch "drivers: hamradio: 6pack: fix UAF bug caused by mod_timer()" has been added to the 5.16-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

    drivers: hamradio: 6pack: fix UAF bug caused by mod_timer()

to the 5.16-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:
     drivers-hamradio-6pack-fix-uaf-bug-caused-by-mod_tim.patch
and it can be found in the queue-5.16 subdirectory.

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



commit 7ed07b83b56c4463a56c6ab9cfe76a6b39e0c1cd
Author: Duoming Zhou <duoming@xxxxxxxxxx>
Date:   Thu Feb 17 09:43:03 2022 +0800

    drivers: hamradio: 6pack: fix UAF bug caused by mod_timer()
    
    [ Upstream commit efe4186e6a1b54bf38b9e05450d43b0da1fd7739 ]
    
    When a 6pack device is detaching, the sixpack_close() will act to cleanup
    necessary resources. Although del_timer_sync() in sixpack_close()
    won't return if there is an active timer, one could use mod_timer() in
    sp_xmit_on_air() to wake up timer again by calling userspace syscall such
    as ax25_sendmsg(), ax25_connect() and ax25_ioctl().
    
    This unexpected waked handler, sp_xmit_on_air(), realizes nothing about
    the undergoing cleanup and may still call pty_write() to use driver layer
    resources that have already been released.
    
    One of the possible race conditions is shown below:
    
          (USE)                      |      (FREE)
    ax25_sendmsg()                   |
     ax25_queue_xmit()               |
      ...                            |
      sp_xmit()                      |
       sp_encaps()                   | sixpack_close()
        sp_xmit_on_air()             |  del_timer_sync(&sp->tx_t)
         mod_timer(&sp->tx_t,...)    |  ...
                                     |  unregister_netdev()
                                     |  ...
         (wait a while)              | tty_release()
                                     |  tty_release_struct()
                                     |   release_tty()
        sp_xmit_on_air()             |    tty_kref_put(tty_struct) //FREE
         pty_write(tty_struct) //USE |    ...
    
    The corresponding fail log is shown below:
    ===============================================================
    BUG: KASAN: use-after-free in __run_timers.part.0+0x170/0x470
    Write of size 8 at addr ffff88800a652ab8 by task swapper/2/0
    ...
    Call Trace:
      ...
      queue_work_on+0x3f/0x50
      pty_write+0xcd/0xe0pty_write+0xcd/0xe0
      sp_xmit_on_air+0xb2/0x1f0
      call_timer_fn+0x28/0x150
      __run_timers.part.0+0x3c2/0x470
      run_timer_softirq+0x3b/0x80
      __do_softirq+0xf1/0x380
      ...
    
    This patch reorders the del_timer_sync() after the unregister_netdev()
    to avoid UAF bugs. Because the unregister_netdev() is well synchronized,
    it flushs out any pending queues, waits the refcount of net_device
    decreases to zero and removes net_device from kernel. There is not any
    running routines after executing unregister_netdev(). Therefore, we could
    not arouse timer from userspace again.
    
    Signed-off-by: Duoming Zhou <duoming@xxxxxxxxxx>
    Reviewed-by: Lin Ma <linma@xxxxxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c
index 8a19a06b505d..ff2bb3d80fac 100644
--- a/drivers/net/hamradio/6pack.c
+++ b/drivers/net/hamradio/6pack.c
@@ -668,11 +668,11 @@ static void sixpack_close(struct tty_struct *tty)
 	 */
 	netif_stop_queue(sp->dev);
 
+	unregister_netdev(sp->dev);
+
 	del_timer_sync(&sp->tx_t);
 	del_timer_sync(&sp->resync_t);
 
-	unregister_netdev(sp->dev);
-
 	/* Free all 6pack frame buffers after unreg. */
 	kfree(sp->rbuff);
 	kfree(sp->xbuff);



[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