Blob Blame History Raw
From 72b8c0856ace652a57145ea58b0bec9d67d23851 Mon Sep 17 00:00:00 2001
From: Eduardo Otubo <otubo@redhat.com>
Date: Tue, 7 Apr 2020 07:03:37 +0200
Subject: [PATCH] seccomp: set the seccomp filter to all threads
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

RH-Author: Eduardo Otubo <otubo@redhat.com>
Message-id: <20200305125537.4031-1-otubo@redhat.com>
Patchwork-id: 94159
O-Subject: [RHEL-7.9 qemu-kvm-rhev PATCH] seccomp: set the seccomp filter to all threads
Bugzilla: 1618504 1622976
RH-Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com>
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
RH-Acked-by: Mohammed Gamal <mgamal@redhat.com>

BZ: 1618504
BRANCH: rhv78/master
BREW: 27052907

commit 70dfabeaa79ba4d7a3b699abe1a047c8012db114
Author: Marc-André Lureau <marcandre.lureau@redhat.com>
Date:   Wed Aug 22 19:02:50 2018 +0200

    When using "-seccomp on", the seccomp policy is only applied to the
    main thread, the vcpu worker thread and other worker threads created
    after seccomp policy is applied; the seccomp policy is not applied to
    e.g. the RCU thread because it is created before the seccomp policy is
    applied and SECCOMP_FILTER_FLAG_TSYNC isn't used.

    This can be verified with
    for task in /proc/`pidof qemu`/task/*; do cat $task/status | grep Secc ; done
    Seccomp:	2
    Seccomp:	0
    Seccomp:	0
    Seccomp:	2
    Seccomp:	2
    Seccomp:	2

    Starting with libseccomp 2.2.0 and kernel >= 3.17, we can use
    seccomp_attr_set(ctx, > SCMP_FLTATR_CTL_TSYNC, 1) to update the policy
    on all threads.

    libseccomp requirement was bumped to 2.2.0 in previous patch.
    libseccomp should fail to set the filter if it can't honour
    SCMP_FLTATR_CTL_TSYNC (untested), and thus -sandbox will now fail on
    kernel < 3.17.

    Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
    Acked-by: Eduardo Otubo <otubo@redhat.com>

Signed-off-by: Eduardo Otubo <otubo@redhat.com>
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
---
 qemu-seccomp.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/qemu-seccomp.c b/qemu-seccomp.c
index b770a77..a5455af 100644
--- a/qemu-seccomp.c
+++ b/qemu-seccomp.c
@@ -108,6 +108,11 @@ int seccomp_start(uint32_t seccomp_opts)
         goto seccomp_return;
     }
 
+    rc = seccomp_attr_set(ctx, SCMP_FLTATR_CTL_TSYNC, 1);
+    if (rc != 0) {
+        goto seccomp_return;
+    }
+
     for (i = 0; i < ARRAY_SIZE(blacklist); i++) {
         if (!(seccomp_opts & blacklist[i].set)) {
             continue;
-- 
1.8.3.1