• Paul Moore's avatar
    audit: don't take task_lock() in audit_exe_compare() code path · 47846d51
    Paul Moore authored
    The get_task_exe_file() function locks the given task with task_lock()
    which when used inside audit_exe_compare() can cause deadlocks on
    systems that generate audit records when the task_lock() is held. We
    resolve this problem with two changes: ignoring those cases where the
    task being audited is not the current task, and changing our approach
    to obtaining the executable file struct to not require task_lock().
    
    With the intent of the audit exe filter being to filter on audit events
    generated by processes started by the specified executable, it makes
    sense that we would only want to use the exe filter on audit records
    associated with the currently executing process, e.g. @current.  If
    we are asked to filter records using a non-@current task_struct we can
    safely ignore the exe filter without negatively impacting the admin's
    expectations for the exe filter.
    
    Knowing that we only have to worry about filtering the currently
    executing task in audit_exe_compare() we can do away with the
    task_lock() and call get_mm_exe_file() with @current->mm directly.
    
    Cc: <stable@vger.kernel.org>
    Fixes: 5efc2443 ("audit: fix exe_file access in audit_exe_compare")
    Reported-by: default avatarAndreas Steinmetz <anstein99@googlemail.com>
    Reviewed-by: default avatarJohn Johansen <john.johanse@canonical.com>
    Reviewed-by: default avatarMateusz Guzik <mjguzik@gmail.com>
    Signed-off-by: default avatarPaul Moore <paul@paul-moore.com>
    47846d51
audit_watch.c 13.9 KB