• Duoming Zhou's avatar
    ax25: Fix refcount leaks caused by ax25_cb_del() · 9fd75b66
    Duoming Zhou authored
    The previous commit d01ffb9e ("ax25: add refcount in ax25_dev to
    avoid UAF bugs") and commit feef318c ("ax25: fix UAF bugs of
    net_device caused by rebinding operation") increase the refcounts of
    ax25_dev and net_device in ax25_bind() and decrease the matching refcounts
    in ax25_kill_by_device() in order to prevent UAF bugs, but there are
    reference count leaks.
    
    The root cause of refcount leaks is shown below:
    
         (Thread 1)                      |      (Thread 2)
    ax25_bind()                          |
     ...                                 |
     ax25_addr_ax25dev()                 |
      ax25_dev_hold()   //(1)            |
      ...                                |
     dev_hold_track()   //(2)            |
     ...                                 | ax25_destroy_socket()
                                         |  ax25_cb_del()
                                         |   ...
                                         |   hlist_del_init() //(3)
                                         |
                                         |
         (Thread 3)                      |
    ax25_kill_by_device()                |
     ...                                 |
     ax25_for_each(s, &ax25_list) {      |
      if (s->ax25_dev == ax25_dev) //(4) |
       ...                               |
    
    Firstly, we use ax25_bind() to increase the refcount of ax25_dev in
    position (1) and increase the refcount of net_device in position (2).
    Then, we use ax25_cb_del() invoked by ax25_destroy_socket() to delete
    ax25_cb in hlist in position (3) before calling ax25_kill_by_device().
    Finally, the decrements of refcounts in ax25_kill_by_device() will not
    be executed, because no s->ax25_dev equals to ax25_dev in position (4).
    
    This patch adds decrements of refcounts in ax25_release() and use
    lock_sock() to do synchronization. If refcounts decrease in ax25_release(),
    the decrements of refcounts in ax25_kill_by_device() will not be
    executed and vice versa.
    
    Fixes: d01ffb9e ("ax25: add refcount in ax25_dev to avoid UAF bugs")
    Fixes: 87563a04 ("ax25: fix reference count leaks of ax25_dev")
    Fixes: feef318c ("ax25: fix UAF bugs of net_device caused by rebinding operation")
    Reported-by: default avatarThomas Osterried <thomas@osterried.de>
    Signed-off-by: default avatarDuoming Zhou <duoming@zju.edu.cn>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    9fd75b66
af_ax25.c 44.5 KB