All of lore.kernel.org
 help / color / mirror / Atom feed
From: Roman Peniaev <r.peniaev@gmail.com>
To: Kees Cook <keescook@chromium.org>
Cc: Will Deacon <will.deacon@arm.com>,
	Russell King <linux@arm.linux.org.uk>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Marc Zyngier <Marc.Zyngier@arm.com>,
	Catalin Marinas <Catalin.Marinas@arm.com>,
	Sekhar Nori <nsekhar@ti.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"stable@vger.kernel.org" <stable@vger.kernel.org>,
	Christoffer Dall <christoffer.dall@linaro.org>,
	"linux-arm-kernel@lists.infradead.org" 
	<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH 1/2] ARM: entry-common: fix forgotten set of thread_info->syscall
Date: Sat, 17 Jan 2015 00:57:02 +0900	[thread overview]
Message-ID: <CACZ9PQUEprgKrpHazDULA5mf-OaoX=MAjEeWdspZTXT_+iUKWw@mail.gmail.com> (raw)
In-Reply-To: <CAGXu5j+O6znN=7-gc3PqwqFA5MFRPLGBUzabOmQjWn_9WTjvpg@mail.gmail.com>

On Fri, Jan 16, 2015 at 7:54 AM, Kees Cook <keescook@chromium.org> wrote:
> On Wed, Jan 14, 2015 at 5:54 PM, Roman Peniaev <r.peniaev@gmail.com> wrote:
>> On Thu, Jan 15, 2015 at 5:51 AM, Kees Cook <keescook@chromium.org> wrote:
>>> On Tue, Jan 13, 2015 at 12:35 AM, Roman Peniaev <r.peniaev@gmail.com> wrote:
>>>> On Tue, Jan 13, 2015 at 3:39 AM, Will Deacon <will.deacon@arm.com> wrote:
>>>>> On Sun, Jan 11, 2015 at 02:32:30PM +0000, Roman Pen wrote:
>>>>>> thread_info->syscall is used only for ptrace, but syscall number
>>>>>> is also used by syscall_get_nr and returned to userspace by the
>>>>>> following proc file access:
>>>>>>
>>>>>>  $ cat /proc/self/syscall
>>>>>>  0 0x3 0xbe928bd8 0x1000 0x0 0xac9e0 0x3 0xbe928bb4 0xb6f5dfbc
>>>>>>  ^
>>>>>> The first number is the syscall number, currently it is zero.
>>>>>> Patch fixes this:
>>>>>>
>>>>>>  $ cat /proc/self/syscall
>>>>>>  3 0x3 0xbefc7bd8 0x1000 0x0 0xac9e0 0x3 0xbefc7bb4 0xb6e82fbc
>>>>>>  ^
>>>>>> Right, read syscall
>>>>>
>>>>> Yes, it seems that despite requiring CONFIG_HAVE_ARCH_TRACEHOOK,
>>>>> the /proc code requires syscall_get_nr to work regardless of
>>>>> TIF_SYSCALL_TRACE.
>>>>>
>>>>>> Signed-off-by: Roman Pen <r.peniaev@gmail.com>
>>>>>> Cc: Russell King <linux@arm.linux.org.uk>
>>>>>> Cc: Marc Zyngier <marc.zyngier@arm.com>
>>>>>> Cc: Catalin Marinas <catalin.marinas@arm.com>
>>>>>> Cc: Christoffer Dall <christoffer.dall@linaro.org>
>>>>>> Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
>>>>>> Cc: Sekhar Nori <nsekhar@ti.com>
>>>>>> Cc: linux-arm-kernel@lists.infradead.org
>>>>>> Cc: linux-kernel@vger.kernel.org
>>>>>> Cc: stable@vger.kernel.org
>>>>>> ---
>>>>>>  arch/arm/kernel/asm-offsets.c  | 1 +
>>>>>>  arch/arm/kernel/entry-common.S | 1 +
>>>>>>  2 files changed, 2 insertions(+)
>>>>>>
>>>>>> diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c
>>>>>> index 2d2d608..6911bad 100644
>>>>>> --- a/arch/arm/kernel/asm-offsets.c
>>>>>> +++ b/arch/arm/kernel/asm-offsets.c
>>>>>> @@ -70,6 +70,7 @@ int main(void)
>>>>>>    DEFINE(TI_CPU,             offsetof(struct thread_info, cpu));
>>>>>>    DEFINE(TI_CPU_DOMAIN,              offsetof(struct thread_info, cpu_domain));
>>>>>>    DEFINE(TI_CPU_SAVE,                offsetof(struct thread_info, cpu_context));
>>>>>> +  DEFINE(TI_SYSCALL,         offsetof(struct thread_info, syscall));
>>>>>>    DEFINE(TI_USED_CP,         offsetof(struct thread_info, used_cp));
>>>>>>    DEFINE(TI_TP_VALUE,                offsetof(struct thread_info, tp_value));
>>>>>>    DEFINE(TI_FPSTATE,         offsetof(struct thread_info, fpstate));
>>>>>> diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
>>>>>> index f8ccc21..89452ff 100644
>>>>>> --- a/arch/arm/kernel/entry-common.S
>>>>>> +++ b/arch/arm/kernel/entry-common.S
>>>>>> @@ -189,6 +189,7 @@ ENTRY(vector_swi)
>>>>>>  #endif
>>>>>>
>>>>>>  local_restart:
>>>>>> +     str scno, [tsk, #TI_SYSCALL]            @ set syscall number
>>>>>>       ldr     r10, [tsk, #TI_FLAGS]           @ check for syscall tracing
>>>>>>       stmdb   sp!, {r4, r5}                   @ push fifth and sixth args
>>>>>
>>>>> Do we definitely want to update scno on syscall restarting?
>>>>
>>>>
>>>> Good question.
>>>>
>>>> First thing to mention is __sys_trace will trace 'restart_syscall',
>>>> not the real syscall we are going to restart.
>>>>
>>>> E.g. in test application we do infinite poll and then send STOP and
>>>> CONT to this app:
>>>>
>>>>     test-243   [002] ...1  1792.067726: sys_enter: NR 168 (0, 0,
>>>> ffffffff, 0, 0, 0)
>>>>     test-243   [002] ...1  1802.299073: sys_exit: NR 168 = -516
>>>>     test-243   [004] ...1  1814.716264: sys_enter: NR 0 (0, 0,
>>>> ffffffff, 0, 0, 0)
>>>>     test-243   [004] ...1  2183.687225: sys_exit: NR 0 = -516
>>>>
>>>> the poll was restarted and trace shows that we are in restart_syscall.
>>>>
>>>> Is that expected?
>>>>
>>>> And the second thing is that my next patch did some tweaks in
>>>> 'syscall_trace_enter', where we take scno not from param we passed,
>>>> but from thread_info->syscall we previously set.
>>>>
>>>> So, regarding your question, if I set scno only once - I will break
>>>> previous behavior, and __sys_trace will trace the syscall we restarted.
>>>>
>>>> And I think this is what we need, because according to the
>>>> 'syscall_trace_enter' code we do 'secure_computing' and
>>>> 'audit_syscall_entry', which definitely expect original syscall, not
>>>> the 'restart_syscall'.
>>>
>>> Seccomp expects to see the __NR_restart_syscall syscall, since it
>>> interposes the syscall entry points.
>>
>>
>> Aha, thanks. So I should not break anything.
>
> I've tested on ARM now, seccomp doesn't see any change in behavior.
> Please consider both patches:
>
> Tested-by: Kees Cook <keescook@chromium.org>
>

Thanks.

> One interesting thing I noticed (which is unchanged by this series),
> but pulling ARM_r7 during the seccomp ptrace event shows __NR_poll,
> not __NR_restart_syscall, even though it was a __NR_restart_syscall
> trap from seccomp. Is there a better place to see the actual syscall?

As I understand we do not push new r7 to the stack, and ptrace uses the
old value.

I checked x86, x86-64 - ptrace returns __NR_restart_syscall.
So, probably, this should be fixed for ARM.

--
Roman

WARNING: multiple messages have this Message-ID (diff)
From: r.peniaev@gmail.com (Roman Peniaev)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 1/2] ARM: entry-common: fix forgotten set of thread_info->syscall
Date: Sat, 17 Jan 2015 00:57:02 +0900	[thread overview]
Message-ID: <CACZ9PQUEprgKrpHazDULA5mf-OaoX=MAjEeWdspZTXT_+iUKWw@mail.gmail.com> (raw)
In-Reply-To: <CAGXu5j+O6znN=7-gc3PqwqFA5MFRPLGBUzabOmQjWn_9WTjvpg@mail.gmail.com>

On Fri, Jan 16, 2015 at 7:54 AM, Kees Cook <keescook@chromium.org> wrote:
> On Wed, Jan 14, 2015 at 5:54 PM, Roman Peniaev <r.peniaev@gmail.com> wrote:
>> On Thu, Jan 15, 2015 at 5:51 AM, Kees Cook <keescook@chromium.org> wrote:
>>> On Tue, Jan 13, 2015 at 12:35 AM, Roman Peniaev <r.peniaev@gmail.com> wrote:
>>>> On Tue, Jan 13, 2015 at 3:39 AM, Will Deacon <will.deacon@arm.com> wrote:
>>>>> On Sun, Jan 11, 2015 at 02:32:30PM +0000, Roman Pen wrote:
>>>>>> thread_info->syscall is used only for ptrace, but syscall number
>>>>>> is also used by syscall_get_nr and returned to userspace by the
>>>>>> following proc file access:
>>>>>>
>>>>>>  $ cat /proc/self/syscall
>>>>>>  0 0x3 0xbe928bd8 0x1000 0x0 0xac9e0 0x3 0xbe928bb4 0xb6f5dfbc
>>>>>>  ^
>>>>>> The first number is the syscall number, currently it is zero.
>>>>>> Patch fixes this:
>>>>>>
>>>>>>  $ cat /proc/self/syscall
>>>>>>  3 0x3 0xbefc7bd8 0x1000 0x0 0xac9e0 0x3 0xbefc7bb4 0xb6e82fbc
>>>>>>  ^
>>>>>> Right, read syscall
>>>>>
>>>>> Yes, it seems that despite requiring CONFIG_HAVE_ARCH_TRACEHOOK,
>>>>> the /proc code requires syscall_get_nr to work regardless of
>>>>> TIF_SYSCALL_TRACE.
>>>>>
>>>>>> Signed-off-by: Roman Pen <r.peniaev@gmail.com>
>>>>>> Cc: Russell King <linux@arm.linux.org.uk>
>>>>>> Cc: Marc Zyngier <marc.zyngier@arm.com>
>>>>>> Cc: Catalin Marinas <catalin.marinas@arm.com>
>>>>>> Cc: Christoffer Dall <christoffer.dall@linaro.org>
>>>>>> Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
>>>>>> Cc: Sekhar Nori <nsekhar@ti.com>
>>>>>> Cc: linux-arm-kernel at lists.infradead.org
>>>>>> Cc: linux-kernel at vger.kernel.org
>>>>>> Cc: stable at vger.kernel.org
>>>>>> ---
>>>>>>  arch/arm/kernel/asm-offsets.c  | 1 +
>>>>>>  arch/arm/kernel/entry-common.S | 1 +
>>>>>>  2 files changed, 2 insertions(+)
>>>>>>
>>>>>> diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c
>>>>>> index 2d2d608..6911bad 100644
>>>>>> --- a/arch/arm/kernel/asm-offsets.c
>>>>>> +++ b/arch/arm/kernel/asm-offsets.c
>>>>>> @@ -70,6 +70,7 @@ int main(void)
>>>>>>    DEFINE(TI_CPU,             offsetof(struct thread_info, cpu));
>>>>>>    DEFINE(TI_CPU_DOMAIN,              offsetof(struct thread_info, cpu_domain));
>>>>>>    DEFINE(TI_CPU_SAVE,                offsetof(struct thread_info, cpu_context));
>>>>>> +  DEFINE(TI_SYSCALL,         offsetof(struct thread_info, syscall));
>>>>>>    DEFINE(TI_USED_CP,         offsetof(struct thread_info, used_cp));
>>>>>>    DEFINE(TI_TP_VALUE,                offsetof(struct thread_info, tp_value));
>>>>>>    DEFINE(TI_FPSTATE,         offsetof(struct thread_info, fpstate));
>>>>>> diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
>>>>>> index f8ccc21..89452ff 100644
>>>>>> --- a/arch/arm/kernel/entry-common.S
>>>>>> +++ b/arch/arm/kernel/entry-common.S
>>>>>> @@ -189,6 +189,7 @@ ENTRY(vector_swi)
>>>>>>  #endif
>>>>>>
>>>>>>  local_restart:
>>>>>> +     str scno, [tsk, #TI_SYSCALL]            @ set syscall number
>>>>>>       ldr     r10, [tsk, #TI_FLAGS]           @ check for syscall tracing
>>>>>>       stmdb   sp!, {r4, r5}                   @ push fifth and sixth args
>>>>>
>>>>> Do we definitely want to update scno on syscall restarting?
>>>>
>>>>
>>>> Good question.
>>>>
>>>> First thing to mention is __sys_trace will trace 'restart_syscall',
>>>> not the real syscall we are going to restart.
>>>>
>>>> E.g. in test application we do infinite poll and then send STOP and
>>>> CONT to this app:
>>>>
>>>>     test-243   [002] ...1  1792.067726: sys_enter: NR 168 (0, 0,
>>>> ffffffff, 0, 0, 0)
>>>>     test-243   [002] ...1  1802.299073: sys_exit: NR 168 = -516
>>>>     test-243   [004] ...1  1814.716264: sys_enter: NR 0 (0, 0,
>>>> ffffffff, 0, 0, 0)
>>>>     test-243   [004] ...1  2183.687225: sys_exit: NR 0 = -516
>>>>
>>>> the poll was restarted and trace shows that we are in restart_syscall.
>>>>
>>>> Is that expected?
>>>>
>>>> And the second thing is that my next patch did some tweaks in
>>>> 'syscall_trace_enter', where we take scno not from param we passed,
>>>> but from thread_info->syscall we previously set.
>>>>
>>>> So, regarding your question, if I set scno only once - I will break
>>>> previous behavior, and __sys_trace will trace the syscall we restarted.
>>>>
>>>> And I think this is what we need, because according to the
>>>> 'syscall_trace_enter' code we do 'secure_computing' and
>>>> 'audit_syscall_entry', which definitely expect original syscall, not
>>>> the 'restart_syscall'.
>>>
>>> Seccomp expects to see the __NR_restart_syscall syscall, since it
>>> interposes the syscall entry points.
>>
>>
>> Aha, thanks. So I should not break anything.
>
> I've tested on ARM now, seccomp doesn't see any change in behavior.
> Please consider both patches:
>
> Tested-by: Kees Cook <keescook@chromium.org>
>

Thanks.

> One interesting thing I noticed (which is unchanged by this series),
> but pulling ARM_r7 during the seccomp ptrace event shows __NR_poll,
> not __NR_restart_syscall, even though it was a __NR_restart_syscall
> trap from seccomp. Is there a better place to see the actual syscall?

As I understand we do not push new r7 to the stack, and ptrace uses the
old value.

I checked x86, x86-64 - ptrace returns __NR_restart_syscall.
So, probably, this should be fixed for ARM.

--
Roman

  reply	other threads:[~2015-01-16 16:04 UTC|newest]

Thread overview: 78+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-11 14:32 [PATCH 0/2] ARM: set thread_info->syscall just before sys_* execution Roman Pen
2015-01-11 14:32 ` Roman Pen
2015-01-11 14:32 ` [PATCH 1/2] ARM: entry-common: fix forgotten set of thread_info->syscall Roman Pen
2015-01-11 14:32   ` Roman Pen
2015-01-12 18:39   ` Will Deacon
2015-01-12 18:39     ` Will Deacon
2015-01-12 18:39     ` Will Deacon
2015-01-13  8:35     ` Roman Peniaev
2015-01-13  8:35       ` Roman Peniaev
2015-01-13  8:35       ` Roman Peniaev
2015-01-14  2:23       ` Roman Peniaev
2015-01-14  2:23         ` Roman Peniaev
2015-01-14  2:23         ` Roman Peniaev
2015-01-14 20:51       ` Kees Cook
2015-01-14 20:51         ` Kees Cook
2015-01-14 20:51         ` Kees Cook
2015-01-15  1:54         ` Roman Peniaev
2015-01-15  1:54           ` Roman Peniaev
2015-01-15  1:54           ` Roman Peniaev
2015-01-15 22:54           ` Kees Cook
2015-01-15 22:54             ` Kees Cook
2015-01-15 22:54             ` Kees Cook
2015-01-16 15:57             ` Roman Peniaev [this message]
2015-01-16 15:57               ` Roman Peniaev
2015-01-16 15:57               ` Roman Peniaev
2015-01-16 15:59               ` Russell King - ARM Linux
2015-01-16 15:59                 ` Russell King - ARM Linux
2015-01-16 15:59                 ` Russell King - ARM Linux
2015-01-16 16:08                 ` Roman Peniaev
2015-01-16 16:08                   ` Roman Peniaev
2015-01-16 16:08                   ` Roman Peniaev
2015-01-16 16:17                   ` Russell King - ARM Linux
2015-01-16 16:17                     ` Russell King - ARM Linux
2015-01-16 16:17                     ` Russell King - ARM Linux
2015-01-16 19:57                     ` Kees Cook
2015-01-16 19:57                       ` Kees Cook
2015-01-16 19:57                       ` Kees Cook
2015-01-16 23:54                       ` Kees Cook
2015-01-16 23:54                         ` Kees Cook
2015-01-16 23:54                         ` Kees Cook
2015-01-19  5:58                         ` Roman Peniaev
2015-01-19  5:58                           ` Roman Peniaev
2015-01-19  5:58                           ` Roman Peniaev
2015-01-20 18:56                           ` Kees Cook
2015-01-20 18:56                             ` Kees Cook
2015-01-20 18:56                             ` Kees Cook
2015-01-19  9:20                         ` Will Deacon
2015-01-19  9:20                           ` Will Deacon
2015-01-19  9:20                           ` Will Deacon
2015-01-20 18:31                           ` Kees Cook
2015-01-20 18:31                             ` Kees Cook
2015-01-20 18:31                             ` Kees Cook
2015-01-20 22:45                             ` Russell King - ARM Linux
2015-01-20 22:45                               ` Russell King - ARM Linux
2015-01-20 22:45                               ` Russell King - ARM Linux
2015-01-20 23:04                               ` Russell King - ARM Linux
2015-01-20 23:04                                 ` Russell King - ARM Linux
2015-01-20 23:04                                 ` Russell King - ARM Linux
2015-01-21 23:32                                 ` Kees Cook
2015-01-21 23:32                                   ` Kees Cook
2015-01-21 23:32                                   ` Kees Cook
2015-01-22  1:24                                   ` Roman Peniaev
2015-01-22  1:24                                     ` Roman Peniaev
2015-01-22  1:24                                     ` Roman Peniaev
2015-01-22 18:07                                     ` Kees Cook
2015-01-22 18:07                                       ` Kees Cook
2015-01-22 18:07                                       ` Kees Cook
2015-01-23  4:17                                       ` Roman Peniaev
2015-01-23  4:17                                         ` Roman Peniaev
2015-01-23  4:17                                         ` Roman Peniaev
2015-01-11 14:32 ` [PATCH 2/2] ARM: entry-common,ptrace: do not pass scno to syscall_trace_enter Roman Pen
2015-01-11 14:32   ` [PATCH 2/2] ARM: entry-common, ptrace: " Roman Pen
2015-01-13 20:08   ` [PATCH 2/2] ARM: entry-common,ptrace: " Kees Cook
2015-01-13 20:08     ` [PATCH 2/2] ARM: entry-common, ptrace: " Kees Cook
2015-01-13 23:21     ` [PATCH 2/2] ARM: entry-common,ptrace: " Roman Peniaev
2015-01-13 23:21       ` [PATCH 2/2] ARM: entry-common, ptrace: " Roman Peniaev
2015-01-13 23:43       ` [PATCH 2/2] ARM: entry-common,ptrace: " Kees Cook
2015-01-13 23:43         ` [PATCH 2/2] ARM: entry-common, ptrace: " Kees Cook

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='CACZ9PQUEprgKrpHazDULA5mf-OaoX=MAjEeWdspZTXT_+iUKWw@mail.gmail.com' \
    --to=r.peniaev@gmail.com \
    --cc=Catalin.Marinas@arm.com \
    --cc=Marc.Zyngier@arm.com \
    --cc=christoffer.dall@linaro.org \
    --cc=keescook@chromium.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=nsekhar@ti.com \
    --cc=stable@vger.kernel.org \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=will.deacon@arm.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.