CVE-2024-26996

Source
https://cve.org/CVERecord?id=CVE-2024-26996
Import Source
https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2024-26996.json
JSON Data
https://api.osv.dev/v1/vulns/CVE-2024-26996
Downstream
Related
Published
2024-05-01T05:28:16.652Z
Modified
2026-03-14T12:27:43.844545Z
Summary
usb: gadget: f_ncm: Fix UAF ncm object at re-bind after usb ep transport error
Details

In the Linux kernel, the following vulnerability has been resolved:

usb: gadget: f_ncm: Fix UAF ncm object at re-bind after usb ep transport error

When ncm function is working and then stop usb0 interface for link down, ethstop() is called. At this piont, accidentally if usb transport error should happen in usbepenable(), 'inep' and/or 'out_ep' may not be enabled.

After that, ncmdisable() is called to disable for ncm unbind but getherdisconnect() is never called since 'in_ep' is not enabled.

As the result, ncm object is released in ncm unbind but 'dev->port_usb' associated to 'ncm->port' is not NULL.

And when ncm bind again to recover netdev, ncm object is reallocated but usb0 interface is already associated to previous released ncm object.

Therefore, once usb0 interface is up and ethstartxmit() is called, released ncm object is dereferrenced and it might cause use-after-free memory.

[function unlink via configfs] usb0: ethstop dev->portusb=ffffff9b179c3200 --> error happens in usbepenable(). NCM: ncmdisable: ncm=ffffff9b179c3200 --> no getherdisconnect() since ncm->port.inep->enabled is false. NCM: ncmunbind: ncm unbind ncm=ffffff9b179c3200 NCM: ncm_free: ncm free ncm=ffffff9b179c3200 <-- released ncm

[function link via configfs] NCM: ncmalloc: ncm alloc ncm=ffffff9ac4f8a000 NCM: ncmbind: ncm bind ncm=ffffff9ac4f8a000 NCM: ncmsetalt: ncm=ffffff9ac4f8a000 alt=0 usb0: ethopen dev->portusb=ffffff9b179c3200 <-- previous released ncm usb0: ethstart dev->portusb=ffffff9b179c3200 <-- ethstartxmit() --> dev->wrap() Unable to handle kernel paging request at virtual address dead00000000014f

This patch addresses the issue by checking if 'ncm->netdev' is not NULL at ncmdisable() to call getherdisconnect() to deassociate 'dev->portusb'. It's more reasonable to check 'ncm->netdev' to call getherconnect/disconnect rather than check 'ncm->port.in_ep->enabled' since it might not be enabled but the gether connection might be established.

Database specific
{
    "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2024/26xxx/CVE-2024-26996.json",
    "cna_assigner": "Linux"
}
References

Affected packages

Git / git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

Affected ranges

Type
GIT
Repo
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
Events
Introduced
6b4012a2e4d4702f8fb0ee1db1c0f0b17ab7d41b
Fixed
7f67c2020cb08499c400abf0fc32c65e4d9a09ca
Fixed
0588bbbd718a8130b98c54518f1e0b569ce60a93
Fixed
f356fd0cbd9c9cbd0854657a80d1608d0d732db3
Fixed
7250326cbb1f4f90391ac511a126b936cefb5bb7
Fixed
6334b8e4553cc69f51e383c9de545082213d785e

Database specific

source
"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2024-26996.json"