| From bippy-5f407fcff5a0 Mon Sep 17 00:00:00 2001 |
| From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| To: <linux-cve-announce@vger.kernel.org> |
| Reply-to: <cve@kernel.org>, <linux-kernel@vger.kernel.org> |
| Subject: CVE-2024-35969: ipv6: fix race condition between ipv6_get_ifaddr and ipv6_del_addr |
| |
| Description |
| =========== |
| |
| In the Linux kernel, the following vulnerability has been resolved: |
| |
| ipv6: fix race condition between ipv6_get_ifaddr and ipv6_del_addr |
| |
| Although ipv6_get_ifaddr walks inet6_addr_lst under the RCU lock, it |
| still means hlist_for_each_entry_rcu can return an item that got removed |
| from the list. The memory itself of such item is not freed thanks to RCU |
| but nothing guarantees the actual content of the memory is sane. |
| |
| In particular, the reference count can be zero. This can happen if |
| ipv6_del_addr is called in parallel. ipv6_del_addr removes the entry |
| from inet6_addr_lst (hlist_del_init_rcu(&ifp->addr_lst)) and drops all |
| references (__in6_ifa_put(ifp) + in6_ifa_put(ifp)). With bad enough |
| timing, this can happen: |
| |
| 1. In ipv6_get_ifaddr, hlist_for_each_entry_rcu returns an entry. |
| |
| 2. Then, the whole ipv6_del_addr is executed for the given entry. The |
| reference count drops to zero and kfree_rcu is scheduled. |
| |
| 3. ipv6_get_ifaddr continues and tries to increments the reference count |
| (in6_ifa_hold). |
| |
| 4. The rcu is unlocked and the entry is freed. |
| |
| 5. The freed entry is returned. |
| |
| Prevent increasing of the reference count in such case. The name |
| in6_ifa_hold_safe is chosen to mimic the existing fib6_info_hold_safe. |
| |
| [ 41.506330] refcount_t: addition on 0; use-after-free. |
| [ 41.506760] WARNING: CPU: 0 PID: 595 at lib/refcount.c:25 refcount_warn_saturate+0xa5/0x130 |
| [ 41.507413] Modules linked in: veth bridge stp llc |
| [ 41.507821] CPU: 0 PID: 595 Comm: python3 Not tainted 6.9.0-rc2.main-00208-g49563be82afa #14 |
| [ 41.508479] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996) |
| [ 41.509163] RIP: 0010:refcount_warn_saturate+0xa5/0x130 |
| [ 41.509586] Code: ad ff 90 0f 0b 90 90 c3 cc cc cc cc 80 3d c0 30 ad 01 00 75 a0 c6 05 b7 30 ad 01 01 90 48 c7 c7 38 cc 7a 8c e8 cc 18 ad ff 90 <0f> 0b 90 90 c3 cc cc cc cc 80 3d 98 30 ad 01 00 0f 85 75 ff ff ff |
| [ 41.510956] RSP: 0018:ffffbda3c026baf0 EFLAGS: 00010282 |
| [ 41.511368] RAX: 0000000000000000 RBX: ffff9e9c46914800 RCX: 0000000000000000 |
| [ 41.511910] RDX: ffff9e9c7ec29c00 RSI: ffff9e9c7ec1c900 RDI: ffff9e9c7ec1c900 |
| [ 41.512445] RBP: ffff9e9c43660c9c R08: 0000000000009ffb R09: 00000000ffffdfff |
| [ 41.512998] R10: 00000000ffffdfff R11: ffffffff8ca58a40 R12: ffff9e9c4339a000 |
| [ 41.513534] R13: 0000000000000001 R14: ffff9e9c438a0000 R15: ffffbda3c026bb48 |
| [ 41.514086] FS: 00007fbc4cda1740(0000) GS:ffff9e9c7ec00000(0000) knlGS:0000000000000000 |
| [ 41.514726] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 |
| [ 41.515176] CR2: 000056233b337d88 CR3: 000000000376e006 CR4: 0000000000370ef0 |
| [ 41.515713] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 |
| [ 41.516252] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 |
| [ 41.516799] Call Trace: |
| [ 41.517037] <TASK> |
| [ 41.517249] ? __warn+0x7b/0x120 |
| [ 41.517535] ? refcount_warn_saturate+0xa5/0x130 |
| [ 41.517923] ? report_bug+0x164/0x190 |
| [ 41.518240] ? handle_bug+0x3d/0x70 |
| [ 41.518541] ? exc_invalid_op+0x17/0x70 |
| [ 41.520972] ? asm_exc_invalid_op+0x1a/0x20 |
| [ 41.521325] ? refcount_warn_saturate+0xa5/0x130 |
| [ 41.521708] ipv6_get_ifaddr+0xda/0xe0 |
| [ 41.522035] inet6_rtm_getaddr+0x342/0x3f0 |
| [ 41.522376] ? __pfx_inet6_rtm_getaddr+0x10/0x10 |
| [ 41.522758] rtnetlink_rcv_msg+0x334/0x3d0 |
| [ 41.523102] ? netlink_unicast+0x30f/0x390 |
| [ 41.523445] ? __pfx_rtnetlink_rcv_msg+0x10/0x10 |
| [ 41.523832] netlink_rcv_skb+0x53/0x100 |
| [ 41.524157] netlink_unicast+0x23b/0x390 |
| [ 41.524484] netlink_sendmsg+0x1f2/0x440 |
| [ 41.524826] __sys_sendto+0x1d8/0x1f0 |
| [ 41.525145] __x64_sys_sendto+0x1f/0x30 |
| [ 41.525467] do_syscall_64+0xa5/0x1b0 |
| [ 41.525794] entry_SYSCALL_64_after_hwframe+0x72/0x7a |
| [ 41.526213] RIP: 0033:0x7fbc4cfcea9a |
| [ 41.526528] Code: d8 64 89 02 48 c7 c0 ff ff ff ff eb b8 0f 1f 00 f3 0f 1e fa 41 89 ca 64 8b 04 25 18 00 00 00 85 c0 75 15 b8 2c 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 7e c3 0f 1f 44 00 00 41 54 48 83 ec 30 44 89 |
| [ 41.527942] RSP: 002b:00007ffcf54012a8 EFLAGS: 00000246 ORIG_RAX: 000000000000002c |
| [ 41.528593] RAX: ffffffffffffffda RBX: 00007ffcf5401368 RCX: 00007fbc4cfcea9a |
| [ 41.529173] RDX: 000000000000002c RSI: 00007fbc4b9d9bd0 RDI: 0000000000000005 |
| [ 41.529786] RBP: 00007fbc4bafb040 R08: 00007ffcf54013e0 R09: 000000000000000c |
| [ 41.530375] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 |
| [ 41.530977] R13: ffffffffc4653600 R14: 0000000000000001 R15: 00007fbc4ca85d1b |
| [ 41.531573] </TASK> |
| |
| The Linux kernel CVE team has assigned CVE-2024-35969 to this issue. |
| |
| |
| Affected and fixed versions |
| =========================== |
| |
| Issue introduced in 2.6.35 with commit 5c578aedcb21d79eeb4e9cf04ca5b276ac82614c and fixed in 4.19.313 with commit b4b3b69a19016d4e7fbdbd1dbcc184915eb862e1 |
| Issue introduced in 2.6.35 with commit 5c578aedcb21d79eeb4e9cf04ca5b276ac82614c and fixed in 5.4.275 with commit cca606e14264098cba65efa82790825dbf69e903 |
| Issue introduced in 2.6.35 with commit 5c578aedcb21d79eeb4e9cf04ca5b276ac82614c and fixed in 5.10.216 with commit 3fb02ec57ead2891a2306af8c51a306bc5945e70 |
| Issue introduced in 2.6.35 with commit 5c578aedcb21d79eeb4e9cf04ca5b276ac82614c and fixed in 5.15.156 with commit 4b19e9507c275de0cfe61c24db69179dc52cf9fb |
| Issue introduced in 2.6.35 with commit 5c578aedcb21d79eeb4e9cf04ca5b276ac82614c and fixed in 6.1.87 with commit de76ae9ea1a6cf9e77fcec4f2df2904e26c23ceb |
| Issue introduced in 2.6.35 with commit 5c578aedcb21d79eeb4e9cf04ca5b276ac82614c and fixed in 6.6.28 with commit 01b11a0566670612bd464a932e5ac2eae53d8652 |
| Issue introduced in 2.6.35 with commit 5c578aedcb21d79eeb4e9cf04ca5b276ac82614c and fixed in 6.8.7 with commit 6cdb20c342cd0193d3e956e3d83981d0f438bb83 |
| Issue introduced in 2.6.35 with commit 5c578aedcb21d79eeb4e9cf04ca5b276ac82614c and fixed in 6.9 with commit 7633c4da919ad51164acbf1aa322cc1a3ead6129 |
| |
| Please see https://www.kernel.org for a full list of currently supported |
| kernel versions by the kernel community. |
| |
| Unaffected versions might change over time as fixes are backported to |
| older supported kernel versions. The official CVE entry at |
| https://cve.org/CVERecord/?id=CVE-2024-35969 |
| will be updated if fixes are backported, please check that for the most |
| up to date information about this issue. |
| |
| |
| Affected files |
| ============== |
| |
| The file(s) affected by this issue are: |
| include/net/addrconf.h |
| net/ipv6/addrconf.c |
| |
| |
| Mitigation |
| ========== |
| |
| The Linux kernel CVE team recommends that you update to the latest |
| stable kernel version for this, and many other bugfixes. Individual |
| changes are never tested alone, but rather are part of a larger kernel |
| release. Cherry-picking individual commits is not recommended or |
| supported by the Linux kernel community at all. If however, updating to |
| the latest release is impossible, the individual changes to resolve this |
| issue can be found at these commits: |
| https://git.kernel.org/stable/c/b4b3b69a19016d4e7fbdbd1dbcc184915eb862e1 |
| https://git.kernel.org/stable/c/cca606e14264098cba65efa82790825dbf69e903 |
| https://git.kernel.org/stable/c/3fb02ec57ead2891a2306af8c51a306bc5945e70 |
| https://git.kernel.org/stable/c/4b19e9507c275de0cfe61c24db69179dc52cf9fb |
| https://git.kernel.org/stable/c/de76ae9ea1a6cf9e77fcec4f2df2904e26c23ceb |
| https://git.kernel.org/stable/c/01b11a0566670612bd464a932e5ac2eae53d8652 |
| https://git.kernel.org/stable/c/6cdb20c342cd0193d3e956e3d83981d0f438bb83 |
| https://git.kernel.org/stable/c/7633c4da919ad51164acbf1aa322cc1a3ead6129 |