In the Linux kernel, the following vulnerability has been resolved:
wifi: ath9k: hifusb: fix memory leak of remainskbs
hifdev->remainskb is allocated and used exclusively in ath9khifusbrxstream(). It is implied that an allocated remainskb is processed and subsequently freed (in error paths) only during the next call of ath9khifusbrx_stream().
So, if the urbs are deallocated between those two calls due to the device deinitialization or suspend, it is possible that ath9khifusbrxstream() is not called next time and the allocated remain_skb is leaked. Our local Syzkaller instance was able to trigger that.
remainskb makes sense when receiving two consecutive urbs which are logically linked together, i.e. a specific data field from the first skb indicates a cached skb to be allocated, memcpy'd with some data and subsequently processed in the next call to ath9khifusbrx_stream(). Urbs deallocation supposedly makes that link irrelevant so we need to free the cached skb in those cases.
Fix the leak by introducing a function to explicitly free remainskb (if it is not NULL) when the rx urbs have been deallocated. remainskb is NULL when it has not been allocated at all (hifdev struct is kzalloced) or when it has been processed in next call to ath9khifusbrx_stream().
Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
[
{
"signature_type": "Function",
"digest": {
"function_hash": "187906034876744822512945628401597683104",
"length": 82.0
},
"target": {
"file": "drivers/net/wireless/ath/ath9k/hif_usb.c",
"function": "ath9k_hif_usb_dealloc_rx_urbs"
},
"signature_version": "v1",
"id": "CVE-2023-53641-078f1141",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@6719e3797ec52cd144c8a5ba8aaab36674800585"
},
{
"signature_type": "Line",
"digest": {
"threshold": 0.9,
"line_hashes": [
"79969352656014705010633952037334434990",
"263500362052894355024796376216001898015",
"119240683863575268928610695057997577035",
"73206644926233212247936216313893418902",
"238662755334950147153500489630304325484",
"276785648452762776356190436196739485855",
"288926245519085411067895542010788132143"
]
},
"target": {
"file": "drivers/net/wireless/ath/ath9k/hif_usb.c"
},
"signature_version": "v1",
"id": "CVE-2023-53641-0bae0072",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@d9899318660791141ea6002fda5577b2c5d7386e"
},
{
"signature_type": "Line",
"digest": {
"threshold": 0.9,
"line_hashes": [
"79969352656014705010633952037334434990",
"263500362052894355024796376216001898015",
"119240683863575268928610695057997577035",
"73206644926233212247936216313893418902",
"238662755334950147153500489630304325484",
"276785648452762776356190436196739485855",
"288926245519085411067895542010788132143"
]
},
"target": {
"file": "drivers/net/wireless/ath/ath9k/hif_usb.c"
},
"signature_version": "v1",
"id": "CVE-2023-53641-27a48a6b",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@8f02d538878c9b1501f624595eb22ee4e5e0ff84"
},
{
"signature_type": "Function",
"digest": {
"function_hash": "187906034876744822512945628401597683104",
"length": 82.0
},
"target": {
"file": "drivers/net/wireless/ath/ath9k/hif_usb.c",
"function": "ath9k_hif_usb_dealloc_rx_urbs"
},
"signature_version": "v1",
"id": "CVE-2023-53641-49a82814",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@7654cc03eb699297130b693ec34e25f77b17c947"
},
{
"signature_type": "Function",
"digest": {
"function_hash": "187906034876744822512945628401597683104",
"length": 82.0
},
"target": {
"file": "drivers/net/wireless/ath/ath9k/hif_usb.c",
"function": "ath9k_hif_usb_dealloc_rx_urbs"
},
"signature_version": "v1",
"id": "CVE-2023-53641-6115a574",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@9b9356a3014123f0ce4b50d9278c1265173150ab"
},
{
"signature_type": "Function",
"digest": {
"function_hash": "187906034876744822512945628401597683104",
"length": 82.0
},
"target": {
"file": "drivers/net/wireless/ath/ath9k/hif_usb.c",
"function": "ath9k_hif_usb_dealloc_rx_urbs"
},
"signature_version": "v1",
"id": "CVE-2023-53641-65f0a062",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@f0931fc8f4b6847c72e170d2326861c0a081d680"
},
{
"signature_type": "Line",
"digest": {
"threshold": 0.9,
"line_hashes": [
"79969352656014705010633952037334434990",
"263500362052894355024796376216001898015",
"119240683863575268928610695057997577035",
"73206644926233212247936216313893418902",
"238662755334950147153500489630304325484",
"276785648452762776356190436196739485855",
"288926245519085411067895542010788132143"
]
},
"target": {
"file": "drivers/net/wireless/ath/ath9k/hif_usb.c"
},
"signature_version": "v1",
"id": "CVE-2023-53641-72b5d41a",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@320d760a35273aa815d58b57e4fd9ba5279a3489"
},
{
"signature_type": "Function",
"digest": {
"function_hash": "187906034876744822512945628401597683104",
"length": 82.0
},
"target": {
"file": "drivers/net/wireless/ath/ath9k/hif_usb.c",
"function": "ath9k_hif_usb_dealloc_rx_urbs"
},
"signature_version": "v1",
"id": "CVE-2023-53641-7afc4a1d",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@59073060fe0950c6ecbe12bdc06469dcac62128d"
},
{
"signature_type": "Line",
"digest": {
"threshold": 0.9,
"line_hashes": [
"79969352656014705010633952037334434990",
"263500362052894355024796376216001898015",
"119240683863575268928610695057997577035",
"73206644926233212247936216313893418902",
"238662755334950147153500489630304325484",
"276785648452762776356190436196739485855",
"288926245519085411067895542010788132143"
]
},
"target": {
"file": "drivers/net/wireless/ath/ath9k/hif_usb.c"
},
"signature_version": "v1",
"id": "CVE-2023-53641-829d3ed3",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@7654cc03eb699297130b693ec34e25f77b17c947"
},
{
"signature_type": "Function",
"digest": {
"function_hash": "187906034876744822512945628401597683104",
"length": 82.0
},
"target": {
"file": "drivers/net/wireless/ath/ath9k/hif_usb.c",
"function": "ath9k_hif_usb_dealloc_rx_urbs"
},
"signature_version": "v1",
"id": "CVE-2023-53641-8d47e545",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@d9899318660791141ea6002fda5577b2c5d7386e"
},
{
"signature_type": "Line",
"digest": {
"threshold": 0.9,
"line_hashes": [
"79969352656014705010633952037334434990",
"263500362052894355024796376216001898015",
"119240683863575268928610695057997577035",
"73206644926233212247936216313893418902",
"238662755334950147153500489630304325484",
"276785648452762776356190436196739485855",
"288926245519085411067895542010788132143"
]
},
"target": {
"file": "drivers/net/wireless/ath/ath9k/hif_usb.c"
},
"signature_version": "v1",
"id": "CVE-2023-53641-9305e96d",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@59073060fe0950c6ecbe12bdc06469dcac62128d"
},
{
"signature_type": "Function",
"digest": {
"function_hash": "187906034876744822512945628401597683104",
"length": 82.0
},
"target": {
"file": "drivers/net/wireless/ath/ath9k/hif_usb.c",
"function": "ath9k_hif_usb_dealloc_rx_urbs"
},
"signature_version": "v1",
"id": "CVE-2023-53641-c3a645d2",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@320d760a35273aa815d58b57e4fd9ba5279a3489"
},
{
"signature_type": "Line",
"digest": {
"threshold": 0.9,
"line_hashes": [
"79969352656014705010633952037334434990",
"263500362052894355024796376216001898015",
"119240683863575268928610695057997577035",
"73206644926233212247936216313893418902",
"238662755334950147153500489630304325484",
"276785648452762776356190436196739485855",
"288926245519085411067895542010788132143"
]
},
"target": {
"file": "drivers/net/wireless/ath/ath9k/hif_usb.c"
},
"signature_version": "v1",
"id": "CVE-2023-53641-c537dea1",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@f0931fc8f4b6847c72e170d2326861c0a081d680"
},
{
"signature_type": "Line",
"digest": {
"threshold": 0.9,
"line_hashes": [
"79969352656014705010633952037334434990",
"263500362052894355024796376216001898015",
"119240683863575268928610695057997577035",
"73206644926233212247936216313893418902",
"238662755334950147153500489630304325484",
"276785648452762776356190436196739485855",
"288926245519085411067895542010788132143"
]
},
"target": {
"file": "drivers/net/wireless/ath/ath9k/hif_usb.c"
},
"signature_version": "v1",
"id": "CVE-2023-53641-e24bfde8",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@9b9356a3014123f0ce4b50d9278c1265173150ab"
},
{
"signature_type": "Line",
"digest": {
"threshold": 0.9,
"line_hashes": [
"79969352656014705010633952037334434990",
"263500362052894355024796376216001898015",
"119240683863575268928610695057997577035",
"73206644926233212247936216313893418902",
"238662755334950147153500489630304325484",
"276785648452762776356190436196739485855",
"288926245519085411067895542010788132143"
]
},
"target": {
"file": "drivers/net/wireless/ath/ath9k/hif_usb.c"
},
"signature_version": "v1",
"id": "CVE-2023-53641-f0671319",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@6719e3797ec52cd144c8a5ba8aaab36674800585"
},
{
"signature_type": "Function",
"digest": {
"function_hash": "187906034876744822512945628401597683104",
"length": 82.0
},
"target": {
"file": "drivers/net/wireless/ath/ath9k/hif_usb.c",
"function": "ath9k_hif_usb_dealloc_rx_urbs"
},
"signature_version": "v1",
"id": "CVE-2023-53641-f2abd4f1",
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@8f02d538878c9b1501f624595eb22ee4e5e0ff84"
}
]