use serde_json::json;
use sysknife_daemon::executor::{build_action_spec, ExecutorError};
const PROTECTIVE: &[&str] = &[
"lockdown=confidentiality",
"module.sig_enforce=1",
"selinux=1",
"enforcing=1",
"pti=on",
"mitigations=auto,nosmt",
"init_on_alloc=1",
"slab_nomerge",
"randomize_kstack_offset=on",
"vsyscall=none",
];
const WEAKENING: &[&str] = &["mitigations=off", "selinux=0", "pti=off", "init=/bin/sh"];
const PROTECTIVE_BARE: &[&str] = &["slab_nomerge", "nosmt", "kaslr"];
const WEAKENING_BARE: &[&str] = &["single", "nosmap", "nosmep"];
#[test]
fn set_kernel_arguments_refuses_to_remove_a_protective_arg() {
for arg in PROTECTIVE {
let params = json!({ "add": [], "remove": [arg] });
let result = build_action_spec("SetKernelArguments", ¶ms);
assert!(
matches!(result, Err(ExecutorError::InvalidParam("remove"))),
"SetKernelArguments must refuse to remove {arg}, got {result:?}"
);
}
}
#[test]
fn set_kernel_arguments_still_removes_a_weakening_arg() {
for arg in WEAKENING {
let params = json!({ "add": [], "remove": [arg] });
assert!(
build_action_spec("SetKernelArguments", ¶ms).is_ok(),
"SetKernelArguments must still be able to remove {arg}"
);
}
}
#[test]
fn grub_set_kargs_refuses_to_delete_a_protective_arg() {
for arg in PROTECTIVE_BARE {
let params = json!({ "append": [], "delete": [arg] });
let result = build_action_spec("GrubSetKargs", ¶ms);
assert!(
matches!(result, Err(ExecutorError::InvalidParam("delete"))),
"GrubSetKargs must refuse to delete {arg}, got {result:?}"
);
}
}
#[test]
fn grub_set_kargs_still_deletes_a_weakening_arg() {
for arg in WEAKENING_BARE {
let params = json!({ "append": [], "delete": [arg] });
assert!(
build_action_spec("GrubSetKargs", ¶ms).is_ok(),
"GrubSetKargs must still be able to delete {arg}"
);
}
}