From: Lennart Poettering Date: Wed, 30 May 2018 16:21:58 +0000 (+0200) Subject: smack: make mac_smack_fix() deal somewhat sensible with non-absolute paths X-Git-Tag: v239~180 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6696e2a63188a7e70865f2baa5ae2efc08a42083;p=thirdparty%2Fsystemd.git smack: make mac_smack_fix() deal somewhat sensible with non-absolute paths This tries to improve the mac_smack_fix() logic a bit, by properly handling non-absolute paths. It's still pretty broken though, which is sad for security technology: non-normalized paths (for example "/usr/../dev/sda") will still not be treated correctly. I am not sure how to fix that properly though, and I don't understand SMACK well enough to do so. This fix hence just fixes to most obvious glaring issue. --- diff --git a/src/basic/smack-util.c b/src/basic/smack-util.c index c3b11af491c..adabc1c3f9a 100644 --- a/src/basic/smack-util.c +++ b/src/basic/smack-util.c @@ -136,9 +136,22 @@ int mac_smack_fix(const char *path, LabelFixFlags flags) { if (!mac_smack_use()) return 0; - /* Path must be in /dev */ - if (!path_startswith(path, "/dev")) - return 0; + /* Path must be in /dev. Note that this check is pretty sloppy, as we might be called with non-normalized paths + * and hence not detect all cases of /dev. */ + + if (path_is_absolute(path)) { + if (!path_startswith(path, "/dev")) + return 0; + } else { + _cleanup_free_ char *cwd = NULL; + + r = safe_getcwd(&cwd); + if (r < 0) + return r; + + if (!path_startswith(cwd, "/dev")) + return 0; + } fd = open(path, O_NOFOLLOW|O_CLOEXEC|O_PATH); if (fd < 0) {