Unverified Commit 687f9b9b by Ruben Jenster Committed by Christian Brauner

seccomp: Fix handling of pseudo syscalls and improve logging for rule processing.

parent 7d40e58b
...@@ -486,7 +486,14 @@ static scmp_filter_ctx get_new_ctx(enum lxc_hostarch_t n_arch, uint32_t default_ ...@@ -486,7 +486,14 @@ static scmp_filter_ctx get_new_ctx(enum lxc_hostarch_t n_arch, uint32_t default_
return ctx; return ctx;
} }
static bool do_resolve_add_rule(uint32_t arch, char *line, scmp_filter_ctx ctx, enum lxc_seccomp_rule_status_t {
lxc_seccomp_rule_added = 0,
lxc_seccomp_rule_err,
lxc_seccomp_rule_undefined_syscall,
lxc_seccomp_rule_unsupported_arch,
};
static enum lxc_seccomp_rule_status_t do_resolve_add_rule(uint32_t arch, char *line, scmp_filter_ctx ctx,
struct seccomp_v2_rule *rule) struct seccomp_v2_rule *rule)
{ {
int i, nr, ret; int i, nr, ret;
...@@ -496,7 +503,7 @@ static bool do_resolve_add_rule(uint32_t arch, char *line, scmp_filter_ctx ctx, ...@@ -496,7 +503,7 @@ static bool do_resolve_add_rule(uint32_t arch, char *line, scmp_filter_ctx ctx,
if (arch && ret != 0) { if (arch && ret != 0) {
errno = -ret; errno = -ret;
SYSERROR("Seccomp: rule and context arch do not match (arch %d)", arch); SYSERROR("Seccomp: rule and context arch do not match (arch %d)", arch);
return false; return lxc_seccomp_rule_err;
} }
/*get the syscall name*/ /*get the syscall name*/
...@@ -511,29 +518,28 @@ static bool do_resolve_add_rule(uint32_t arch, char *line, scmp_filter_ctx ctx, ...@@ -511,29 +518,28 @@ static bool do_resolve_add_rule(uint32_t arch, char *line, scmp_filter_ctx ctx,
if (ret < 0) { if (ret < 0) {
errno = -ret; errno = -ret;
SYSERROR("Failed loading rule to reject force umount"); SYSERROR("Failed loading rule to reject force umount");
return false; return lxc_seccomp_rule_err;
} }
INFO("Set seccomp rule to reject force umounts"); INFO("Set seccomp rule to reject force umounts");
return true; return lxc_seccomp_rule_added;
} }
nr = seccomp_syscall_resolve_name(line); nr = seccomp_syscall_resolve_name(line);
if (nr == __NR_SCMP_ERROR) { if (nr == __NR_SCMP_ERROR) {
WARN("Failed to resolve syscall \"%s\"", line); INFO("The syscall[%s] is is undefined on host native arch", line);
WARN("This syscall will NOT be handled by seccomp"); return lxc_seccomp_rule_undefined_syscall;
return true;
} }
if (nr < 0) { // The syscall resolves to a pseudo syscall and may be available on compat archs.
WARN("Got negative return value %d for syscall \"%s\"", nr, line); if (nr < 0 && arch == SCMP_ARCH_NATIVE) {
WARN("This syscall will NOT be handled by seccomp"); DEBUG("The syscall[%d:%s] is a pseudo syscall and not available on host native arch.", nr, line);
return true; return lxc_seccomp_rule_unsupported_arch;
} }
if (arch != SCMP_ARCH_NATIVE && seccomp_syscall_resolve_name_arch(arch, line) < 0) { if (arch != SCMP_ARCH_NATIVE && seccomp_syscall_resolve_name_arch(arch, line) < 0) {
INFO("The syscall \"%s\" nr:%d is not supported on compat arch:%d", line, nr, arch); DEBUG("The syscall[%d:%s] is not supported on compat arch[%u]", nr, line, arch);
return true; return lxc_seccomp_rule_unsupported_arch;
} }
memset(&arg_cmp, 0, sizeof(arg_cmp)); memset(&arg_cmp, 0, sizeof(arg_cmp));
...@@ -555,16 +561,20 @@ static bool do_resolve_add_rule(uint32_t arch, char *line, scmp_filter_ctx ctx, ...@@ -555,16 +561,20 @@ static bool do_resolve_add_rule(uint32_t arch, char *line, scmp_filter_ctx ctx,
rule->args_value[i].value); rule->args_value[i].value);
} }
INFO("Adding %s rule for syscall[%d:%s] action[%d:%s] arch[%u]",
(arch == SCMP_ARCH_NATIVE) ? "native" : "compat",
nr, line, rule->action, get_action_name(rule->action), arch);
ret = seccomp_rule_add_exact_array(ctx, rule->action, nr, ret = seccomp_rule_add_exact_array(ctx, rule->action, nr,
rule->args_num, arg_cmp); rule->args_num, arg_cmp);
if (ret < 0) { if (ret < 0) {
errno = -ret; errno = -ret;
SYSERROR("Failed loading rule for %s (nr %d action %d (%s))", SYSERROR("Failed to add rule for syscall[%d:%s] action[%d:%s] arch[%u]",
line, nr, rule->action, get_action_name(rule->action)); nr, line, rule->action, get_action_name(rule->action), arch);
return false; return lxc_seccomp_rule_err;
} }
return true; return lxc_seccomp_rule_added;
} }
/* /*
...@@ -983,42 +993,30 @@ static int parse_config_v2(FILE *f, char *line, size_t *line_bufsz, struct lxc_c ...@@ -983,42 +993,30 @@ static int parse_config_v2(FILE *f, char *line, size_t *line_bufsz, struct lxc_c
} }
#endif #endif
if (!do_resolve_add_rule(SCMP_ARCH_NATIVE, line,
conf->seccomp.seccomp_ctx, &rule))
goto bad_rule;
INFO("Added native rule for arch %d for %s action %d(%s)", ret = do_resolve_add_rule(SCMP_ARCH_NATIVE, line,
SCMP_ARCH_NATIVE, line, rule.action, conf->seccomp.seccomp_ctx, &rule);
get_action_name(rule.action)); if (ret == lxc_seccomp_rule_err)
goto bad_rule;
if (ret == lxc_seccomp_rule_undefined_syscall)
continue;
if (ctx.architectures[0] != SCMP_ARCH_NATIVE) { if (ctx.architectures[0] != SCMP_ARCH_NATIVE) {
if (!do_resolve_add_rule(ctx.architectures[0], line, if (lxc_seccomp_rule_err == do_resolve_add_rule(ctx.architectures[0], line,
ctx.contexts[0], &rule)) ctx.contexts[0], &rule))
goto bad_rule; goto bad_rule;
INFO("Added compat rule for arch %d for %s action %d(%s)",
ctx.architectures[0], line, rule.action,
get_action_name(rule.action));
} }
if (ctx.architectures[1] != SCMP_ARCH_NATIVE) { if (ctx.architectures[1] != SCMP_ARCH_NATIVE) {
if (!do_resolve_add_rule(ctx.architectures[1], line, if (lxc_seccomp_rule_err == do_resolve_add_rule(ctx.architectures[1], line,
ctx.contexts[1], &rule)) ctx.contexts[1], &rule))
goto bad_rule; goto bad_rule;
INFO("Added compat rule for arch %d for %s action %d(%s)",
ctx.architectures[1], line, rule.action,
get_action_name(rule.action));
} }
if (ctx.architectures[2] != SCMP_ARCH_NATIVE) { if (ctx.architectures[2] != SCMP_ARCH_NATIVE) {
if (!do_resolve_add_rule(ctx.architectures[2], line, if (lxc_seccomp_rule_err == do_resolve_add_rule(ctx.architectures[2], line,
ctx.contexts[2], &rule)) ctx.contexts[2], &rule))
goto bad_rule; goto bad_rule;
INFO("Added native rule for arch %d for %s action %d(%s)",
ctx.architectures[2], line, rule.action,
get_action_name(rule.action));
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment