|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH for-4.14] x86/livepatch: Make livepatching compatible with CET Shadow Stacks
On 26.06.2020 13:56, Andrew Cooper wrote:
> On 15/06/2020 16:16, Jan Beulich wrote:
>>>>> @@ -58,6 +59,10 @@ int arch_livepatch_safety_check(void)
>>>>>
>>>>> int arch_livepatch_quiesce(void)
>>>>> {
>>>>> + /* If Shadow Stacks are in use, disable CR4.CET so we can modify
>>>>> CR0.WP. */
>>>>> + if ( cpu_has_xen_shstk )
>>>>> + write_cr4(read_cr4() & ~X86_CR4_CET);
>>>>> +
>>>>> /* Disable WP to allow changes to read-only pages. */
>>>>> write_cr0(read_cr0() & ~X86_CR0_WP);
>>>>>
>>>>> @@ -68,6 +73,29 @@ void arch_livepatch_revive(void)
>>>>> {
>>>>> /* Reinstate WP. */
>>>>> write_cr0(read_cr0() | X86_CR0_WP);
>>>>> +
>>>>> + /* Clobber dirty bits and reinstate CET, if applicable. */
>>>>> + if ( IS_ENABLED(CONFIG_XEN_SHSTK) && cpu_has_xen_shstk )
>>>>> + {
>>>>> + unsigned long tmp;
>>>>> +
>>>>> + reset_virtual_region_perms();
>>>>> +
>>>>> + write_cr4(read_cr4() | X86_CR4_CET);
>>>>> +
>>>>> + /*
>>>>> + * Fix up the return address on the shadow stack, which currently
>>>>> + * points at arch_livepatch_quiesce()'s caller.
>>>>> + *
>>>>> + * Note: this is somewhat fragile, and depends on both
>>>>> + * arch_livepatch_{quiesce,revive}() being called from the same
>>>>> + * function, which is currently the case.
>>>>> + */
>>>>> + asm volatile ("rdsspq %[ssp];"
>>>>> + "wrssq %[addr], (%[ssp]);"
>>>>> + : [ssp] "=&r" (tmp)
>>>>> + : [addr] "r" (__builtin_return_address(0)));
>>>>> + }
>>>> To be safe against LTO I think this wants accompanying with making
>>>> both functions noinline.
>>> Hmm true.
>>>
>>>> As to the fragility - how about arch_livepatch_quiesce() returning
>>>> __builtin_return_address(0) to its caller, for passing into here
>>>> for verification? This would also make more noticeable that the
>>>> two should be be called from the same function (or else the "token"
>>>> would need passing further around).
>>> This I'm less certain about, as its fairly invasive to common code, just
>>> to bodge around something I don't expect to last very long into the 4.15
>>> timeframe.
>> I don't see it being invasive - there's a new local variable needed
>> in both of apply_payload() and revert_payload(), and of course the
>> call sites would need adjustment.
>
> Exactly - the call site adjustment is what makes it invasive in common
> code, and all other architectures.
>
> Any getting this wrong will die with #CP[near ret] anyway.
>
> The only thing passing that value around would do is let you tweak the
> error message slightly before we crash out.
Well, okay - I'm not a maintainer of that part of the code anyway.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |