Re: [RFC PATCH v19 2/5] security: Add new SHOULD_EXEC_CHECK and SHOULD_EXEC_RESTRICT securebits
From: Jeff Xu <hidden>
Date: 2024-07-16 15:03:18
Also in:
linux-fsdevel, linux-integrity, linux-security-module, lkml
On Thu, Jul 11, 2024 at 1:57 AM Mickaël Salaün [off-list ref] wrote:
On Wed, Jul 10, 2024 at 09:26:14AM -0700, Kees Cook wrote:quoted
On Wed, Jul 10, 2024 at 11:58:25AM +0200, Mickaël Salaün wrote:quoted
Here is another proposal: We can change a bit the semantic by making it the norm to always check file executability with AT_CHECK, and using the securebits to restrict file interpretation and/or command injection (e.g. user supplied shell commands). Non-executable checked files can be reported/logged at the kernel level, with audit, configured by sysadmins. New securebits (feel free to propose better names): - SECBIT_EXEC_RESTRICT_FILE: requires AT_CHECK to pass.Would you want the enforcement of this bit done by userspace or the kernel? IIUC, userspace would always perform AT_CHECK regardless of SECBIT_EXEC_RESTRICT_FILE, and then which would happen? 1) userspace would ignore errors from AT_CHECK when SECBIT_EXEC_RESTRICT_FILE is unsetYes, that's the idea.quoted
or 2) kernel would allow all AT_CHECK when SECBIT_EXEC_RESTRICT_FILE is unset I suspect 1 is best and what you intend, given that SECBIT_EXEC_DENY_INTERACTIVE can only be enforced by userspace.Indeed. We don't want AT_CHECK's behavior to change according to securebits.
One bit is good.
quoted
quoted
- SECBIT_EXEC_DENY_INTERACTIVE: deny any command injection via command line arguments, environment variables, or configuration files. This should be ignored by dynamic linkers. We could also have an allow-list of shells for which this bit is not set, managed by an LSM's policy, if the native securebits scoping approach is not enough. Different modes for script interpreters: 1. RESTRICT_FILE=0 DENY_INTERACTIVE=0 (default) Always interpret scripts, and allow arbitrary user commands. => No threat, everyone and everything is trusted, but we can get ahead of potential issues with logs to prepare for a migration to a restrictive mode. 2. RESTRICT_FILE=1 DENY_INTERACTIVE=0 Deny script interpretation if they are not executable, and allow arbitrary user commands. => Threat: (potential) malicious scripts run by trusted (and not fooled) users. That could protect against unintended script executions (e.g. sh /tmp/*.sh). ==> Makes sense for (semi-restricted) user sessions. 3. RESTRICT_FILE=1 DENY_INTERACTIVE=1 Deny script interpretation if they are not executable, and also deny any arbitrary user commands. => Threat: malicious scripts run by untrusted users. ==> Makes sense for system services executing scripts. 4. RESTRICT_FILE=0 DENY_INTERACTIVE=1 Always interpret scripts, but deny arbitrary user commands. => Goal: monitor/measure/assess script content (e.g. with IMA/EVM) in a system where the access rights are not (yet) ready. Arbitrary user commands would be much more difficult to monitor. ==> First step of restricting system services that should not directly pass arbitrary commands to shells.I like these bits!Good! Jeff, Steve, Florian, Matt, others, what do you think?
For below two cases: will they be restricted by one (or some) mode above ? 1> cat /tmp/a.sh | sh 2> sh -c "$(cat /tmp/a.sh)"