Activity log for bug #1408106

Date Who What changed Old value New value Message
2015-01-06 21:25:19 Jamie Strandboge bug added bug
2015-01-06 21:26:23 Jamie Strandboge description With the following use of overlayfs, we get a disconnected path: $ cat ./profile #include <tunables/global> profile foo { #include <abstractions/base> capability sys_admin, capability sys_chroot, mount, pivot_root, } $ cat ./overlay.c #include <alloca.h> #include <linux/sched.h> #include <stdio.h> #include <string.h> #include <sys/mount.h> #include <fcntl.h> #include <unistd.h> int main(int argc, char* argv[]) { int i = 0; int len = 0; int ret = 0; char* options; if (geteuid()) unshare(CLONE_NEWUSER); unshare(CLONE_NEWNS); for (i = 1; i < argc; i++) { if (i == 1) { len = strlen(argv[i]) + strlen("upperdir=,lowerdir=/") + 2; options = alloca(len); ret = snprintf(options, len, "upperdir=%s,lowerdir=/", argv[i]); } else { len = strlen(argv[i]) + strlen("upperdir=,lowerdir=/mnt") + 2; options = alloca(len); ret = snprintf(options, len, "upperdir=%s,lowerdir=/mnt", argv[i]); } mount("overlayfs", "/mnt", "overlayfs", MS_MGC_VAL, options); } chdir("/mnt"); pivot_root(".", "."); chroot("."); chdir("/"); execl("/bin/bash", "/bin/bash", NULL); } $ sudo apparmor_parser -r ./profile && aa-exec -p foo -- ./a.out /tmp [255] ... Dec 12 14:31:38 localhost kernel: [57278.040216] audit: type=1400 audit(1418387498.613:712): apparmor="DENIED" operation="exec" info="Failed name lookup - disconnected path" error=-13 profile="foo" name="/bin/bash" pid=18255 comm="a.out" requested_mask="x" denied_mask="x" fsuid=1000 ouid=0 With the above, the expectation was for the denial to be /tmp/bin/bash. There are three ways forward: 1. the correct solution is to patch overlayfs to properly track the loopback, but this will take a while, may ultimately be unachievable (investigation is needed) and is likely non-upstreamable 2. we could rely on the fact that overlayfs creates a private unshared submount, and provide a way to not mediate the path when that is present, and tagged. This would take a bit of time, and might be the preferred method over 1 longer term 3. we could extend attach_disconnected so that we can define the attach root. Eg, we can use profile foo (attach_disconnected=/tmp) {} such that '/bin/bash' maps to '/tmp/bin/bash'. While attach_disconnected should in general be discouraged, this method: * is doable in a short time frame, * is generally useful even when the proper fix is in place * would help lxc in a few cases * would be sufficient for snappy With the following use of overlayfs, we get a disconnected path: $ cat ./profile #include <tunables/global> profile foo {   #include <abstractions/base>   capability sys_admin,   capability sys_chroot,   mount,   pivot_root, } $ cat ./overlay.c #include <alloca.h> #include <linux/sched.h> #include <stdio.h> #include <string.h> #include <sys/mount.h> #include <fcntl.h> #include <unistd.h> int main(int argc, char* argv[]) {     int i = 0;     int len = 0;     int ret = 0;     char* options;     if (geteuid())         unshare(CLONE_NEWUSER);     unshare(CLONE_NEWNS);     for (i = 1; i < argc; i++) {         if (i == 1) {             len = strlen(argv[i]) + strlen("upperdir=,lowerdir=/") + 2;             options = alloca(len);             ret = snprintf(options, len, "upperdir=%s,lowerdir=/", argv[i]);         }         else {             len = strlen(argv[i]) + strlen("upperdir=,lowerdir=/mnt") + 2;             options = alloca(len);             ret = snprintf(options, len, "upperdir=%s,lowerdir=/mnt", argv[i]);         }         mount("overlayfs", "/mnt", "overlayfs", MS_MGC_VAL, options);     }     chdir("/mnt");     pivot_root(".", ".");     chroot(".");     chdir("/");     execl("/bin/bash", "/bin/bash", NULL); } $ sudo apparmor_parser -r ./profile && aa-exec -p foo -- ./a.out /tmp [255] ... Dec 12 14:31:38 localhost kernel: [57278.040216] audit: type=1400 audit(1418387498.613:712): apparmor="DENIED" operation="exec" info="Failed name lookup - disconnected path" error=-13 profile="foo" name="/bin/bash" pid=18255 comm="a.out" requested_mask="x" denied_mask="x" fsuid=1000 ouid=0 With the above, the expectation was for the denial to be /mnt/bin/bash. There are three ways forward: 1. the correct solution is to patch overlayfs to properly track the loopback, but this will take a while, may ultimately be unachievable (investigation is needed) and is likely non-upstreamable 2. we could rely on the fact that overlayfs creates a private unshared submount, and provide a way to not mediate the path when that is present, and tagged. This would take a bit of time, and might be the preferred method over 1 longer term 3. we could extend attach_disconnected so that we can define the attach root. Eg, we can use profile foo (attach_disconnected=/mnt) {} such that '/bin/bash' maps to '/mnt/bin/bash'. While attach_disconnected should in general be discouraged, this method:  * is doable in a short time frame,  * is generally useful even when the proper fix is in place  * would help lxc in a few cases  * would be sufficient for snappy
2015-01-06 21:26:53 Jamie Strandboge bug task added apparmor
2015-01-06 21:27:02 Jamie Strandboge apparmor: status New In Progress
2015-01-06 21:27:05 Jamie Strandboge apparmor: importance Undecided Critical
2015-01-06 21:27:13 Jamie Strandboge apparmor: assignee John Johansen (jjohansen)
2015-01-06 21:27:17 Jamie Strandboge apparmor (Ubuntu): status In Progress Confirmed
2015-01-06 21:27:32 Jamie Strandboge apparmor (Ubuntu): assignee John Johansen (jjohansen) Steve Beattie (sbeattie)
2015-01-06 21:27:39 Jamie Strandboge bug task added linux (Ubuntu)
2015-01-06 21:27:59 Jamie Strandboge linux (Ubuntu): importance Undecided Critical
2015-01-06 21:27:59 Jamie Strandboge linux (Ubuntu): status New Confirmed
2015-01-06 21:27:59 Jamie Strandboge linux (Ubuntu): assignee John Johansen (jjohansen)
2015-01-06 22:02:59 Joseph Salisbury tags aa-kernel aa-parser aa-tools aa-kernel aa-parser aa-tools kernel-key
2015-01-08 15:03:01 Jamie Strandboge summary allow defining the attach root for attach_disconnected attach_disconnected not sufficient for overlayfs
2015-01-13 15:32:35 Joseph Salisbury tags aa-kernel aa-parser aa-tools kernel-key aa-kernel aa-parser aa-tools kernel-da-key
2015-02-05 16:24:38 Chris Cormier bug added subscriber Chris Cormier
2015-02-24 22:28:10 Jamie Strandboge description With the following use of overlayfs, we get a disconnected path: $ cat ./profile #include <tunables/global> profile foo {   #include <abstractions/base>   capability sys_admin,   capability sys_chroot,   mount,   pivot_root, } $ cat ./overlay.c #include <alloca.h> #include <linux/sched.h> #include <stdio.h> #include <string.h> #include <sys/mount.h> #include <fcntl.h> #include <unistd.h> int main(int argc, char* argv[]) {     int i = 0;     int len = 0;     int ret = 0;     char* options;     if (geteuid())         unshare(CLONE_NEWUSER);     unshare(CLONE_NEWNS);     for (i = 1; i < argc; i++) {         if (i == 1) {             len = strlen(argv[i]) + strlen("upperdir=,lowerdir=/") + 2;             options = alloca(len);             ret = snprintf(options, len, "upperdir=%s,lowerdir=/", argv[i]);         }         else {             len = strlen(argv[i]) + strlen("upperdir=,lowerdir=/mnt") + 2;             options = alloca(len);             ret = snprintf(options, len, "upperdir=%s,lowerdir=/mnt", argv[i]);         }         mount("overlayfs", "/mnt", "overlayfs", MS_MGC_VAL, options);     }     chdir("/mnt");     pivot_root(".", ".");     chroot(".");     chdir("/");     execl("/bin/bash", "/bin/bash", NULL); } $ sudo apparmor_parser -r ./profile && aa-exec -p foo -- ./a.out /tmp [255] ... Dec 12 14:31:38 localhost kernel: [57278.040216] audit: type=1400 audit(1418387498.613:712): apparmor="DENIED" operation="exec" info="Failed name lookup - disconnected path" error=-13 profile="foo" name="/bin/bash" pid=18255 comm="a.out" requested_mask="x" denied_mask="x" fsuid=1000 ouid=0 With the above, the expectation was for the denial to be /mnt/bin/bash. There are three ways forward: 1. the correct solution is to patch overlayfs to properly track the loopback, but this will take a while, may ultimately be unachievable (investigation is needed) and is likely non-upstreamable 2. we could rely on the fact that overlayfs creates a private unshared submount, and provide a way to not mediate the path when that is present, and tagged. This would take a bit of time, and might be the preferred method over 1 longer term 3. we could extend attach_disconnected so that we can define the attach root. Eg, we can use profile foo (attach_disconnected=/mnt) {} such that '/bin/bash' maps to '/mnt/bin/bash'. While attach_disconnected should in general be discouraged, this method:  * is doable in a short time frame,  * is generally useful even when the proper fix is in place  * would help lxc in a few cases  * would be sufficient for snappy With the following use of overlayfs, we get a disconnected path: $ cat ./profile #include <tunables/global> profile foo {   #include <abstractions/base>   capability sys_admin,   capability sys_chroot,   mount,   pivot_root, } $ cat ./overlay.c #include <alloca.h> #include <linux/sched.h> #include <stdio.h> #include <string.h> #include <sys/mount.h> #include <fcntl.h> #include <unistd.h> int main(int argc, char* argv[]) {     int i = 0;     int len = 0;     int ret = 0;     char* options;     if (geteuid())         unshare(CLONE_NEWUSER);     unshare(CLONE_NEWNS);     for (i = 1; i < argc; i++) {         if (i == 1) {             len = strlen(argv[i]) + strlen("upperdir=,lowerdir=/") + 2;             options = alloca(len);             ret = snprintf(options, len, "upperdir=%s,lowerdir=/", argv[i]);         }         else {             len = strlen(argv[i]) + strlen("upperdir=,lowerdir=/mnt") + 2;             options = alloca(len);             ret = snprintf(options, len, "upperdir=%s,lowerdir=/mnt", argv[i]);         }         mount("overlayfs", "/mnt", "overlayfs", MS_MGC_VAL, options);     }     chdir("/mnt");     pivot_root(".", ".");     chroot(".");     chdir("/");     execl("/bin/bash", "/bin/bash", NULL); } $ sudo apparmor_parser -r ./profile && aa-exec -p foo -- ./a.out /tmp [255] ... Dec 12 14:31:38 localhost kernel: [57278.040216] audit: type=1400 audit(1418387498.613:712): apparmor="DENIED" operation="exec" info="Failed name lookup - disconnected path" error=-13 profile="foo" name="/bin/bash" pid=18255 comm="a.out" requested_mask="x" denied_mask="x" fsuid=1000 ouid=0 With the above, the expectation was for the denial to be /mnt/bin/bash. There are three ways forward: 1. the correct solution is to patch overlayfs to properly track the loopback, but this will take a while, may ultimately be unachievable (investigation is needed) 2. we could rely on the fact that overlayfs creates a private unshared submount, and provide a way to not mediate the path when that is present, and tagged. This would take a bit of time, and might be the preferred method over 1 longer term 3. we could extend attach_disconnected so that we can define the attach root. Eg, we can use profile foo (attach_disconnected=/mnt) {} such that '/bin/bash' maps to '/mnt/bin/bash'. UPDATE: THIS IS NOT VIABLE
2015-03-13 07:42:32 gustavo panizzo bug added subscriber gustavo panizzo
2015-04-13 22:08:17 Jamie Strandboge description With the following use of overlayfs, we get a disconnected path: $ cat ./profile #include <tunables/global> profile foo {   #include <abstractions/base>   capability sys_admin,   capability sys_chroot,   mount,   pivot_root, } $ cat ./overlay.c #include <alloca.h> #include <linux/sched.h> #include <stdio.h> #include <string.h> #include <sys/mount.h> #include <fcntl.h> #include <unistd.h> int main(int argc, char* argv[]) {     int i = 0;     int len = 0;     int ret = 0;     char* options;     if (geteuid())         unshare(CLONE_NEWUSER);     unshare(CLONE_NEWNS);     for (i = 1; i < argc; i++) {         if (i == 1) {             len = strlen(argv[i]) + strlen("upperdir=,lowerdir=/") + 2;             options = alloca(len);             ret = snprintf(options, len, "upperdir=%s,lowerdir=/", argv[i]);         }         else {             len = strlen(argv[i]) + strlen("upperdir=,lowerdir=/mnt") + 2;             options = alloca(len);             ret = snprintf(options, len, "upperdir=%s,lowerdir=/mnt", argv[i]);         }         mount("overlayfs", "/mnt", "overlayfs", MS_MGC_VAL, options);     }     chdir("/mnt");     pivot_root(".", ".");     chroot(".");     chdir("/");     execl("/bin/bash", "/bin/bash", NULL); } $ sudo apparmor_parser -r ./profile && aa-exec -p foo -- ./a.out /tmp [255] ... Dec 12 14:31:38 localhost kernel: [57278.040216] audit: type=1400 audit(1418387498.613:712): apparmor="DENIED" operation="exec" info="Failed name lookup - disconnected path" error=-13 profile="foo" name="/bin/bash" pid=18255 comm="a.out" requested_mask="x" denied_mask="x" fsuid=1000 ouid=0 With the above, the expectation was for the denial to be /mnt/bin/bash. There are three ways forward: 1. the correct solution is to patch overlayfs to properly track the loopback, but this will take a while, may ultimately be unachievable (investigation is needed) 2. we could rely on the fact that overlayfs creates a private unshared submount, and provide a way to not mediate the path when that is present, and tagged. This would take a bit of time, and might be the preferred method over 1 longer term 3. we could extend attach_disconnected so that we can define the attach root. Eg, we can use profile foo (attach_disconnected=/mnt) {} such that '/bin/bash' maps to '/mnt/bin/bash'. UPDATE: THIS IS NOT VIABLE With the following use of overlayfs, we get a disconnected path: $ cat ./profile #include <tunables/global> profile foo {   #include <abstractions/base>   capability sys_admin,   capability sys_chroot,   mount,   pivot_root, } $ cat ./overlay.c #include <alloca.h> #include <linux/sched.h> #include <stdio.h> #include <string.h> #include <sys/mount.h> #include <fcntl.h> #include <unistd.h> int main(int argc, char* argv[]) {     int i = 0;     int len = 0;     int ret = 0;     char* options;     if (geteuid())         unshare(CLONE_NEWUSER);     unshare(CLONE_NEWNS);     for (i = 1; i < argc; i++) {         if (i == 1) {             len = strlen(argv[i]) + strlen("upperdir=,lowerdir=/") + 2;             options = alloca(len);             ret = snprintf(options, len, "upperdir=%s,lowerdir=/", argv[i]);         }         else {             len = strlen(argv[i]) + strlen("upperdir=,lowerdir=/mnt") + 2;             options = alloca(len);             ret = snprintf(options, len, "upperdir=%s,lowerdir=/mnt", argv[i]);         }         mount("overlayfs", "/mnt", "overlayfs", MS_MGC_VAL, options);     }     chdir("/mnt");     pivot_root(".", ".");     chroot(".");     chdir("/");     execl("/bin/bash", "/bin/bash", NULL); } $ sudo apparmor_parser -r ./profile && aa-exec -p foo -- ./a.out /tmp [255] ... Dec 12 14:31:38 localhost kernel: [57278.040216] audit: type=1400 audit(1418387498.613:712): apparmor="DENIED" operation="exec" info="Failed name lookup - disconnected path" error=-13 profile="foo" name="/bin/bash" pid=18255 comm="a.out" requested_mask="x" denied_mask="x" fsuid=1000 ouid=0 With the above, the expectation was for the denial to be /mnt/bin/bash. There are three ways forward: 1. the correct solution is to patch overlayfs to properly track the loopback, but this will take a while, may ultimately be unachievable. UPDATE: upstream is currently working on this and Ubuntu will engage with them 2. we could rely on the fact that overlayfs creates a private unshared submount, and provide a way to not mediate the path when that is present, and tagged. This would take a bit of time, and might be the preferred method over 1 longer term 3. we could extend attach_disconnected so that we can define the attach root. Eg, we can use profile foo (attach_disconnected=/mnt) {} such that '/bin/bash' maps to '/mnt/bin/bash'. UPDATE: THIS IS NOT VIABLE
2016-01-25 09:08:01 penalvch linux (Ubuntu): status Confirmed Triaged
2016-12-13 09:48:19 Gael bug added subscriber Gael
2017-04-04 15:33:54 LaMont Jones bug task added maas
2017-04-04 16:37:33 Joseph Salisbury tags aa-kernel aa-parser aa-tools kernel-da-key aa-kernel aa-parser aa-tools
2017-05-16 21:44:12 Jamie Strandboge linux (Ubuntu): status Triaged Won't Fix
2017-05-16 21:44:16 Jamie Strandboge apparmor (Ubuntu): status Confirmed Won't Fix
2017-05-16 21:44:18 Jamie Strandboge apparmor: status In Progress Invalid
2017-05-16 21:44:21 Jamie Strandboge apparmor (Ubuntu): status Won't Fix Invalid
2017-05-16 21:44:24 Jamie Strandboge linux (Ubuntu): status Won't Fix Invalid
2017-05-16 21:46:50 Jamie Strandboge maas: status New Incomplete
2017-07-06 17:12:39 Andres Rodriguez maas: status Incomplete Invalid
2017-07-07 16:48:19 Tyler Hicks bug added subscriber Tyler Hicks