From 4df66568cf928d891b7cd7d0f6629103a63be4c6 Mon Sep 17 00:00:00 2001 From: Dan Mihai Date: Fri, 14 Jun 2024 19:33:53 +0000 Subject: [PATCH] genpolicy: reject untested CreateContainer field values Reject CreateContainerRequest field values that are not tested by Kata CI and that might impact the confidentiality of CoCo Guests. This change uses a "better safe than sorry" approach to untested fields. It is very possible that in the future we'll encounter reasonable use cases that will either: - Show that some of these fields are benign and don't have to be verified by Policy, or - Show that Policy should verify legitimate values of these fields These are the new CreateContainerRequest Policy rules: count(input.shared_mounts) == 0 is_null(input.string_user) i_oci := input.OCI is_null(i_oci.Hooks) is_null(i_oci.Linux.Seccomp) is_null(i_oci.Solaris) is_null(i_oci.Windows) i_linux := i_oci.Linux count(i_linux.GIDMappings) == 0 count(i_linux.MountLabel) == 0 count(i_linux.Resources.Devices) == 0 count(i_linux.RootfsPropagation) == 0 count(i_linux.UIDMappings) == 0 is_null(i_linux.IntelRdt) is_null(i_linux.Resources.BlockIO) is_null(i_linux.Resources.Network) is_null(i_linux.Resources.Pids) is_null(i_linux.Seccomp) i_linux.Sysctl == {} i_process := i_oci.Process count(i_process.SelinuxLabel) == 0 count(i_process.User.Username) == 0 Signed-off-by: Dan Mihai --- src/tools/genpolicy/rules.rego | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/tools/genpolicy/rules.rego b/src/tools/genpolicy/rules.rego index f81f74c262..76d734e0bb 100644 --- a/src/tools/genpolicy/rules.rego +++ b/src/tools/genpolicy/rules.rego @@ -52,10 +52,15 @@ default WriteStreamRequest := false default AllowRequestsFailingPolicy := false CreateContainerRequest { + # Check if the input request should be rejected even before checking the + # policy_data.containers information. + allow_create_container_input + i_oci := input.OCI i_storages := input.storages i_devices := input.devices + # Check if any element from the policy_data.containers array allows the input request. some p_container in policy_data.containers print("======== CreateContainerRequest: trying next policy container") @@ -85,6 +90,37 @@ CreateContainerRequest { print("CreateContainerRequest: true") } +allow_create_container_input { + print("allow_create_container_input: input =", input) + + count(input.shared_mounts) == 0 + is_null(input.string_user) + + i_oci := input.OCI + is_null(i_oci.Hooks) + is_null(i_oci.Solaris) + is_null(i_oci.Windows) + + i_linux := i_oci.Linux + count(i_linux.GIDMappings) == 0 + count(i_linux.MountLabel) == 0 + count(i_linux.Resources.Devices) == 0 + count(i_linux.RootfsPropagation) == 0 + count(i_linux.UIDMappings) == 0 + is_null(i_linux.IntelRdt) + is_null(i_linux.Resources.BlockIO) + is_null(i_linux.Resources.Network) + is_null(i_linux.Resources.Pids) + is_null(i_linux.Seccomp) + i_linux.Sysctl == {} + + i_process := i_oci.Process + count(i_process.SelinuxLabel) == 0 + count(i_process.User.Username) == 0 + + print("allow_create_container_input: true") +} + # Reject unexpected annotations. allow_anno(p_oci, i_oci) { print("allow_anno 1: start")