Skip to content
  • Jim Lin's avatar
    usb: gadget: configfs: Fix KASAN use-after-free · 98f153a1
    Jim Lin authored
    
    
    When gadget is disconnected, running sequence is like this.
    . composite_disconnect
    . Call trace:
      usb_string_copy+0xd0/0x128
      gadget_config_name_configuration_store+0x4
      gadget_config_name_attr_store+0x40/0x50
      configfs_write_file+0x198/0x1f4
      vfs_write+0x100/0x220
      SyS_write+0x58/0xa8
    . configfs_composite_unbind
    . configfs_composite_bind
    
    In configfs_composite_bind, it has
    "cn->strings.s = cn->configuration;"
    
    When usb_string_copy is invoked. it would
    allocate memory, copy input string, release previous pointed memory space,
    and use new allocated memory.
    
    When gadget is connected, host sends down request to get information.
    Call trace:
      usb_gadget_get_string+0xec/0x168
      lookup_string+0x64/0x98
      composite_setup+0xa34/0x1ee8
    
    If gadget is disconnected and connected quickly, in the failed case,
    cn->configuration memory has been released by usb_string_copy kfree but
    configfs_composite_bind hasn't been run in time to assign new allocated
    "cn->configuration" pointer to "cn->strings.s".
    
    When "strlen(s->s) of usb_gadget_get_string is being executed, the dangling
    memory is accessed, "BUG: KASAN: use-after-free" error occurs.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarJim Lin <jilin@nvidia.com>
    Signed-off-by: default avatarMacpaul Lin <macpaul.lin@mediatek.com>
    Link: https://lore.kernel.org/r/1615444961-13376-1-git-send-email-macpaul.lin@mediatek.com
    
    
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    98f153a1