Goal Reached Thanks to every supporter — we hit 100%!

Goal: 1000 CNY · Raised: 1359 CNY

100%

CVE-2021-47209— sched/fair: Prevent dead task groups from regaining cfs_rq's

Quick assessment

Affected
Linux Linux
Exploitation
No confirmed in-the-wild exploitation; assess based on exposure
Recommended action
Check the vendor advisory and references for a fixed version. If immediate upgrade is impossible, restrict exposure and increase monitoring.

Linux kernel是美国Linux基金会的开源操作系统Linux所使用的内核。 Linux kernel存在安全漏洞,该漏洞源于函数update_blocked_averages存在释放后重用漏洞。

CVSS 7.8 · High EPSS 0.21% · P10

Affected Version Matrix 6

VendorProduct Version RangeStatus
Linux Linux a7b359fc6a37faaf472125867c8dc5a068c90982< 512e21c150c1c3ee298852660f3a796e267e62ec affected
a7b359fc6a37faaf472125867c8dc5a068c90982< b027789e5e50494c2325cc70c8642e7fd6059479 affected
5.13 affected
< 5.13 unaffected
5.15.5≤ 5.15.* unaffected
5.16≤ * unaffected
Get alerts for future matching vulnerabilities Log in to subscribe

I. Basic Information for CVE-2021-47209

Vulnerability Information

Have questions about the vulnerability? See if Shenlong's analysis helps!
View Shenlong Deep Dive ↗

Although we use advanced large model technology, its output may still contain inaccurate or outdated information.Shenlong tries to ensure data accuracy, but please verify and judge based on the actual situation.

Vulnerability Title
sched/fair: Prevent dead task groups from regaining cfs_rq's
Source: CVE Program / CVE List V5
Vulnerability Description
In the Linux kernel, the following vulnerability has been resolved: sched/fair: Prevent dead task groups from regaining cfs_rq's Kevin is reporting crashes which point to a use-after-free of a cfs_rq in update_blocked_averages(). Initial debugging revealed that we've live cfs_rq's (on_list=1) in an about to be kfree()'d task group in free_fair_sched_group(). However, it was unclear how that can happen. His kernel config happened to lead to a layout of struct sched_entity that put the 'my_q' member directly into the middle of the object which makes it incidentally overlap with SLUB's freelist pointer. That, in combination with SLAB_FREELIST_HARDENED's freelist pointer mangling, leads to a reliable access violation in form of a #GP which made the UAF fail fast. Michal seems to have run into the same issue[1]. He already correctly diagnosed that commit a7b359fc6a37 ("sched/fair: Correctly insert cfs_rq's to list on unthrottle") is causing the preconditions for the UAF to happen by re-adding cfs_rq's also to task groups that have no more running tasks, i.e. also to dead ones. His analysis, however, misses the real root cause and it cannot be seen from the crash backtrace only, as the real offender is tg_unthrottle_up() getting called via sched_cfs_period_timer() via the timer interrupt at an inconvenient time. When unregister_fair_sched_group() unlinks all cfs_rq's from the dying task group, it doesn't protect itself from getting interrupted. If the timer interrupt triggers while we iterate over all CPUs or after unregister_fair_sched_group() has finished but prior to unlinking the task group, sched_cfs_period_timer() will execute and walk the list of task groups, trying to unthrottle cfs_rq's, i.e. re-add them to the dying task group. These will later -- in free_fair_sched_group() -- be kfree()'ed while still being linked, leading to the fireworks Kevin and Michal are seeing. To fix this race, ensure the dying task group gets unlinked first. However, simply switching the order of unregistering and unlinking the task group isn't sufficient, as concurrent RCU walkers might still see it, as can be seen below: CPU1: CPU2: : timer IRQ: : do_sched_cfs_period_timer(): : : : distribute_cfs_runtime(): : rcu_read_lock(); : : : unthrottle_cfs_rq(): sched_offline_group(): : : walk_tg_tree_from(…,tg_unthrottle_up,…): list_del_rcu(&tg->list); : (1) : list_for_each_entry_rcu(child, &parent->children, siblings) : : (2) list_del_rcu(&tg->siblings); : : tg_unthrottle_up(): unregister_fair_sched_group(): struct cfs_rq *cfs_rq = tg->cfs_rq[cpu_of(rq)]; : : list_del_leaf_cfs_rq(tg->cfs_rq[cpu]); : : : : if (!cfs_rq_is_decayed(cfs_rq) || cfs_rq->nr_running) (3) : list_add_leaf_cfs_rq(cfs_rq); : : : : : : : : : ---truncated---
Source: CVE Program / CVE List V5
CVSS Information
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Source: CVE Program / CVE List V5
Vulnerability Type
N/A
Source: CVE Program / CVE List V5
Vulnerability Title
Linux kernel 安全漏洞
Source: CNNVD (China National Vulnerability Database)
Vulnerability Description
Linux kernel是美国Linux基金会的开源操作系统Linux所使用的内核。 Linux kernel存在安全漏洞,该漏洞源于函数update_blocked_averages存在释放后重用漏洞。
Source: CNNVD (China National Vulnerability Database)
CVSS Information
N/A
Source: CNNVD (China National Vulnerability Database)
Vulnerability Type
N/A
Source: CNNVD (China National Vulnerability Database)

Affected Products

Vendor Product Affected Versions CPE Subscribe
Linux Linux a7b359fc6a37faaf472125867c8dc5a068c90982 ~ 512e21c150c1c3ee298852660f3a796e267e62ec -
Linux Linux 5.13 -

II. Public POCs for CVE-2021-47209

# POC Description Source Link Shenlong Link
AI-Generated POC Premium

No public POC found.

Login to generate AI POC

III. Intelligence Information for CVE-2021-47209

请登录查看更多情报信息。

Other References for CVE-2021-47209 (2)

Same Patch Batch · Linux · 2024-04-10 · 39 CVEs total

CVE-2021-47215 9.8 CRITICAL net/mlx5e: kTLS, Fix crash in RX resync flow
CVE-2021-47203 8.8 HIGH scsi: lpfc: Fix list_add() corruption in lpfc_drain_txq()
CVE-2021-47183 8.8 HIGH scsi: lpfc: Fix link down processing to address NULL pointer dereference
CVE-2021-47184 8.8 HIGH i40e: Fix NULL ptr dereference on VSI filter sync
CVE-2021-47201 7.8 HIGH iavf: free q_vectors before queues in iavf_disable_vf
CVE-2021-47200 7.8 HIGH drm/prime: Fix use after free in mmap with drm_gem_ttm_mmap
CVE-2024-26815 7.8 HIGH net/sched: taprio: proper TCA_TAPRIO_TC_ENTRY_INDEX check
CVE-2021-47197 7.8 HIGH net/mlx5e: nullify cq->dbg pointer in mlx5_debug_cq_remove()
CVE-2021-47188 7.8 HIGH scsi: ufs: core: Improve SCSI abort handling
CVE-2021-47189 7.8 HIGH btrfs: fix memory ordering between normal and ordered work functions
CVE-2021-47196 7.8 HIGH RDMA/core: Set send and receive CQ before forwarding to the driver
CVE-2021-47194 7.8 HIGH cfg80211: call cfg80211_stop_ap when switch from P2P_GO type
CVE-2021-47191 7.1 HIGH scsi: scsi_debug: Fix out-of-bound read in resp_readcap16()
CVE-2021-47219 7.1 HIGH scsi: scsi_debug: Fix out-of-bound read in resp_report_tgtpgs()
CVE-2021-47211 ALSA: usb-audio: fix null pointer dereference on pointer cs_desc
CVE-2021-47210 usb: typec: tipd: Remove WARN_ON in tps6598x_block_read
CVE-2021-47198 scsi: lpfc: Fix use-after-free in lpfc_unreg_rpi() routine
CVE-2021-47207 ALSA: gus: fix null pointer dereference on pointer block
CVE-2021-47212 net/mlx5: Update error handler for UCTX and UMEM
CVE-2021-47214 hugetlb, userfaultfd: fix reservation restore on userfaultfd error

Showing top 20 of 39 CVEs. View all on vendor page &rarr; →

IV. Related Vulnerabilities

V. Comments for CVE-2021-47209

No comments yet


Leave a comment