]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
audit: fix potential use-after-free in audit_del_rule()
authorLuxiao Xu <rakukuip@gmail.com>
Tue, 21 Jul 2026 15:37:41 +0000 (23:37 +0800)
committerPaul Moore <paul@paul-moore.com>
Wed, 29 Jul 2026 20:19:06 +0000 (16:19 -0400)
`audit_del_rule()` destroys `e->rule.exe` via `audit_remove_mark_rule()`
before unlinking the rule from RCU-visible filter lists and waiting for a
grace period. Concurrent readers in `audit_filter()` and
`audit_filter_rules()` still dereference `e->rule.exe`, while the fsnotify
mark can be freed on an independent lifetime path. This creates a
use-after-free window during rule deletion.

Fix this by unlinking the rule from the RCU-visible lists and invoking
`synchronize_rcu()` before calling `audit_remove_mark_rule()` (and other
rule removal helpers). This ensures that all existing RCU readers have
exited the critical section before any underlying resources are destroyed.

Cc: stable@vger.kernel.org
Fixes: 34d99af52ad4 ("audit: implement audit by executable")
Reported-by: Vega <vega@nebusec.ai>
Assisted-by: Codex:gpt-5.4
Signed-off-by: Luxiao Xu <rakukuip@gmail.com>
Signed-off-by: Ren Wei <enjou1224z@gmail.com>
Signed-off-by: Paul Moore <paul@paul-moore.com>
kernel/auditfilter.c

index 4401119b52750738811b47cee4e4fd187ccf2389..7f791afe579178dbab05191f8c0163767c56efea 100644 (file)
@@ -1045,6 +1045,10 @@ int audit_del_rule(struct audit_entry *entry)
                goto out;
        }
 
+       list_del_rcu(&e->list);
+       list_del(&e->rule.list);
+       synchronize_rcu();
+
        if (e->rule.watch)
                audit_remove_watch_rule(&e->rule);
 
@@ -1062,8 +1066,6 @@ int audit_del_rule(struct audit_entry *entry)
                audit_signals--;
 #endif
 
-       list_del_rcu(&e->list);
-       list_del(&e->rule.list);
        call_rcu(&e->rcu, audit_free_rule_rcu);
 
 out: