{"id":14898,"date":"2026-09-04T19:02:17","date_gmt":"2026-09-04T11:02:17","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-63827"},"modified":"2026-09-04T19:02:17","modified_gmt":"2026-09-04T11:02:17","slug":"cve-2026-63827","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-63827","title":{"rendered":"CVE-2026-63827 [HIGH] &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\napparmor: fix use-aft"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>apparmor: fix use-after-free in rawdata dedup loop<\/p>\n<p>aa_replace_profiles() walks ns-&gt;rawdata_list to dedup the incoming<br \/>\npolicy blob against entries already attached to existing profiles.<br \/>\nPer the kernel-doc on struct aa_loaddata, list membership does not<br \/>\nhold a reference: profiles hold pcount, and when the last pcount<br \/>\ndrops, do_ploaddata_rmfs() is queued on a workqueue that takes<br \/>\nns-&gt;lock and removes the entry. Between dropping the last pcount<br \/>\nand the workqueue running, an entry remains on the list with<br \/>\npcount == 0.<\/p>\n<p>aa_get_profile_loaddata() is an unconditional kref_get() on<br \/>\npcount, so when the dedup loop hits such an entry, refcount<br \/>\nhardening reports<\/p>\n<p>  refcount_t: addition on 0; use-after-free.<\/p>\n<p>inside aa_replace_profiles(), and the poisoned counter then<br \/>\ntrips &#8220;saturated&#8221; and &#8220;underflow&#8221; warnings on the subsequent<br \/>\nuses of the same loaddata.<\/p>\n<p>Before commit a0b7091c4de4 (&#8220;apparmor: fix race on rawdata<br \/>\ndereference&#8221;) the dedup path used a get_unless_zero-style helper<br \/>\non a single counter, so the existing &#8220;if (tmp)&#8221; guard was<br \/>\nmeaningful. The split-refcount refactor introduced<br \/>\naa_get_profile_loaddata(), which has plain kref_get() semantics,<br \/>\nand the guard quietly became a no-op.<\/p>\n<p>Introduce aa_get_profile_loaddata_not0(), matching the existing<br \/>\n_not0 convention used by aa_get_profile_not0(), and use it for<br \/>\nthe rawdata_list dedup lookup so dying entries are skipped.<\/p>\n<p>Reproduced on x86_64 with v7.1-rc5 in QEMU+KVM running Ubuntu<br \/>\n24.04 + stress-ng 0.17.06:<\/p>\n<p>  stress-ng &#8211;apparmor 1 &#8211;klog-check &#8211;timeout 60s<\/p>\n<p>Without this patch the three refcount_t warnings fire within a<br \/>\nfew seconds. With it the same 60 s run is clean. Coverage is a<br \/>\nsmoke-test only; a longer soak with CONFIG_KASAN, CONFIG_KCSAN<br \/>\nand CONFIG_PROVE_LOCKING would be welcome from anyone with the<br \/>\ncycles.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>apparmor: fix use-after-free in rawdata dedup loop<\/p>\n<p>aa_replace_profiles() walks ns-&gt;rawdata_list to dedup the incoming<br \/>\npolicy blob <\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-14898","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/14898","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=14898"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=14898"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=14898"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}