Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp34170pxb; Tue, 17 Nov 2020 19:34:37 -0800 (PST) X-Google-Smtp-Source: ABdhPJzhtVFDCbsNP8zMtYRblNZYbqjwF1WpfNhp6gLYtGPsX0hS7zTzX/n+B+VdiEOlVaKSGE1H X-Received: by 2002:a17:907:250b:: with SMTP id y11mr1629593ejl.39.1605670477158; Tue, 17 Nov 2020 19:34:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1605670477; cv=none; d=google.com; s=arc-20160816; b=GYSWz1eMeivQSIcyNbRPE9yr7yS9Pca8uiZ/K8qjtQ7ZCCfi+nmn4bWO2O8NK9NT11 REpfnf+FTSnQwY/2yRWs5zbbLStpf9NRI2+6cykx53SAE7Mycl59d2LjSLjeZjn0UGbo 25jfDPmVGjfkT37xoYiPTz+asp0jr+7eNVwFotXkRGKq7frizXZllnDCn2lYSrA5EnBe FV9TdqGSVf9YUkx1zkSwKatLGkwKlc1uOwtyirNauIn6qTcu9ayTGD2sT2nE4Vxyo4Zj As3cI4fjreqi1bnM4nICQU+g8IE7uEiD38O4fpRjF+pfAKtYJIYLswqO1LY9J+2h5+cp BKXQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=voaWXKBrS3JGwQFfLMuJFjUwsO4Oc7/TE9QojqOuPtg=; b=Do0+iyWU00TzQwLXjXPBYY2ItaDL4zjROIOBGNDZ3bFWyEwbQBKt8sUeBNccSzQ/cV C4fR6bQyuKno89PLKdZ3CLBeNiL0MAdOc64z9c15dFuXf1HRlf5V5Hk6woPjg85Y5gKZ V6FPxPBCgAJVfjrIsPz/gQZpUAPZ+wLUA/xXu/scAdX7mFAwMQk30mSoQrr5adOiN70u VLVoBSYfBfKf7ddDFm8xrGO68naj48wLp53izXjrWBck+znHClNMybd/7G/B4Zgi9QuT OgW/qfPoZFVuXf99F7SwDjkgGobdviR5uwKlK3dHmbbIJMUyxLvL1/eeme2in0jdd4+L mtIg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id j17si14666193ejv.267.2020.11.17.19.34.14; Tue, 17 Nov 2020 19:34:37 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727909AbgKRD3Z (ORCPT + 99 others); Tue, 17 Nov 2020 22:29:25 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:55438 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726769AbgKRD3Y (ORCPT ); Tue, 17 Nov 2020 22:29:24 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: krisman) with ESMTPSA id 041B41F44AB3 From: Gabriel Krisman Bertazi To: luto@kernel.org, tglx@linutronix.de, keescook@chromium.org Cc: christian.brauner@ubuntu.com, peterz@infradead.org, willy@infradead.org, shuah@kernel.org, linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, linux-kselftest@vger.kernel.org, x86@kernel.org, gofmanp@gmail.com, Gabriel Krisman Bertazi , kernel@collabora.com Subject: [PATCH v7 7/7] docs: Document Syscall User Dispatch Date: Tue, 17 Nov 2020 22:28:40 -0500 Message-Id: <20201118032840.3429268-8-krisman@collabora.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201118032840.3429268-1-krisman@collabora.com> References: <20201118032840.3429268-1-krisman@collabora.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Explain the interface, provide some background and security notes. Signed-off-by: Gabriel Krisman Bertazi Reviewed-by: Kees Cook --- .../admin-guide/syscall-user-dispatch.rst | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 Documentation/admin-guide/syscall-user-dispatch.rst diff --git a/Documentation/admin-guide/syscall-user-dispatch.rst b/Documentation/admin-guide/syscall-user-dispatch.rst new file mode 100644 index 000000000000..e2fb36926f97 --- /dev/null +++ b/Documentation/admin-guide/syscall-user-dispatch.rst @@ -0,0 +1,87 @@ +.. SPDX-License-Identifier: GPL-2.0 + +===================== +Syscall User Dispatch +===================== + +Background +---------- + +Compatibility layers like Wine need a way to efficiently emulate system +calls of only a part of their process - the part that has the +incompatible code - while being able to execute native syscalls without +a high performance penalty on the native part of the process. Seccomp +falls short on this task, since it has limited support to efficiently +filter syscalls based on memory regions, and it doesn't support removing +filters. Therefore a new mechanism is necessary. + +Syscall User Dispatch brings the filtering of the syscall dispatcher +address back to userspace. The application is in control of a flip +switch, indicating the current personality of the process. A +multiple-personality application can then flip the switch without +invoking the kernel, when crossing the compatibility layer API +boundaries, to enable/disable the syscall redirection and execute +syscalls directly (disabled) or send them to be emulated in userspace +through a SIGSYS. + +The goal of this design is to provide very quick compatibility layer +boundary crosses, which is achieved by not executing a syscall to change +personality every time the compatibility layer executes. Instead, a +userspace memory region exposed to the kernel indicates the current +personality, and the application simply modifies that variable to +configure the mechanism. + +There is a relatively high cost associated with handling signals on most +architectures, like x86, but at least for Wine, syscalls issued by +native Windows code are currently not known to be a performance problem, +since they are quite rare, at least for modern gaming applications. + +Since this mechanism is designed to capture syscalls issued by +non-native applications, it must function on syscalls whose invocation +ABI is completely unexpected to Linux. Syscall User Dispatch, therefore +doesn't rely on any of the syscall ABI to make the filtering. It uses +only the syscall dispatcher address and the userspace key. + +Interface +--------- + +A process can setup this mechanism on supported kernels +CONFIG_SYSCALL_USER_DISPATCH) by executing the following prctl: + + prctl(PR_SET_SYSCALL_USER_DISPATCH, , , , [selector]) + + is either PR_SYS_DISPATCH_ON or PR_SYS_DISPATCH_OFF, to enable and +disable the mechanism globally for that thread. When +PR_SYS_DISPATCH_OFF is used, the other fields must be zero. + + and delimit a closed memory region interval +from which syscalls are always executed directly, regardless of the +userspace selector. This provides a fast path for the C library, which +includes the most common syscall dispatchers in the native code +applications, and also provides a way for the signal handler to return +without triggering a nested SIGSYS on (rt_)sigreturn. Users of this +interface should make sure that at least the signal trampoline code is +included in this region. In addition, for syscalls that implement the +trampoline code on the vDSO, that trampoline is never intercepted. + +[selector] is a pointer to a char-sized region in the process memory +region, that provides a quick way to enable disable syscall redirection +thread-wide, without the need to invoke the kernel directly. selector +can be set to PR_SYS_DISPATCH_ON or PR_SYS_DISPATCH_OFF. Any other +value should terminate the program with a SIGSYS. + +Security Notes +-------------- + +Syscall User Dispatch provides functionality for compatibility layers to +quickly capture system calls issued by a non-native part of the +application, while not impacting the Linux native regions of the +process. It is not a mechanism for sandboxing system calls, and it +should not be seen as a security mechanism, since it is trivial for a +malicious application to subvert the mechanism by jumping to an allowed +dispatcher region prior to executing the syscall, or to discover the +address and modify the selector value. If the use case requires any +kind of security sandboxing, Seccomp should be used instead. + +Any fork or exec of the existing process resets the mechanism to +PR_SYS_DISPATCH_OFF. -- 2.29.2