mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-23 15:11:16 +00:00
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: Serge Hallyn <serge.hallyn@canonical.com> Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
This commit is contained in:
parent
cf9c93526f
commit
8b94eea4bf
3 changed files with 10 additions and 13 deletions
|
@ -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,
|
||||||
|
|
||||||
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 {
|
||||||
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[] = {
|
||||||
.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,
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue