Excerpts from Michael Ellerman's message of February 5, 2021 10:22 am:
> Nicholas Piggin <npig...@gmail.com> writes:
>> Excerpts from Christophe Leroy's message of February 4, 2021 6:03 pm:
>>> Le 04/02/2021 à 04:27, Nicholas Piggin a écrit :
>>>> Excerpts from Christophe Leroy's message of February 4, 2021 2:25 am:
>>>>> Le 25/02/2020 à 18:35, Nicholas Piggin a écrit :
> ...
>>>>>> +
>>>>>> +        /*
>>>>>> +         * We don't need to restore AMR on the way back to userspace 
>>>>>> for KUAP.
>>>>>> +         * The value of AMR only matters while we're in the kernel.
>>>>>> +         */
>>>>>> +        kuap_restore_amr(regs);
>>>>>
>>>>> Is that correct to restore KUAP state here ? Shouldn't we have it at 
>>>>> lower level in assembly ?
>>>>>
>>>>> Isn't there a risk that someone manages to call 
>>>>> interrupt_exit_kernel_prepare() or the end of it in
>>>>> a way or another, and get the previous KUAP state restored by this way ?
>>>> 
>>>> I'm not sure if there much more risk if it's here rather than the
>>>> instruction being in another place in the code.
>>>> 
>>>> There's a lot of user access around the kernel too if you want to find a
>>>> gadget to unlock KUAP then I suppose there is a pretty large attack
>>>> surface.
>>> 
>>> My understanding is that user access scope is strictly limited, for 
>>> instance we enforce the 
>>> begin/end of user access to be in the same function, and we refrain from 
>>> calling any other function 
>>> inside the user access window. x86 even have 'objtool' to enforce it at 
>>> build time. So in theory 
>>> there is no way to get out of the function while user access is open.
>>> 
>>> Here with the interrupt exit function it is free beer. You have a place 
>>> where you re-open user 
>>> access and return with a simple blr. So that's open bar. If someone manages 
>>> to just call the 
>>> interrupt exit function, then user access remains open
>>
>> Hmm okay maybe that's a good point.
> 
> I don't think it's a very attractive gadget, it's not just a plain blr,
> it does a full stack frame tear down before the return. And there's no
> LR reloads anywhere very close.
> 
> Obviously it depends on what the compiler decides to do, it's possible
> it could be a usable gadget. But there are other places that are more
> attractive I think, eg:
> 
> c00000000061d768:     a6 03 3d 7d     mtspr   29,r9
> c00000000061d76c:     2c 01 00 4c     isync
> c00000000061d770:     00 00 00 60     nop
> c00000000061d774:     30 00 21 38     addi    r1,r1,48
> c00000000061d778:     20 00 80 4e     blr
> 
> 
> So I don't think we should redesign the code *purely* because we're
> worried about interrupt_exit_kernel_prepare() being a useful gadget. If
> we can come up with a way to restructure it that reads well and is
> maintainable, and also reduces the chance of it being a good gadget then
> sure.

Okay. That would be good if we can keep it in C, the pkeys + kuap combo
is fairly complicated and we might want to something cleverer with it, 
so that would make it even more difficult in asm.

Thanks,
Nick

Reply via email to