From patchwork Tue Mar 14 11:32:09 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eduardo Otubo X-Patchwork-Id: 738662 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3vjCMj3Ns8z9s2G for ; Tue, 14 Mar 2017 22:35:13 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=profitbricks-com.20150623.gappssmtp.com header.i=@profitbricks-com.20150623.gappssmtp.com header.b="YWxCOLa+"; dkim-atps=neutral Received: from localhost ([::1]:57872 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cnkjO-0002Gs-Te for incoming@patchwork.ozlabs.org; Tue, 14 Mar 2017 07:35:10 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53019) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cnkgb-0000iU-Gf for qemu-devel@nongnu.org; Tue, 14 Mar 2017 07:32:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cnkga-00088N-2F for qemu-devel@nongnu.org; Tue, 14 Mar 2017 07:32:17 -0400 Received: from mail-wm0-x22f.google.com ([2a00:1450:400c:c09::22f]:37822) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cnkgZ-000873-SM for qemu-devel@nongnu.org; Tue, 14 Mar 2017 07:32:15 -0400 Received: by mail-wm0-x22f.google.com with SMTP id n11so61327877wma.0 for ; Tue, 14 Mar 2017 04:32:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=profitbricks-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=iJ5AmwIxu5nb9t8OSY6QVm80f4XIhI3rOSl9KQ8tKVI=; b=YWxCOLa+OZIBGWYj4pAzDfk/Z0IYY9inQk8rK0Iry3M/6se2YUU5g+dT0toLCw7WRJ R8sQrnN0HX7T3I+xQStY1q0uvAkTAp9+Dhg+kEdVQm/Y5NmxyAighoTuuVEpzGtwdcli q4lJqJ2w6dm3uoFJ0p1Sohq3z+qhEy1eq4gm5KhZXt69ojWiAoWRUPL4uYhYm5CABqyn hnX9DOLfIXExgae4vT0v1JiotrYjdbViKzANAh7mxT5qssOWedpksYk1PG91nOeUtE36 FH7SdBZfIJYcDP3RUVeLptmscWeNYVm7PmTYPum4XRw19aNM4iKMLo9vRQXwuM0ZFF9A 9yKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=iJ5AmwIxu5nb9t8OSY6QVm80f4XIhI3rOSl9KQ8tKVI=; b=bnEC+ggwsCoFfNTISATZqW9RQ1TOrGKNhnACCHa+OA+qJLTeDBwNQny/LgSyVHyQUq 6xgwWkxquEAdh2SPaqI8FGJGWgiIzgTzu5naPIsIfrRFMzpr4rJcLtz5CLGk9pdcw2ti BTrg3J5NahaK6p5EnzriZEO0ET7Tp764O3tRMI7R1arKoJV2MAa/3RBVzW6VDSaog820 BcEyXJNtWJWDBz1V28YvAUEub+3ZSsLJu51pRjQkBHcn8xuYzdwg2Ni43Kr//wzpHmQ7 OZvCITEuDvTq5cMHZCmgZEJtjYD5WTe9lb2eMBylaSZD4vKJ3ms86L4Q68FnDcyQqVje X9Fw== X-Gm-Message-State: AFeK/H3tlHfrWrvP8MdQwUwSCxRQ5MaIVa3oSaNgc7NTZupXUbd3wDFAlFFK2eipU0urUnQn X-Received: by 10.28.111.3 with SMTP id k3mr14072629wmc.39.1489491134791; Tue, 14 Mar 2017 04:32:14 -0700 (PDT) Received: from vader.pb.local ([62.217.45.26]) by smtp.gmail.com with ESMTPSA id n59sm28846267wrb.54.2017.03.14.04.32.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 14 Mar 2017 04:32:14 -0700 (PDT) From: Eduardo Otubo To: qemu-devel@nongnu.org Date: Tue, 14 Mar 2017 12:32:09 +0100 Message-Id: <20170314113209.12025-6-eduardo.otubo@profitbricks.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170314113209.12025-1-eduardo.otubo@profitbricks.com> References: <20170314113209.12025-1-eduardo.otubo@profitbricks.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:400c:c09::22f Subject: [Qemu-devel] [PATCH 5/5] seccomp: add resourcecontrol argument to command line X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" This patch adds [,resourcecontrol=deny] to `-sandbox on' option. It blacklists all process affinity and scheduler priority system calls to avoid any bigger of the process. Signed-off-by: Eduardo Otubo --- include/sysemu/seccomp.h | 1 + qemu-options.hx | 5 ++++- qemu-seccomp.c | 26 ++++++++++++++++++++++++++ vl.c | 11 +++++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/include/sysemu/seccomp.h b/include/sysemu/seccomp.h index f1614d6514..c7003dd197 100644 --- a/include/sysemu/seccomp.h +++ b/include/sysemu/seccomp.h @@ -18,6 +18,7 @@ #define OBSOLETE 0x0001 #define PRIVILEGED 0x0010 #define SPAWN 0x0100 +#define RESOURCECTL 0x1000 #include diff --git a/qemu-options.hx b/qemu-options.hx index 53f4f8cfd2..5784ffe4b1 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -3732,11 +3732,12 @@ Old param mode (ARM only). ETEXI DEF("sandbox", HAS_ARG, QEMU_OPTION_sandbox, \ - "-sandbox on[,obsolete=allow][,elevateprivileges=deny][,spawn=deny]" \ + "-sandbox on[,obsolete=allow][,elevateprivileges=deny][,spawn=deny][,resourcecontrol=deny]\n" \ " Enable seccomp mode 2 system call filter (default 'off').\n" \ " obsolete: Allow obsolete system calls\n" \ " elevateprivileges: avoids Qemu process to elevate its privileges by blacklisting all set*uid|gid system calls\n" \ " spawn: avoids Qemu to spawn new threads or processes by blacklisting *fork and execve\n" + " resourcecontrol: disable process affinity and schedular priority\n", QEMU_ARCH_ALL) STEXI @item -sandbox @var{arg}[,obsolete=@var{string}] @@ -3750,6 +3751,8 @@ Enable Obsolete system calls Disable set*uid|gid systema calls @item spawn=@var{string} Disable *fork and execve +@item resourcecontrol=@var{string} +Disable process affinity and schedular priority @end table ETEXI diff --git a/qemu-seccomp.c b/qemu-seccomp.c index 4c1f7b41ba..dec47e9a74 100644 --- a/qemu-seccomp.c +++ b/qemu-seccomp.c @@ -31,6 +31,19 @@ struct QemuSeccompSyscall { uint8_t priority; }; +static const struct QemuSeccompSyscall resourcecontrol_syscalls[] = { + { SCMP_SYS(getpriority), 255 }, + { SCMP_SYS(setpriority), 255 }, + { SCMP_SYS(sched_setparam), 255 }, + { SCMP_SYS(sched_getparam), 255 }, + { SCMP_SYS(sched_setscheduler), 255 }, + { SCMP_SYS(sched_getscheduler), 255 }, + { SCMP_SYS(sched_setaffinity), 255 }, + { SCMP_SYS(sched_getaffinity), 255 }, + { SCMP_SYS(sched_get_priority_max), 255 }, + { SCMP_SYS(sched_get_priority_min), 255 }, +}; + static const struct QemuSeccompSyscall spawn_syscalls[] = { { SCMP_SYS(fork), 255 }, { SCMP_SYS(vfork), 255 }, @@ -171,6 +184,19 @@ int seccomp_start(uint8_t seccomp_opts) } } + if (seccomp_opts & RESOURCECTL) { + for (i = 0; i < ARRAY_SIZE(resourcecontrol_syscalls); i++) { + rc = seccomp_rule_add(ctx, SCMP_ACT_KILL, resourcecontrol_syscalls[i].num, 0); + if (rc < 0) { + goto seccomp_return; + } + rc = seccomp_syscall_priority(ctx, resourcecontrol_syscalls[i].num, resourcecontrol_syscalls[i].priority); + if (rc < 0) { + goto seccomp_return; + } + } + } + rc = seccomp_load(ctx); seccomp_return: diff --git a/vl.c b/vl.c index 6a6e9a69bf..3ceffef094 100644 --- a/vl.c +++ b/vl.c @@ -281,6 +281,10 @@ static QemuOptsList qemu_sandbox_opts = { .name = "spawn", .type = QEMU_OPT_STRING, }, + { + .name = "resourcecontrol", + .type = QEMU_OPT_STRING, + }, { /* end of list */ } }, }; @@ -1067,6 +1071,13 @@ static int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp) } } + value = qemu_opt_get(opts,"resourcecontrol"); + if (value) { + if (strcmp(value, "deny") == 0) { + seccomp_opts |= RESOURCECTL; + } + } + if (seccomp_start(seccomp_opts) < 0) { error_report("failed to install seccomp syscall filter " "in the kernel");