On Tue, 2021-06-29 at 14:38 +0800, Tianxing Zhang wrote: > Hi, I was reading the function ima_write_policy in ima/ima_fs.c when > I find the issue: > > > static ssize_t ima_write_policy(struct file *file, const char > __user *buf, > > size_t datalen, loff_t > *ppos) > > { > > ... > > > > if (data[0] == '/') { > > result = ima_read_policy(data); > > } else if (ima_appraise & IMA_APPRAISE_POLICY) { > > pr_err("signed policy file (specified as an > absolute pathname) required\n"); > > integrity_audit_msg(AUDIT_INTEGRITY_STATUS, NULL, > NULL, > > "policy_update", > "signed policy required", > > 1, 0); > > ... > > return result; > > } > > For the absolute path written by the user, we only check the prefix > "/". Actually, we can echo an illegal path to the > /sys/kernel/security/ima/policy, e.g. "/\rtest: ddddddddddddddddddd" > to inject some logs into dmesg. > > Then ima_read_policy is called to return error: > > > static ssize_t ima_read_policy(char *path) > > { > > ... > > rc = kernel_read_file_from_path(path, 0, &data, INT_MAX, > NULL, > > > READING_POLICY); > > if (rc < 0) { > > pr_err("Unable to open file: %s (%d)", path, rc); > > return rc; > > } > > ... > > } > > In ima_read_policy, the illegal path would be logged into dmesg like > this: > > > ... > > test: ddddddddddddddddddd (-2)/ > > test: ddddddddddddddddddd (-2)/ > > test: ddddddddddddddddddd (-2)/ > > test: ddddddddddddddddddd (-2)/ > > I suggest that we should check the path in ima_write_policy to make > sure it's a valid one, at least literally. Sure. In the case that the path isn't valid, perhaps instead of removing the message entirely, limit the number of messages emitted using pr_err_once(). thanks, Mimi