kernel: fix sepolicy rule which contains *

This commit is contained in:
weishu
2023-01-31 20:51:02 +07:00
parent 2d77f84736
commit ab6d483c32

View File

@@ -142,6 +142,23 @@ struct sepol_data {
char __user *sepol7; char __user *sepol7;
}; };
static int get_object(char *buf, char __user *user_object, size_t buf_sz,
char **object)
{
if (!user_object) {
*object = ALL;
return 0;
}
if (strncpy_from_user(buf, user_object, buf_sz) < 0) {
return -1;
}
*object = buf;
return 0;
}
int handle_sepolicy(unsigned long arg3, void __user *arg4) int handle_sepolicy(unsigned long arg3, void __user *arg4)
{ {
if (!arg4) { if (!arg4) {
@@ -168,62 +185,66 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
int ret = -1; int ret = -1;
if (cmd == CMD_NORMAL_PERM) { if (cmd == CMD_NORMAL_PERM) {
char src[MAX_SEPOL_LEN]; char src_buf[MAX_SEPOL_LEN];
char tgt[MAX_SEPOL_LEN]; char tgt_buf[MAX_SEPOL_LEN];
char cls[MAX_SEPOL_LEN]; char cls_buf[MAX_SEPOL_LEN];
char perm[MAX_SEPOL_LEN]; char perm_buf[MAX_SEPOL_LEN];
if (strncpy_from_user(src, data.sepol1, sizeof(src)) < 0) { char *s, *t, *c, *p;
if (get_object(src_buf, data.sepol1, sizeof(src_buf), &s) < 0) {
pr_err("sepol: copy src failed.\n"); pr_err("sepol: copy src failed.\n");
goto exit; goto exit;
} }
if (strncpy_from_user(tgt, data.sepol2, sizeof(tgt)) < 0) { if (get_object(tgt_buf, data.sepol2, sizeof(tgt_buf), &t) < 0) {
pr_err("sepol: copy tgt failed.\n"); pr_err("sepol: copy tgt failed.\n");
goto exit; goto exit;
} }
if (strncpy_from_user(cls, data.sepol3, sizeof(cls)) < 0) { if (get_object(cls_buf, data.sepol3, sizeof(cls_buf), &c) < 0) {
pr_err("sepol: copy cls failed.\n"); pr_err("sepol: copy cls failed.\n");
goto exit; goto exit;
} }
if (strncpy_from_user(perm, data.sepol4, sizeof(perm)) < 0) { if (get_object(perm_buf, data.sepol4, sizeof(perm_buf), &p) <
0) {
pr_err("sepol: copy perm failed.\n"); pr_err("sepol: copy perm failed.\n");
goto exit; goto exit;
} }
bool success = false; bool success = false;
if (subcmd == 1) { if (subcmd == 1) {
success = ksu_allow(db, src, tgt, cls, perm); success = ksu_allow(db, s, t, c, p);
} else if (subcmd == 2) { } else if (subcmd == 2) {
success = ksu_deny(db, src, tgt, cls, perm); success = ksu_deny(db, s, t, c, p);
} else if (subcmd == 3) { } else if (subcmd == 3) {
success = ksu_auditallow(db, src, tgt, cls, perm); success = ksu_auditallow(db, s, t, c, p);
} else if (subcmd == 4) { } else if (subcmd == 4) {
success = ksu_dontaudit(db, src, tgt, cls, perm); success = ksu_dontaudit(db, s, t, c, p);
} else { } else {
pr_err("sepol: unknown subcmd: %d", subcmd); pr_err("sepol: unknown subcmd: %d", subcmd);
} }
ret = success ? 0 : -1; ret = success ? 0 : -1;
} else if (cmd == CMD_XPERM) { } else if (cmd == CMD_XPERM) {
char src[MAX_SEPOL_LEN]; char src_buf[MAX_SEPOL_LEN];
char tgt[MAX_SEPOL_LEN]; char tgt_buf[MAX_SEPOL_LEN];
char cls[MAX_SEPOL_LEN]; char cls_buf[MAX_SEPOL_LEN];
char __maybe_unused char __maybe_unused
operation[MAX_SEPOL_LEN]; // it is always ioctl now! operation[MAX_SEPOL_LEN]; // it is always ioctl now!
char perm_set[MAX_SEPOL_LEN]; char perm_set[MAX_SEPOL_LEN];
if (strncpy_from_user(src, data.sepol1, sizeof(src)) < 0) { char *s, *t, *c;
if (get_object(src_buf, data.sepol1, sizeof(src_buf), &s) < 0) {
pr_err("sepol: copy src failed.\n"); pr_err("sepol: copy src failed.\n");
goto exit; goto exit;
} }
if (strncpy_from_user(tgt, data.sepol2, sizeof(tgt)) < 0) { if (get_object(tgt_buf, data.sepol2, sizeof(tgt_buf), &t) < 0) {
pr_err("sepol: copy tgt failed.\n"); pr_err("sepol: copy tgt failed.\n");
goto exit; goto exit;
} }
if (strncpy_from_user(cls, data.sepol3, sizeof(cls)) < 0) { if (get_object(cls_buf, data.sepol3, sizeof(cls_buf), &c) < 0) {
pr_err("sepol: copy cls failed.\n"); pr_err("sepol: copy cls failed.\n");
goto exit; goto exit;
} }
@@ -240,13 +261,11 @@ int handle_sepolicy(unsigned long arg3, void __user *arg4)
bool success = false; bool success = false;
if (subcmd == 1) { if (subcmd == 1) {
success = ksu_allowxperm(db, src, tgt, cls, perm_set); success = ksu_allowxperm(db, s, t, c, perm_set);
} else if (subcmd == 2) { } else if (subcmd == 2) {
success = ksu_auditallowxperm(db, src, tgt, cls, success = ksu_auditallowxperm(db, s, t, c, perm_set);
perm_set);
} else if (subcmd == 3) { } else if (subcmd == 3) {
success = success = ksu_dontauditxperm(db, s, t, c, perm_set);
ksu_dontauditxperm(db, src, tgt, cls, perm_set);
} else { } else {
pr_err("sepol: unknown subcmd: %d", subcmd); pr_err("sepol: unknown subcmd: %d", subcmd);
} }