CVE-2020-36789
Severity CVSS v4.0:
Pending analysis
Type:
CWE-476
NULL Pointer Dereference
Publication date:
17/04/2025
Last modified:
29/04/2025
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
can: dev: can_get_echo_skb(): prevent call to kfree_skb() in hard IRQ context<br />
<br />
If a driver calls can_get_echo_skb() during a hardware IRQ (which is often, but<br />
not always, the case), the &#39;WARN_ON(in_irq)&#39; in<br />
net/core/skbuff.c#skb_release_head_state() might be triggered, under network<br />
congestion circumstances, together with the potential risk of a NULL pointer<br />
dereference.<br />
<br />
The root cause of this issue is the call to kfree_skb() instead of<br />
dev_kfree_skb_irq() in net/core/dev.c#enqueue_to_backlog().<br />
<br />
This patch prevents the skb to be freed within the call to netif_rx() by<br />
incrementing its reference count with skb_get(). The skb is finally freed by<br />
one of the in-irq-context safe functions: dev_consume_skb_any() or<br />
dev_kfree_skb_any(). The "any" version is used because some drivers might call<br />
can_get_echo_skb() in a normal context.<br />
<br />
The reason for this issue to occur is that initially, in the core network<br />
stack, loopback skb were not supposed to be received in hardware IRQ context.<br />
The CAN stack is an exeption.<br />
<br />
This bug was previously reported back in 2017 in [1] but the proposed patch<br />
never got accepted.<br />
<br />
While [1] directly modifies net/core/dev.c, we try to propose here a<br />
smoother modification local to CAN network stack (the assumption<br />
behind is that only CAN devices are affected by this issue).<br />
<br />
[1] http://lore.kernel.org/r/57a3ffb6-3309-3ad5-5a34-e93c3fe3614d@cetitec.com
Impact
Base Score 3.x
5.50
Severity 3.x
MEDIUM
Vulnerable products and versions
CPE | From | Up to |
---|---|---|
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 2.6.31 (including) | 4.4.244 (excluding) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.5 (including) | 4.9.244 (excluding) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.10 (including) | 4.14.207 (excluding) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.15 (including) | 4.19.158 (excluding) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.20 (including) | 5.4.78 (excluding) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.5 (including) | 5.9.9 (excluding) |
cpe:2.3:o:linux:linux_kernel:5.10:rc1:*:*:*:*:*:* | ||
cpe:2.3:o:linux:linux_kernel:5.10:rc2:*:*:*:*:*:* |
To consult the complete list of CPE names with products and versions, see this page
References to Advisories, Solutions, and Tools
- https://git.kernel.org/stable/c/2283f79b22684d2812e5c76fc2280aae00390365
- https://git.kernel.org/stable/c/248b71ce92d4f3a574b2537f9838f48e892618f4
- https://git.kernel.org/stable/c/3a922a85701939624484e7f2fd07d32beed00d25
- https://git.kernel.org/stable/c/451187b20431924d13fcfecc500d7cd2d9951bac
- https://git.kernel.org/stable/c/7e4cf2ec0ca236c3e5f904239cec6efe1f3baf22
- https://git.kernel.org/stable/c/87530b557affe01c764de32dbeb58cdf47234574
- https://git.kernel.org/stable/c/ab46748bf98864f9c3f5559060bf8caf9df2b41e