我对 Linux 内核黑客比较陌生,但我目前正在尝试在Rust for Linux项目的上下文中将 Linux 安全模块Yama移植到 Rust。在试图了解 Yama 的运作方式时,我发现了一个潜在的 use-after-free 错误,尽管我不确定。
Yama 维护一个允许的跟踪器-跟踪器关系列表以保护 ptrace 调用,跟踪器和跟踪器存储为task_struct
指针。重要的是,当添加异常时,这些的引用计数不会增加,这意味着注册了异常的任务仍然可以被释放。释放任务后,Yama 会将引用此任务的任何关系标记为无效。
我正在查看用于检查给定任务的已注册异常的代码。当发现一个有效的异常时,这个函数取消对跟踪器的引用task_struct*
以检索它的线程组领导。所有这些都发生在 RCU 临界区,即 afterrcu_read_lock()
和 before rcu_read_unlock()
。我看到的潜在问题是,在检查关系是否有效并且在取消引用跟踪器task_struct
指针之前,这个已注册的跟踪器任务可能已被释放。处于 RCU 关键部分是否会阻止 task_structs 被释放,从而使其安全?
相关函数ptracer_exception_found
定义在 中security/yama/yama_lsm.c
,可以在GitHub 上查看(我觉得这个函数和它调用的相关代码有点太长,不能包含 inline)。