[PATCH i-g-t] tests/intel/xe_sysfs_file_perm: Verify sysfs file permissions for security
Peter Senna Tschudin
peter.senna at linux.intel.com
Tue Aug 26 12:51:38 UTC 2025
Hi,
Just a note to let you know that I am abandoning this patch. I will
modify existing tests instead of creating a a separate security test
like I attempted with this patch.
Thank you for your comments,
Peter
On 8/25/2025 4:09 PM, Michal Winiarski wrote:
> On Wed, Aug 13, 2025 at 03:19:47PM +0200, Peter Senna Tschudin wrote:
>> This IGT adds checks for the 13 sysfs files identified in the Xe threat
>> model, ensuring they are only writable by the root user. If any of these
>> files are writable by non-root users, a warning is issued.
>
> As sysfs is a proper uAPI, I'd expect we already have tests that
> excercise those sysfs'es from functional angle.
>
>>
>> When files are not present in the system, only informational messages
>> are logged. No warnings or test aborts occur in such cases.
>>
>> Cc: Rodrigo Vivi <rodrigo.vivi at intel.com>
>> Cc: Michal Winiarski <michal.winiarski at intel.com>
>> Signed-off-by: Peter Senna Tschudin <peter.senna at linux.intel.com>
>> ---
>> tests/intel/xe_sysfs_file_perm.c | 578 +++++++++++++++++++++++++++++++
>> tests/meson.build | 1 +
>> 2 files changed, 579 insertions(+)
>> create mode 100644 tests/intel/xe_sysfs_file_perm.c
>>
>> diff --git a/tests/intel/xe_sysfs_file_perm.c b/tests/intel/xe_sysfs_file_perm.c
>> new file mode 100644
>> index 000000000..2833de10c
>> --- /dev/null
>> +++ b/tests/intel/xe_sysfs_file_perm.c
>> @@ -0,0 +1,578 @@
>> +// SPDX-License-Identifier: MIT
>> +/*
>> + * Copyright © 2025 Intel Corporation
>> + */
>> +
>
> [...]
>
>> +
>> +igt_main
>> +{
>> + struct igt_list_head fds_list;
>> + struct igt_list_head files_list;
>> + struct igt_list_head pattern_list;
>> +
>> + /**
>> + * Do not change the list below without checking the Xe threat
>> + * modeling first. You can contact peter.senna at intel.com or
>> + * michal.winiarski at intel.com for questions and support.
>> + */
>> +
>
> And indeed - it looks like we do have at least one existing test for
> each of those files.
>
>> + /* DO NOT CHANGE START */
>> + static const char * const gt_patterns[] = {
>> + "ccs_mode",
>
> xe_compute
>
>> + "engines/[a-zA-Z0-9]+/job_timeout_ms",
>> + "engines/[a-zA-Z0-9]+/preempt_timeout_us",
>> + "engines/[a-zA-Z0-9]+/timeslice_duration_min",
>> + "engines/[a-zA-Z0-9]+/timeslice_duration_max",
>> + "engines/[a-zA-Z0-9]+/timeslice_duration_us",
>
> xe_sysfs_scheduler
>
>> + "freq0/max_freq",
>> + "freq0/min_freq"
>
> xe_gt_freq
>
>> + };
>> +
>> + static const char * const hwmon_patterns[] = {
>> + "power[0-9]+_crit",
>> + "curr[0-9]+_crit",
>> + "power[0-9]+_max",
>> + "power[0-9]+_max_interval"
>
> intel_hwmon
>
>> + };
>> +
>> + static const char * const devices_patterns[] = {
>> + "vram_d3cold_threshold"
>
> xe_pm
>
> Access rights are just a property of some functionality, and I would
> prefer to test it in the right context.
> This could be handled as a subtest in a functional test (checking
> whether the API being used has proper access rights), instead of having
> a test that tries to check the access rights of everything that the
> driver exposes.
>
> Thanks,
> -Michał
>
>> + };
>> +
>> + struct dir_input dir_inputs[DIR_COUNT] = {
>> + { GT_DIR, gt_patterns, ARRAY_SIZE(gt_patterns) },
>> + { HWMON_DIR, hwmon_patterns, ARRAY_SIZE(hwmon_patterns) },
>> + { DEVICES_DIR, devices_patterns, ARRAY_SIZE(devices_patterns) }
>> + };
>> + /* DO NOT CHANGE END */
>> +
>> + igt_fixture {
>> + IGT_INIT_LIST_HEAD(&fds_list);
>> + IGT_INIT_LIST_HEAD(&pattern_list);
>> + IGT_INIT_LIST_HEAD(&files_list);
>> +
>> + igt_require(prepare_patterns(dir_inputs, &pattern_list));
>> +
>> + igt_require(fds_open_all(&fds_list));
>> + igt_require(search_files(&fds_list, &pattern_list, &files_list));
>> + igt_require(fds_close_and_free_list(&fds_list));
>> +
>> + /* We do not warn or abort if not all patterns match
>> + * because not all nodes are always available
>> + */
>> + check_pattern_match(&pattern_list);
>> + }
>> +
>> + igt_describe("Check if only root can write to important sysfs files.");
>> + igt_subtest("check-file-permissions")
>> + igt_assert(check_files_permissions(&files_list));
>> +
>> + igt_fixture {
>> + struct pattern_node *pattern_node, *pattern_tmp;
>> + struct file_node *file_node, *file_tmp;
>> +
>> + igt_list_for_each_entry_safe(pattern_node, pattern_tmp, &pattern_list, link) {
>> + /* pattern_node->pattern is static and const and
>> + * should not be freed
>> + */
>> + regfree(&pattern_node->regex);
>> + igt_list_del(&pattern_node->link);
>> + free(pattern_node);
>> + }
>> +
>> + igt_list_for_each_entry_safe(file_node, file_tmp, &files_list, link) {
>> + free(file_node->full_path);
>> + igt_list_del(&file_node->link);
>> + free(file_node);
>> + }
>> + }
>> +}
>> diff --git a/tests/meson.build b/tests/meson.build
>> index 5c01c64e9..d904dffcd 100644
>> --- a/tests/meson.build
>> +++ b/tests/meson.build
>> @@ -330,6 +330,7 @@ intel_xe_progs = [
>> 'xe_sriov_flr',
>> 'xe_sriov_scheduling',
>> 'xe_sysfs_defaults',
>> + 'xe_sysfs_file_perm',
>> 'xe_sysfs_preempt_timeout',
>> 'xe_sysfs_scheduler',
>> 'xe_sysfs_timeslice_duration',
>> --
>> 2.43.0
>>
More information about the igt-dev
mailing list