[PATCH v8 13/20] aarch64: Add glibc.cpu.aarch64_gcs_policy tunable
Adhemerval Zanella Netto
adhemerval.zanella@linaro.org
Thu Jan 16 12:37:37 GMT 2025
On 16/01/25 07:46, Yury Khrustalev wrote:
> On Wed, Jan 15, 2025 at 01:46:03PM -0300, Adhemerval Zanella Netto wrote:
>>
>> On 14/01/25 13:03, Yury Khrustalev wrote:
>>> From: Szabolcs Nagy <szabolcs.nagy@arm.com>
>>>
>>> Policy sets how GCS tunable and GCS marking turns into gcs state:
>>>
>>> 0: state = tunable
>>> 1: state = marking ? tunable : (tunable && dlopen ? err : 0)
>>> 2: state = marking ? tunable : (tunable ? err : 0)
>>>
>>
>> Is the policy '1' really a good semantic? I know that for testing and transition to
>> GCS enablement it might make sense, but we recently removed the non-executable stack
>> switch for dynamic shared object through dlopen (0ca8785a28515291d4ef074b5b6cfb27434c1d2b)
>> because this was used as vector for a RCE.
>>
>> I know that is gated through a environment variable, but even though it opens some
>> possibility to silent disable GCS in a misconfigured environment.
>
> The value 1 is a lenient form of policy to allow applocations that fully
> support GCS to benefit from it while the apps that have dependencies that
> don't yet support GCS would continue to work in the same environment. This
> is indeed to help with transition, and we think this approach is reasonable.
This is a potentially security issue and I don't think we should allow it
Similar to how now we enforce non-executable stacks, I think we should
enforce on program loading, or return an error for dlopen. Meaning just:
0: state = tunable
1: state = marking ? tunable : (tunable ? err : 0)
It means dlopen will fail if the object does not contain the GCS marking
if GCS is enabled; which I think is the expected behavior for most deployments.
>
>>
>>> +
>>> +The default is @code{0} .
>
> I'll fix this typo in the next version of the patch.
>
>>> +
>>> +This tunable is specific to AArch64.
>>> +@end deftp
>>> +
>>> @node Memory Related Tunables
>>> @section Memory Related Tunables
>>> @cindex memory related tunables
>>> diff --git a/sysdeps/aarch64/dl-tunables.list b/sysdeps/aarch64/dl-tunables.list
>>> index 4b28341b72..7fbd77a41b 100644
>>> --- a/sysdeps/aarch64/dl-tunables.list
>>> +++ b/sysdeps/aarch64/dl-tunables.list
>>> @@ -26,5 +26,10 @@ glibc {
>>> minval: 0
>>> default: 0
>>> }
>>> + aarch64_gcs_policy {
>>> + type: UINT_64
>>> + minval: 0
>>> + default: 0
>>> + }
>>> }
>>> }
>>> diff --git a/sysdeps/unix/sysv/linux/aarch64/cpu-features.c b/sysdeps/unix/sysv/linux/aarch64/cpu-features.c
>>> index 1ecf6cd176..5d03a4b01b 100644
>>> --- a/sysdeps/unix/sysv/linux/aarch64/cpu-features.c
>>> +++ b/sysdeps/unix/sysv/linux/aarch64/cpu-features.c
>>> @@ -182,6 +182,11 @@ init_cpu_features (struct cpu_features *cpu_features)
>>> #endif
>>>
>>> if (GLRO (dl_hwcap) & HWCAP_GCS)
>>> - /* GCS status may be updated later by binary compatibility checks. */
>>> - GL (dl_aarch64_gcs) = TUNABLE_GET (glibc, cpu, aarch64_gcs, uint64_t, 0);
>>> + {
>>> + /* GCS status may be updated later by binary compatibility checks. */
>>> + GL (dl_aarch64_gcs) = TUNABLE_GET (glibc, cpu, aarch64_gcs, uint64_t, 0);
>>> + /* Fixed GCS policy. */
>>> + GLRO (dl_aarch64_gcs_policy) =
>>> + TUNABLE_GET (glibc, cpu, aarch64_gcs_policy, uint64_t, 0);
>>> + }
>>> }
>>> diff --git a/sysdeps/unix/sysv/linux/aarch64/dl-procinfo.c b/sysdeps/unix/sysv/linux/aarch64/dl-procinfo.c
>>> index 66287b4216..bcfc3fe030 100644
>>> --- a/sysdeps/unix/sysv/linux/aarch64/dl-procinfo.c
>>> +++ b/sysdeps/unix/sysv/linux/aarch64/dl-procinfo.c
>>> @@ -54,6 +54,19 @@ PROCINFO_CLASS struct cpu_features _dl_aarch64_cpu_features
>>> # else
>>> ,
>>> # endif
>>> +# if !defined PROCINFO_DECL && defined SHARED
>>> + ._dl_aarch64_gcs_policy
>>> +# else
>>> +PROCINFO_CLASS uint64_t _dl_aarch64_gcs_policy
>>> +# endif
>>> +# ifndef PROCINFO_DECL
>>> += 0
>>> +# endif
>>> +# if !defined SHARED || defined PROCINFO_DECL
>>> +;
>>> +# else
>>> +,
>>> +# endif
>>> #endif
>>>
>>> /* Number of HWCAP bits set. */
>>
More information about the Libc-alpha
mailing list