|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 10/14] x86/extable: Adjust extable handling to be shadow stack compatible
On 29/05/2020 20:43, Andrew Cooper wrote:
> On 28/05/2020 17:15, Jan Beulich wrote:
>> On 27.05.2020 21:18, Andrew Cooper wrote:
>>> +
>>> + if ( ptr[0] == regs->rip && ptr[1] == regs->cs )
>>> + {
>>> + asm ( "wrssq %[fix], %[stk]"
>>> + : [stk] "=m" (*ptr)
>> Could this be ptr[0], to match the if()?
>>
>> Considering how important it is that we don't fix up the wrong stack
>> location here, I continue to wonder if we wouldn't better also
>> include the SSP value on the stack in the checking, at the very
>> least by way of an ASSERT() or BUG_ON().
> Well no, for the reason discussed in point 1.
>
> Its not technically an issue right now, but there is no possible way to
> BUILD_BUG_ON() someone turning an exception into IST, or stopping the
> use of the extable infrastructure on a #DB.
>
> Such a check would lie in wait and either provide an unexpected tangent
> to someone debugging a complicated issue (I do use #DB for a fair bit),
> or become a security vulnerability.
Also (which I forgot first time around),
The ptr[1] == regs->cs check is 64 bits wide, and the way to get that on
the shadow stack would be to execute a call instruction ending at at
0xe008 linear, or from a bad WRSSQ edit, both of which are serious
errors and worthy of hitting the BUG().
>>> --- a/xen/arch/x86/x86_64/entry.S
>>> +++ b/xen/arch/x86/x86_64/entry.S
>>> @@ -708,7 +708,16 @@ exception_with_ints_disabled:
>>> call search_pre_exception_table
>>> testq %rax,%rax # no fixup code for faulting EIP?
>>> jz 1b
>>> - movq %rax,UREGS_rip(%rsp)
>>> + movq %rax,UREGS_rip(%rsp) # fixup regular stack
>>> +
>>> +#ifdef CONFIG_XEN_SHSTK
>>> + mov $1, %edi
>>> + rdsspq %rdi
>>> + cmp $1, %edi
>>> + je .L_exn_shstk_done
>>> + wrssq %rax, (%rdi) # fixup shadow stack
>> According to the comment in extable_shstk_fixup(), isn't the value
>> to be replaced at 8(%rdi)?
> Hmm - I think you're right. I thought I had this covered by unit tests.
The unit test has been fixed, and so has this code.
~Andrew
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |