From: Sascha Hauer <s.hauer@pengutronix.de>
To: BAREBOX <barebox@lists.infradead.org>
Subject: [PATCH 21/24] security: shell: add policy for executing the shell
Date: Wed, 20 Aug 2025 15:18:05 +0200 [thread overview]
Message-ID: <20250820-security-policies-v1-21-76fde70fdbd8@pengutronix.de> (raw)
In-Reply-To: <20250820-security-policies-v1-0-76fde70fdbd8@pengutronix.de>
Executing shell scripts can be dangerous in secure environments, so add
a security policy for it. While shell scripts can be executed securely
if made sure that no scripts from unknown sources are executed,
executing an interactive shell for sure is not desired in secure
environments, so offer two options: One for disabling the shell entirely
and one for disabling interactive shells.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
common/Sconfig | 18 ++++++++++++++++++
common/console.c | 5 +++++
common/console_simple.c | 5 +++++
common/hush.c | 13 +++++++++++++
common/parser.c | 7 +++++++
5 files changed, 48 insertions(+)
diff --git a/common/Sconfig b/common/Sconfig
index 9142685a1d3f9846e69b746e545420eab5935661..ac027022e932dffd429f0b34cb8e1a199b0b595b 100644
--- a/common/Sconfig
+++ b/common/Sconfig
@@ -2,6 +2,24 @@
menu "General Settings"
+config SHELL
+ bool "Allow executing shell scripts"
+ depends on $(kconfig-enabled,SHELL_HUSH) || $(kconfig-enabled,SHELL_SIMPLE)
+ help
+ Say y here if you want to allow executing shell scripts. Shell scripts are
+ potentially dangerous when coming from untrusted sources. Enable this option
+ only when only trusted scripts can be executed, i.e. ENVIRONMENT_LOAD and
+ untrusted filesystems are disabled.
+
+config SHELL_INTERACTIVE
+ bool "Allow executing interactive shell"
+ depends on SHELL
+ help
+ An interactive shell cannot be safely executed in trusted environments. Disable
+ this option in lockdown security configs.
+
+ Disabling this option also disables interruption with ctrl-c keystrokes.
+
config RATP
bool "Allow remote control via RATP"
depends on $(kconfig-enabled,CONSOLE_RATP)
diff --git a/common/console.c b/common/console.c
index 65e4f1f852243fa15d19e68d724cf340b950df06..ee498fadf3700376b6325be10911b2081ff1ebb3 100644
--- a/common/console.c
+++ b/common/console.c
@@ -25,6 +25,7 @@
#include <linux/list.h>
#include <linux/stringify.h>
#include <debug_ll.h>
+#include <security/config.h>
LIST_HEAD(console_list);
EXPORT_SYMBOL(console_list);
@@ -673,6 +674,10 @@ EXPORT_SYMBOL(ctrlc_non_interruptible);
int ctrlc(void)
{
resched();
+
+ if (!IS_ALLOWED(SCONFIG_SHELL_INTERACTIVE))
+ return 0;
+
return ctrlc_non_interruptible();
}
EXPORT_SYMBOL(ctrlc);
diff --git a/common/console_simple.c b/common/console_simple.c
index 702087bd23d75c3c7d3d0aec25c97f0e88064ef1..f00fd567ed5d1ec7b0a8f00179953c08dda49de3 100644
--- a/common/console_simple.c
+++ b/common/console_simple.c
@@ -6,6 +6,7 @@
#include <errno.h>
#include <debug_ll.h>
#include <console.h>
+#include <security/config.h>
LIST_HEAD(console_list);
EXPORT_SYMBOL(console_list);
@@ -70,6 +71,10 @@ EXPORT_SYMBOL(console_flush);
int ctrlc (void)
{
int ret = 0;
+
+ if (!IS_ALLOWED(SCONFIG_SHELL_INTERACTIVE))
+ return 0;
+
#ifdef CONFIG_ARCH_HAS_CTRLC
ret = arch_ctrlc();
#else
diff --git a/common/hush.c b/common/hush.c
index 21348c4b7510f074c9bdf27bc35dce0b17648648..8515e7733828715147fdbfba25844af3cca61e35 100644
--- a/common/hush.c
+++ b/common/hush.c
@@ -118,6 +118,7 @@
#include <binfmt.h>
#include <init.h>
#include <shell.h>
+#include <security/config.h>
/*cmd_boot.c*/
extern int do_bootd(int flag, int argc, char *argv[]); /* do_bootd */
@@ -1693,6 +1694,9 @@ char *shell_expand(char *str)
o_string o = {};
char *res, *parsed;
+ if (!IS_ALLOWED(SCONFIG_SHELL))
+ return str;
+
remove_quotes_in_str(str);
o.quote = 1;
@@ -1910,6 +1914,9 @@ int run_command(const char *cmd)
struct p_context ctx = {};
int ret;
+ if (!IS_ALLOWED(SCONFIG_SHELL))
+ return -EPERM;
+
initialize_context(&ctx);
ret = parse_string_outer(&ctx, cmd, FLAG_PARSE_SEMICOLON);
@@ -1922,6 +1929,9 @@ static int execute_script(const char *path, int argc, char *argv[])
{
int ret;
+ if (!IS_ALLOWED(SCONFIG_SHELL))
+ return -EPERM;
+
env_push_context();
ret = source_script(path, argc, argv);
env_pop_context();
@@ -1963,6 +1973,9 @@ int run_shell(void)
struct p_context ctx = {};
int exit = 0;
+ if (!IS_ALLOWED(SCONFIG_SHELL_INTERACTIVE))
+ return -EPERM;
+
login();
do {
diff --git a/common/parser.c b/common/parser.c
index 387cd64c42677419ca12bbde5bb7a811c03fa11d..16fff052cf63b7a0e237bc2de1188b27af1b9809 100644
--- a/common/parser.c
+++ b/common/parser.c
@@ -5,6 +5,7 @@
#include <password.h>
#include <environment.h>
#include <shell.h>
+#include <security/config.h>
/*
* not yet supported
@@ -190,6 +191,9 @@ int run_command(const char *cmd)
int argc, inquotes;
int rc = 0;
+ if (!IS_ALLOWED(SCONFIG_SHELL))
+ return -EPERM;
+
#ifdef DEBUG
pr_debug("[RUN_COMMAND] cmd[%p]=\"", cmd);
puts (cmd ? cmd : "NULL"); /* use puts - string may be loooong */
@@ -269,6 +273,9 @@ int run_shell(void)
static char lastcommand[CONFIG_CBSIZE] = { 0, };
int len;
+ if (!IS_ALLOWED(SCONFIG_SHELL_INTERACTIVE))
+ return -EPERM;
+
login();
for (;;) {
--
2.39.5
next prev parent reply other threads:[~2025-08-20 14:32 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-20 13:17 [PATCH 00/24] Add security policy support Sascha Hauer
2025-08-20 13:17 ` [PATCH 01/24] kconfig: allow setting CONFIG_ from the outside Sascha Hauer
2025-08-20 13:17 ` [PATCH 02/24] scripts: include scripts/include for all host tools Sascha Hauer
2025-08-20 13:17 ` [PATCH 03/24] kbuild: implement loopable loop_cmd Sascha Hauer
2025-08-20 13:17 ` [PATCH 04/24] Add security policy support Sascha Hauer
2025-08-20 13:17 ` [PATCH 05/24] kbuild: allow security config use without source tree modification Sascha Hauer
2025-08-20 13:17 ` [PATCH 06/24] defaultenv: update PS1 according to security policy Sascha Hauer
2025-08-20 15:33 ` [PATCH] fixup! " Ahmad Fatoum
2025-08-20 13:17 ` [PATCH 07/24] security: policy: support externally provided configs Sascha Hauer
2025-08-20 13:17 ` [PATCH 08/24] commands: implement sconfig command Sascha Hauer
2025-08-20 13:17 ` [PATCH 09/24] docs: security-policies: add documentation Sascha Hauer
2025-08-20 13:17 ` [PATCH 10/24] commands: go: add security config option Sascha Hauer
2025-08-20 13:17 ` [PATCH 11/24] console: ratp: " Sascha Hauer
2025-08-20 13:17 ` [PATCH 12/24] bootm: support calling bootm_optional_signed_images at any time Sascha Hauer
2025-08-20 13:17 ` [PATCH 13/24] bootm: make unsigned image support runtime configurable Sascha Hauer
2025-08-20 13:17 ` [PATCH 14/24] ARM: configs: add virt32_secure_defconfig Sascha Hauer
2025-08-20 13:17 ` [PATCH 15/24] boards: qemu-virt: add security policies Sascha Hauer
2025-08-21 6:57 ` Ahmad Fatoum
2025-08-21 14:15 ` Sascha Hauer
2025-08-21 14:22 ` Ahmad Fatoum
2025-08-20 13:18 ` [PATCH 16/24] boards: qemu-virt: allow setting policy from command line Sascha Hauer
2025-08-20 13:18 ` [PATCH 17/24] test: py: add basic security policy test Sascha Hauer
2025-08-20 13:18 ` [PATCH 18/24] usbserial: add inline wrappers Sascha Hauer
2025-08-20 13:18 ` [PATCH 19/24] security: usbgadget: add usbgadget security policy Sascha Hauer
2025-08-20 13:18 ` [PATCH 20/24] security: fastboot: add security policy for fastboot oem Sascha Hauer
2025-08-20 13:18 ` Sascha Hauer [this message]
2025-08-20 13:18 ` [PATCH 22/24] security: add security policy for loading barebox environment Sascha Hauer
2025-08-20 13:18 ` [PATCH 23/24] security: add filesystem security policies Sascha Hauer
2025-08-20 14:39 ` Ahmad Fatoum
2025-08-20 13:18 ` [PATCH 24/24] security: console: add security policy for console input Sascha Hauer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250820-security-policies-v1-21-76fde70fdbd8@pengutronix.de \
--to=s.hauer@pengutronix.de \
--cc=barebox@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox