Two Disco containers (one per PPA) $ sudo add-apt-repository ppa:paelzer/bug-1830859-with-proposed-seccomp or $ sudo add-apt-repository ppa:paelzer/bug-1830859-without-proposed-seccomp # add main/debug and enable the deb-src in the PPA sources
$ sudo apt install gdb qemu-system-x86 qemu-system-x86-dbgsym dpkg-dev $ apt source qemu $ cd qemu-3.1+dfsg/ break on qemu_seccomp Hrm ?? equal qemu source Good: Breakpoint 1 at 0x4d63f4: file ./qemu-seccomp.c, line 293. Bad: Breakpoint 1 at 0x4d63f4: qemu_seccomp. (2 location (gdb) info b Num Type Disp Enb Address What 1 breakpoint keep y <MULTIPLE> 1.1 y 0x00000000004d63f4 in qemu_seccomp at ./qemu-seccomp.c:293 1.2 y 0x00000000004d656e in qemu_seccomp at ./qemu-seccomp.c:244 Now the second hit isn't an actual qemu_seccomp call, but it is very close to the error that we get reported. (gdb) l qemu-seccomp.c:293 288 289 #if defined(SECCOMP_FILTER_FLAG_TSYNC) 290 int check; 291 292 /* check host TSYNC capability, it returns errno == ENOSYS if unavailable */ 293 check = qemu_seccomp(SECCOMP_SET_MODE_FILTER, 294 SECCOMP_FILTER_FLAG_TSYNC, NULL); 295 if (check < 0 && errno == EFAULT) { 296 add = true; 297 } (gdb) l qemu-seccomp.c:244 239 error_setg(errp, "invalid argument for resourcecontrol"); 240 return -1; 241 } 242 } 243 244 if (seccomp_start(seccomp_opts) < 0) { 245 error_setg(errp, "failed to install seccomp syscall filter " 246 "in the kernel"); 247 return -1; 248 } Well maybe with seccomp 2.4 development headers something changed and this now gets inlined? That is not an error, but suspicious. qemu_seccomp should ALWAYS be inlined static inline __attribute__((unused)) int qemu_seccomp(unsigned int operation, unsigned int flags, void *args) The one at line 293 is at seccomp_register and depends on #if defined(SECCOMP_FILTER_FLAG_TSYNC). This one is active in both cases. But the one at line 244 is part of qemu_seccomp_get_kill_action That has some checks as well being: #if defined(SECCOMP_GET_ACTION_AVAIL) && \ defined(SCMP_ACT_KILL_PROCESS) && \ defined(SECCOMP_RET_KILL_PROCESS) There is no other way to "avoid" the path of parse_sandbox -> seccomp_start -> qemu_seccomp_get_kill_action -> qemu_seccomp in terms of precompiler. Both have CONFIG_SECCOMP set, so it might really come down to the three checks above. Reading the commit [1] that added this to qemu seems to match the current theories. Lets see what happens when it tries to use things buildt with 2.4 but without 2.4 being installed at runtime. The returned value for action is matching expected /usr/include/seccomp.h numbers: - good case => 196608 ==> SCMP_ACT_TRAP = 0x00030000U - bad case => 2147483648 ==> SCMP_ACT_KILL_PROCESS = 0x80000000U As a summary: - the libseccomp-dev 2.4 headers being installed at build time - code can detect now the availability of SCMP_ACT_KILL_PROCESS - code might decide to use SCMP_ACT_KILL_PROCESS - if code runs without libseccomp2 2.4 installed it breaks For qemu I could patch out the usage of SCMP_ACT_KILL_PROCESS, but: - that is stupid as it is preferred if available - the question is either - how can we make such rebuilds pick up the dependency correctly - could we runtime (instead of compile time) detect if SCMP_ACT_KILL_PROCESS is available [1]: https://git.qemu.org/?p=qemu.git;a=commit;h=bda08a5764d ** Description changed: It started with some of my usual KVM checks and found them failing on Disco with: error: internal error: process exited while connecting to monitor: 2019-05-28T17:10:17.121934Z qemu-system-x86_64: -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny: failed to install seccomp syscall filter in the kernel I realized it works on X/B/C/E but not in a D container It worked ~4 weeks ago. This test can be simplified to one command: $ qemu-system-x86_64 -enable-kvm -nographic -nodefaults -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny With strace I found different behavior: Good: [pid 3487] 0.000000 seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC, NULL) = -1 EFAULT (Bad address) <0.000011> [pid 3487] 0.003136 seccomp(SECCOMP_SET_MODE_STRICT, 1, NULL) = -1 EINVAL (Invalid argument) <0.000044> [pid 3487] 0.000250 seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC, {len=68, filter=0x55f2b7a5e2d0}) = 0 <0.000251> Bad: [pid 484] 0.000000 seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC, NULL) = -1 EFAULT (Bad address) <0.000017> [pid 484] 0.002680 seccomp(SECCOMP_GET_ACTION_AVAIL, 0, [SECCOMP_RET_KILL_PROCESS]) = 0 <0.000014> [pid 484] 0.000088 seccomp(SECCOMP_SET_MODE_STRICT, 1, NULL) = -1 EINVAL (Invalid argument) <0.000013> The difference seems to come from being built against seccomp as in Disco (2.3.3-3ubuntu2 = good) or Disco-proposed ( = bad). The dependency on the built package stayed libseccomp2 (>= 2.3.0) It did not pick up 2.4 via e.g. shlibs. If I install libseccomp2 2.4 from -proposed the issue is gone. Strace now looks like: [pid 1788] 0.000000 seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC, NULL) = -1 EFAULT (Bad address) <0.000015> [pid 1788] 0.004167 seccomp(SECCOMP_GET_ACTION_AVAIL, 0, [SECCOMP_RET_KILL_PROCESS]) = 0 <0.000013> [pid 1788] 0.000098 seccomp(SECCOMP_SET_MODE_STRICT, 1, NULL) = -1 EINVAL (Invalid argument) <0.000013> [pid 1788] 0.000054 seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC, NULL) = -1 EFAULT (Bad address) <0.000022> [pid 1788] 0.000061 seccomp(SECCOMP_GET_ACTION_AVAIL, 0, [SECCOMP_RET_KILL_PROCESS]) = 0 <0.000017> [pid 1788] 0.001477 seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC, {len=68, filter=0x564de3852560}) = 0 <0.000288> This is in all releases proposed to fix CVE-2019-9893 I was just ?lucky? to pick it up with my qemu build in the PPA that has proposed enabled. Now there might be some toolchain detail to this as well. As I built qemu for B/C as well and they built against the proposed 2.4 versions as well. But in B/C things work with new qemu builds and old libseccomp2 installed. Eoan on the other hand works by having libseccomp2 2.4.1-0ubuntu0.19.10.3 already migrated. But that "luck" of B/C working might be specific to Qemus code, other rebuilds against the new libseccomp2 might fail as well in B/C and further. Shlibs detection is based on these symbols but my new qemu build is not calling these so it dependency stays at 2.3. Until a simpler testcase is found, I have set up two new PPAs: https://launchpad.net/~paelzer/+archive/ubuntu/bug-1830859-with-proposed-seccomp https://launchpad.net/~paelzer/+archive/ubuntu/bug-1830859-without-proposed-seccomp + In comment #5 I debugged the case and found the new "dependency" + As a summary: + - the libseccomp-dev 2.4 headers being installed at build time + - code can detect now the availability of SCMP_ACT_KILL_PROCESS + - code might decide to use SCMP_ACT_KILL_PROCESS + - if code runs without libseccomp2 2.4 installed it breaks + + ### some related Build logs ### Cosmic rebuild against 2.4, not affected by the issue https://launchpad.net/~ci-train-ppa-service/+archive/ubuntu/3729/+build/16858331/+files/buildlog_ubuntu-cosmic-amd64.qemu_1%3A2.12+dfsg-3ubuntu8.9~ppa1_BUILDING.txt.gz Disco rebuild against 2.4, affected by the issue https://launchpadlibrarian.net/425689546/buildlog_ubuntu-disco-amd64.qemu_1%3A3.1+dfsg-2ubuntu3.2~ppa1_BUILDING.txt.gz Disco build against 2.3 (working) https://launchpadlibrarian.net/422884897/buildlog_ubuntu-disco-amd64.qemu_1%3A3.1+dfsg-2ubuntu3.1_BUILDING.txt.gz -- You received this bug notification because you are a member of Ubuntu Bugs, which is subscribed to Ubuntu. https://bugs.launchpad.net/bugs/1830859 Title: new libseccomp 2.4 (in proposed) makes rebuilds need but not generate a dependency to 2.4 To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+source/libseccomp/+bug/1830859/+subscriptions -- ubuntu-bugs mailing list ubuntu-bugs@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs