Пример #1
0
/**
 * aa_ptrace - do ptrace permission check and auditing
 * @tracer: task doing the tracing (NOT NULL)
 * @tracee: task being traced (NOT NULL)
 * @mode: ptrace mode either PTRACE_MODE_READ || PTRACE_MODE_ATTACH
 *
 * Returns: %0 else error code if permission denied or error
 */
int aa_ptrace(struct task_struct *tracer, struct task_struct *tracee,
              unsigned int mode)
{
    /*
     * tracer can ptrace tracee when
     * - tracer is unconfined ||
     *   - tracer is in complain mode
     *   - tracer has rules allowing it to trace tracee currently this is:
     *       - confined by the same profile ||
     *       - tracer profile has CAP_SYS_PTRACE
     */

    struct aa_profile *tracer_p;
    /* cred released below */
    const struct cred *cred = get_task_cred(tracer);
    int error = 0;
    tracer_p = aa_cred_profile(cred);

    if (!unconfined(tracer_p)) {
        /* lcred released below */
        const struct cred *lcred = get_task_cred(tracee);
        struct aa_profile *tracee_p = aa_cred_profile(lcred);

        error = aa_may_ptrace(tracer, tracer_p, tracee_p, mode);
        error = aa_audit_ptrace(tracer_p, tracee_p, error);

        put_cred(lcred);
    }
    put_cred(cred);

    return error;
}
Пример #2
0
int aa_ptrace(struct task_struct *tracer, struct task_struct *tracee,
	      unsigned int mode)
{
	/*
                                 
                             
                                  
                                                                       
                                           
                                             
  */

	struct aa_profile *tracer_p;
	/*                     */
	const struct cred *cred = get_task_cred(tracer);
	int error = 0;
	tracer_p = aa_cred_profile(cred);

	if (!unconfined(tracer_p)) {
		/*                      */
		const struct cred *lcred = get_task_cred(tracee);
		struct aa_profile *tracee_p = aa_cred_profile(lcred);

		error = aa_may_ptrace(tracer, tracer_p, tracee_p, mode);
		error = aa_audit_ptrace(tracer_p, tracee_p, error);

		put_cred(lcred);
	}
	put_cred(cred);

	return error;
}