mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
selftests/bpf: Fix selftests broken by mitigations=off
When we configure the kernel command line with 'mitigations=off' and set the sysctl knob 'kernel.unprivileged_bpf_disabled' to 0, the commitbc5bc309db
("bpf: Inherit system settings for CPU security mitigations") causes issues in the execution of `test_progs -t verifier`. This is because 'mitigations=off' bypasses Spectre v1 and Spectre v4 protections. Currently, when a program requests to run in unprivileged mode (kernel.unprivileged_bpf_disabled = 0), the BPF verifier may prevent it from running due to the following conditions not being enabled: - bypass_spec_v1 - bypass_spec_v4 - allow_ptr_leaks - allow_uninit_stack While 'mitigations=off' enables the first two conditions, it does not enable the latter two. As a result, some test cases in 'test_progs -t verifier' that were expected to fail to run may run successfully, while others still fail but with different error messages. This makes it challenging to address them comprehensively. Moreover, in the future, we may introduce more fine-grained control over CPU mitigations, such as enabling only bypass_spec_v1 or bypass_spec_v4. Given the complexity of the situation, rather than fixing each broken test case individually, it's preferable to skip them when 'mitigations=off' is in effect and introduce specific test cases for the new 'mitigations=off' scenario. For instance, we can introduce new BTF declaration tags like '__failure__nospec', '__failure_nospecv1' and '__failure_nospecv4'. In this patch, the approach is to simply skip the broken test cases when 'mitigations=off' is enabled. The result of `test_progs -t verifier` as follows after this commit, Before this commit ================== - without 'mitigations=off' - kernel.unprivileged_bpf_disabled = 2 Summary: 74/948 PASSED, 388 SKIPPED, 0 FAILED - kernel.unprivileged_bpf_disabled = 0 Summary: 74/1336 PASSED, 0 SKIPPED, 0 FAILED <<<< - with 'mitigations=off' - kernel.unprivileged_bpf_disabled = 2 Summary: 74/948 PASSED, 388 SKIPPED, 0 FAILED - kernel.unprivileged_bpf_disabled = 0 Summary: 63/1276 PASSED, 0 SKIPPED, 11 FAILED <<<< 11 FAILED After this commit ================= - without 'mitigations=off' - kernel.unprivileged_bpf_disabled = 2 Summary: 74/948 PASSED, 388 SKIPPED, 0 FAILED - kernel.unprivileged_bpf_disabled = 0 Summary: 74/1336 PASSED, 0 SKIPPED, 0 FAILED <<<< - with this patch, with 'mitigations=off' - kernel.unprivileged_bpf_disabled = 2 Summary: 74/948 PASSED, 388 SKIPPED, 0 FAILED - kernel.unprivileged_bpf_disabled = 0 Summary: 74/948 PASSED, 388 SKIPPED, 0 FAILED <<<< SKIPPED Fixes:bc5bc309db
("bpf: Inherit system settings for CPU security mitigations") Reported-by: Alexei Starovoitov <alexei.starovoitov@gmail.com> Signed-off-by: Yafang Shao <laoar.shao@gmail.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Yonghong Song <yonghong.song@linux.dev> Closes: https://lore.kernel.org/bpf/CAADnVQKUBJqg+hHtbLeeC2jhoJAWqnmRAzXW3hmUCNSV9kx4sQ@mail.gmail.com Link: https://lore.kernel.org/bpf/20231025031144.5508-1-laoar.shao@gmail.com
This commit is contained in:
parent
37db10bc24
commit
399f6185a1
1 changed files with 32 additions and 1 deletions
|
@ -4,9 +4,40 @@
|
|||
#include <stdlib.h>
|
||||
#include <error.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "unpriv_helpers.h"
|
||||
|
||||
static bool get_mitigations_off(void)
|
||||
{
|
||||
char cmdline[4096], *c;
|
||||
int fd, ret = false;
|
||||
|
||||
fd = open("/proc/cmdline", O_RDONLY);
|
||||
if (fd < 0) {
|
||||
perror("open /proc/cmdline");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (read(fd, cmdline, sizeof(cmdline) - 1) < 0) {
|
||||
perror("read /proc/cmdline");
|
||||
goto out;
|
||||
}
|
||||
|
||||
cmdline[sizeof(cmdline) - 1] = '\0';
|
||||
for (c = strtok(cmdline, " \n"); c; c = strtok(NULL, " \n")) {
|
||||
if (strncmp(c, "mitigations=off", strlen(c)))
|
||||
continue;
|
||||
ret = true;
|
||||
break;
|
||||
}
|
||||
out:
|
||||
close(fd);
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool get_unpriv_disabled(void)
|
||||
{
|
||||
bool disabled;
|
||||
|
@ -22,5 +53,5 @@ bool get_unpriv_disabled(void)
|
|||
disabled = true;
|
||||
}
|
||||
|
||||
return disabled;
|
||||
return disabled ? true : get_mitigations_off();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue