Commit 8b94eea4 authored by Eric W. Biederman's avatar Eric W. Biederman

userns: Add user namespace support to IMA

Use kuid's in the IMA rules.

When reporting the current uid in audit logs use from_kuid
to get a usable value.

Cc: Mimi Zohar <zohar@us.ibm.com>
Acked-by: default avatarSerge Hallyn <serge.hallyn@canonical.com>
Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
parent cf9c9352
...@@ -923,10 +923,6 @@ config UIDGID_CONVERTED ...@@ -923,10 +923,6 @@ config UIDGID_CONVERTED
bool bool
default y default y
# List of kernel pieces that need user namespace work
# Features
depends on IMA = n
# Networking # Networking
depends on NET_9P = n depends on NET_9P = n
......
...@@ -39,8 +39,9 @@ void integrity_audit_msg(int audit_msgno, struct inode *inode, ...@@ -39,8 +39,9 @@ void integrity_audit_msg(int audit_msgno, struct inode *inode,
ab = audit_log_start(current->audit_context, GFP_KERNEL, audit_msgno); ab = audit_log_start(current->audit_context, GFP_KERNEL, audit_msgno);
audit_log_format(ab, "pid=%d uid=%u auid=%u ses=%u", audit_log_format(ab, "pid=%d uid=%u auid=%u ses=%u",
current->pid, current_cred()->uid, current->pid,
audit_get_loginuid(current), from_kuid(&init_user_ns, current_cred()->uid),
from_kuid(&init_user_ns, audit_get_loginuid(current)),
audit_get_sessionid(current)); audit_get_sessionid(current));
audit_log_task_context(ab); audit_log_task_context(ab);
audit_log_format(ab, " op="); audit_log_format(ab, " op=");
......
...@@ -39,7 +39,7 @@ struct ima_measure_rule_entry { ...@@ -39,7 +39,7 @@ struct ima_measure_rule_entry {
enum ima_hooks func; enum ima_hooks func;
int mask; int mask;
unsigned long fsmagic; unsigned long fsmagic;
uid_t uid; kuid_t uid;
struct { struct {
void *rule; /* LSM file metadata specific */ void *rule; /* LSM file metadata specific */
int type; /* audit type */ int type; /* audit type */
...@@ -71,7 +71,7 @@ static struct ima_measure_rule_entry default_rules[] = { ...@@ -71,7 +71,7 @@ static struct ima_measure_rule_entry default_rules[] = {
.flags = IMA_FUNC | IMA_MASK}, .flags = IMA_FUNC | IMA_MASK},
{.action = MEASURE,.func = BPRM_CHECK,.mask = MAY_EXEC, {.action = MEASURE,.func = BPRM_CHECK,.mask = MAY_EXEC,
.flags = IMA_FUNC | IMA_MASK}, .flags = IMA_FUNC | IMA_MASK},
{.action = MEASURE,.func = FILE_CHECK,.mask = MAY_READ,.uid = 0, {.action = MEASURE,.func = FILE_CHECK,.mask = MAY_READ,.uid = GLOBAL_ROOT_UID,
.flags = IMA_FUNC | IMA_MASK | IMA_UID}, .flags = IMA_FUNC | IMA_MASK | IMA_UID},
}; };
...@@ -112,7 +112,7 @@ static bool ima_match_rules(struct ima_measure_rule_entry *rule, ...@@ -112,7 +112,7 @@ static bool ima_match_rules(struct ima_measure_rule_entry *rule,
if ((rule->flags & IMA_FSMAGIC) if ((rule->flags & IMA_FSMAGIC)
&& rule->fsmagic != inode->i_sb->s_magic) && rule->fsmagic != inode->i_sb->s_magic)
return false; return false;
if ((rule->flags & IMA_UID) && rule->uid != cred->uid) if ((rule->flags & IMA_UID) && !uid_eq(rule->uid, cred->uid))
return false; return false;
for (i = 0; i < MAX_LSM_RULES; i++) { for (i = 0; i < MAX_LSM_RULES; i++) {
int rc = 0; int rc = 0;
...@@ -277,7 +277,7 @@ static int ima_parse_rule(char *rule, struct ima_measure_rule_entry *entry) ...@@ -277,7 +277,7 @@ static int ima_parse_rule(char *rule, struct ima_measure_rule_entry *entry)
ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_INTEGRITY_RULE); ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_INTEGRITY_RULE);
entry->uid = -1; entry->uid = INVALID_UID;
entry->action = UNKNOWN; entry->action = UNKNOWN;
while ((p = strsep(&rule, " \t")) != NULL) { while ((p = strsep(&rule, " \t")) != NULL) {
substring_t args[MAX_OPT_ARGS]; substring_t args[MAX_OPT_ARGS];
...@@ -361,15 +361,15 @@ static int ima_parse_rule(char *rule, struct ima_measure_rule_entry *entry) ...@@ -361,15 +361,15 @@ static int ima_parse_rule(char *rule, struct ima_measure_rule_entry *entry)
case Opt_uid: case Opt_uid:
ima_log_string(ab, "uid", args[0].from); ima_log_string(ab, "uid", args[0].from);
if (entry->uid != -1) { if (uid_valid(entry->uid)) {
result = -EINVAL; result = -EINVAL;
break; break;
} }
result = strict_strtoul(args[0].from, 10, &lnum); result = strict_strtoul(args[0].from, 10, &lnum);
if (!result) { if (!result) {
entry->uid = (uid_t) lnum; entry->uid = make_kuid(current_user_ns(), (uid_t)lnum);
if (entry->uid != lnum) if (!uid_valid(entry->uid) || (((uid_t)lnum) != lnum))
result = -EINVAL; result = -EINVAL;
else else
entry->flags |= IMA_UID; entry->flags |= IMA_UID;
......
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