mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Indan Zupancic" <indan@nul.nu>
To: "Will Drewry" <wad@chromium.org>
Cc: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org,
	linux-doc@vger.kernel.org, kernel-hardening@lists.openwall.org,
	netdev@vger.kernel.org, x86@kernel.org, arnd@arndb.de,
	davem@davemloft.net, hpa@zytor.com, mingo@redhat.com,
	oleg@redhat.com, peterz@infradead.org, rdunlap@xenotime.net,
	mcgrathr@chromium.org, tglx@linutronix.de, luto@mit.edu,
	eparis@redhat.com, serge.hallyn@canonical.com, djm@mindrot.org,
	scarybeasts@gmail.com, pmoore@redhat.com,
	akpm@linux-foundation.org, corbet@lwn.net,
	eric.dumazet@gmail.com, markus@chromium.org,
	keescook@chromium.org
Subject: Re: [PATCH v8 6/8] ptrace,seccomp: Add PTRACE_SECCOMP support
Date: Fri, 17 Feb 2012 23:55:13 +0100	[thread overview]
Message-ID: <c4735bf45ba385828bead276931cc75c.squirrel@webmail.greenhost.nl> (raw)
In-Reply-To: <CABqD9hbAQ8dwwAf0Cpk4+dwgWjCYh1Fwg92=Vaq1XNqFQ3VVqw@mail.gmail.com>

Hello,

On Fri, February 17, 2012 17:23, Will Drewry wrote:
> On Thu, Feb 16, 2012 at 11:08 PM, Indan Zupancic <indan@nul.nu> wrote:
>>> +/* Indicates if a tracer is attached. */
>>> +#define SECCOMP_FLAGS_TRACED 0
>>
>> That's not the best way to check if a tracer is attached, and if you did use
>> it for that, you don't need to toggle it all the time.
>
> It's logically no different than task->ptrace.  If it is less
> desirable, that's fine, but it is functionally equivalent.

Except that when using task->ptrace the ptrace code keeps track of it and
clears it when the ptracer goes away. And you're toggling SECCOMP_FLAGS_TRACED
all the time.

>>> diff --git a/kernel/seccomp.c b/kernel/seccomp.c
>>> index c75485c..f9d419f 100644
>>> --- a/kernel/seccomp.c
>>> +++ b/kernel/seccomp.c
>>> @@ -289,6 +289,8 @@ void copy_seccomp(struct seccomp *child,
>>>  {
>>>       child->mode = prev->mode;
>>>       child->filter = get_seccomp_filter(prev->filter);
>>> +     /* Note, this leaves seccomp tracing enabled across fork. */
>>> +     child->flags = prev->flags;
>>
>> What if the child isn't ptraced?
>
> Then falling through with TIF_SYSCALL_TRACE will result in the
> SECCOMP_RET_TRACE events to be allowed, but this comes back to the
> race.  If I can effectively "check" that ptrace did its job, then I
> think this becomes a non-issue.

Yes. But it would be still sloppy state tracking, which can lead to
all kind of unlikely but interesting scenario's. If the child is ever
attached to later on, that flag will be still set. Same is true for
any descendant, they all will have that flag copied.

>>>  }
>>>
>>>  /**
>>> @@ -363,6 +365,19 @@ int __secure_computing_int(int this_syscall)
>>>                       syscall_rollback(current, task_pt_regs(current));
>>>                       seccomp_send_sigtrap();
>>>                       return -1;
>>> +             case SECCOMP_RET_TRACE:
>>> +                     if (!seccomp_traced(&current->seccomp))
>>> +                             return -1;
>>> +                     /*
>>> +                      * Delegate to TIF_SYSCALL_TRACE. This allows fast-path
>>> +                      * seccomp calls to delegate to slow-path if needed.
>>> +                      * Since TIF_SYSCALL_TRACE will be unset on ptrace(2)
>>> +                      * continuation, there should be no direct side
>>> +                      * effects.  If TIF_SYSCALL_TRACE is already set, this
>>> +                      * has no effect.
>>> +                      */
>>> +                     set_tsk_thread_flag(current, TIF_SYSCALL_TRACE);
>>> +                     /* Falls through to allow. */
>>
>> This is nice and simple, but not race-free. You want to check if the ptracer
>> handled the event or not. If the ptracer died before handling this then the
>> syscall should be denied and the task should be killed.
>
> Hrm. I think there's a way to do this without forcing seccomp to
> always go slow path.  I'll update the patch and see how it goes.

You only have to go through the slow path for the SECCOMP_RET_TRACE case.
But yeah, toggling TIF_SYSCALL_TRACE seems the only way to avoid the slow
path, sometimes. The downside is that it's unexpected behaviour which may
clash with arch entry code, so I'm not sure if that's a good idea. I think
always going through the slow path isn't too bad, compared to the ptrace
alternative it's still a lot faster.

>> Many people would like a PTRACE_O_KILL_TRACEE_IF_DEBUGGER_DIES option,
>> Oleg was working on that, among other things. Perhaps re-use that to
>> handle this case too?
>
> Well, if you can inject initial code into the tracee, then it can call
> prctl(PR_SET_PDEATHSIG, SIGKILL).  Then when the tracer dies, the
> child dies.

That only works for child tracees, not descendants of the tracee.

> If the SIGKILL race in arch_ptrace_... is resolved, then
> a SIGKILL that arrives between seccomp and delegation to ptrace should
> result in process death.  Though perhaps my proposal above will make
> seccomp's integration with ptrace less subject to ptrace behaviors.

Oleg fixed the SIGKILL problem (it wasn't a race), it should go upstream
in the next kernel version, I think.

>>>               case SECCOMP_RET_ALLOW:
>>
>> For this and the ERRNO case you could check that PTRACE_O_SECCOMP option and
>> decide to do something or not in ptrace.
>
> For ERRNO, I'd prefer not to since it adds implicit behavior to the
> rules and, without pulling a ptrace_event()ish call into this code, it
> would change the return flow and potentially open up errno, which
> should be solid, to races, etc.  For ALLOW, sure, but at that point,
> just use PTRACE_SYSCALL.  Perhaps this can all be ameliorated if I can
> get a useful ptrace_entry completed notification.

You don't want ptrace to be able to override the decision? Fair enough.
Or did you mean something else?

Greetings,

Indan



  reply	other threads:[~2012-02-17 22:55 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-16 20:02 [PATCH v8 1/8] sk_run_filter: add support for custom load_pointer Will Drewry
2012-02-16 20:02 ` [PATCH v8 2/8] seccomp: kill the seccomp_t typedef Will Drewry
2012-02-20  2:55   ` James Morris
2012-02-16 20:02 ` [PATCH v8 3/8] seccomp: add system call filtering using BPF Will Drewry
2012-02-16 20:06   ` H. Peter Anvin
2012-02-16 20:25     ` Will Drewry
2012-02-16 21:17       ` H. Peter Anvin
2012-02-16 21:28         ` Markus Gutschke
2012-02-16 21:34           ` H. Peter Anvin
2012-02-16 21:51             ` Will Drewry
2012-02-16 22:06               ` H. Peter Anvin
2012-02-16 23:00                 ` Will Drewry
2012-02-17  0:23                   ` Andrew Lutomirski
2012-02-17  0:43                   ` H. Peter Anvin
2012-02-17  0:50                   ` Eric Paris
2012-02-17  2:24                     ` H. Peter Anvin
2012-02-17  3:53                     ` Will Drewry
2012-02-17  4:12                       ` H. Peter Anvin
2012-02-17  4:26                         ` Will Drewry
2012-02-17  4:32                           ` H. Peter Anvin
2012-02-17  4:40                             ` Will Drewry
2012-02-16 21:31         ` Will Drewry
2012-02-17  0:48         ` Indan Zupancic
2012-02-17  0:51           ` Andrew Lutomirski
2012-02-17  1:10             ` H. Peter Anvin
2012-02-17  1:25             ` Indan Zupancic
2012-02-17  1:33           ` H. Peter Anvin
2012-02-17  2:00             ` Indan Zupancic
2012-02-17  2:16               ` Andrew Lutomirski
2012-02-17  2:22                 ` H. Peter Anvin
2012-02-17  3:27                   ` Indan Zupancic
2012-02-17  4:09                     ` H. Peter Anvin
2012-02-17  4:51                       ` Indan Zupancic
2012-02-17  2:44   ` Indan Zupancic
2012-02-17  3:38     ` [kernel-hardening] " Will Drewry
2012-02-16 20:02 ` [PATCH v8 4/8] seccomp: add SECCOMP_RET_ERRNO Will Drewry
2012-02-16 20:02 ` [PATCH v8 5/8] seccomp: Add SECCOMP_RET_TRAP Will Drewry
     [not found]   ` <CAE6n16mCrJC=Sre+PT1H_VfSjW0MGyi0xtEcdcRvGMvvwXWzmA@mail.gmail.com>
2012-02-16 20:28     ` Markus Gutschke
2012-02-16 21:23       ` H. Peter Anvin
2012-02-16 20:42     ` Will Drewry
2012-02-16 21:11       ` [PATCH v9 " Will Drewry
2012-02-16 21:11         ` [PATCH v9 8/8] Documentation: prctl/seccomp_filter Will Drewry
2012-02-16 21:28       ` [PATCH v8 5/8] seccomp: Add SECCOMP_RET_TRAP H. Peter Anvin
2012-02-16 21:33         ` Will Drewry
2012-02-16 20:02 ` [PATCH v8 6/8] ptrace,seccomp: Add PTRACE_SECCOMP support Will Drewry
2012-02-17  5:08   ` Indan Zupancic
2012-02-17 16:23     ` Will Drewry
2012-02-17 22:55       ` Indan Zupancic [this message]
2012-02-21 17:31         ` Will Drewry
2012-02-16 20:02 ` [PATCH v8 7/8] x86: Enable HAVE_ARCH_SECCOMP_FILTER Will Drewry
2012-02-16 20:02 ` [PATCH v8 8/8] Documentation: prctl/seccomp_filter Will Drewry
2012-02-16 20:08 ` [PATCH v8 1/8] sk_run_filter: add support for custom load_pointer Will Drewry
2012-02-17  1:54 ` Joe Perches
2012-02-17  2:22   ` Will Drewry
2012-02-17  3:04 ` Indan Zupancic
2012-02-17  4:13   ` Will Drewry
2012-02-17  5:05     ` Indan Zupancic

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=c4735bf45ba385828bead276931cc75c.squirrel@webmail.greenhost.nl \
    --to=indan@nul.nu \
    --cc=akpm@linux-foundation.org \
    --cc=arnd@arndb.de \
    --cc=corbet@lwn.net \
    --cc=davem@davemloft.net \
    --cc=djm@mindrot.org \
    --cc=eparis@redhat.com \
    --cc=eric.dumazet@gmail.com \
    --cc=hpa@zytor.com \
    --cc=keescook@chromium.org \
    --cc=kernel-hardening@lists.openwall.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@mit.edu \
    --cc=markus@chromium.org \
    --cc=mcgrathr@chromium.org \
    --cc=mingo@redhat.com \
    --cc=netdev@vger.kernel.org \
    --cc=oleg@redhat.com \
    --cc=peterz@infradead.org \
    --cc=pmoore@redhat.com \
    --cc=rdunlap@xenotime.net \
    --cc=scarybeasts@gmail.com \
    --cc=serge.hallyn@canonical.com \
    --cc=tglx@linutronix.de \
    --cc=wad@chromium.org \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®