From: Ahmad Fatoum <a.fat...@pengutronix.de> For secure systems that disable the regular console, RATP should be disabled as well, so add an option to do so.
Signed-off-by: Ahmad Fatoum <a.fat...@pengutronix.de> --- Sconfig | 1 + common/Sconfig | 9 +++++++++ common/console.c | 4 +++- common/ratp/ratp.c | 17 +++++++++++++++++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/Sconfig b/Sconfig index 93f5760ad96fdde7141c47e2680dc5f4bc142ca7..899a1fb5783fb79def32e5af160b39208fea2edc 100644 --- a/Sconfig +++ b/Sconfig @@ -5,4 +5,5 @@ mainmenu "Barebox/$(ARCH) Security Configuration" source "scripts/Sconfig.include" source "security/Sconfig" +source "common/Sconfig" source "commands/Sconfig" diff --git a/common/Sconfig b/common/Sconfig new file mode 100644 index 0000000000000000000000000000000000000000..479ac5cdf2e560a638d39abbc9f91afe2edd7403 --- /dev/null +++ b/common/Sconfig @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: GPL-2.0-only + +menu "General Settings" + +config RATP + bool "Allow remote control via RATP" + depends on $(kconfig-enabled,CONSOLE_RATP) + +endmenu diff --git a/common/console.c b/common/console.c index dc552e4c5dacafd6649ee4ddea86084d0b7278ad..65e4f1f852243fa15d19e68d724cf340b950df06 100644 --- a/common/console.c +++ b/common/console.c @@ -5,6 +5,7 @@ */ #include <config.h> +#include <security/config.h> #include <common.h> #include <stdarg.h> #include <malloc.h> @@ -492,7 +493,8 @@ static int getc_raw(void) if (cdev->tstc(cdev)) { int ch = cdev->getc(cdev); - if (IS_ENABLED(CONFIG_RATP) && ch == 0x01) { + if (IS_ENABLED(CONFIG_RATP) && ch == 0x01 && + IS_ALLOWED(SCONFIG_RATP)) { barebox_ratp(cdev); return -1; } diff --git a/common/ratp/ratp.c b/common/ratp/ratp.c index 2906f5a09098bd1aa61e7450a035a0e7b2327195..f2735fa885315f95b7a754d12de04c15b36fa822 100644 --- a/common/ratp/ratp.c +++ b/common/ratp/ratp.c @@ -14,6 +14,7 @@ #define pr_fmt(fmt) "barebox-ratp: " fmt #include <common.h> +#include <security/config.h> #include <command.h> #include <malloc.h> #include <init.h> @@ -46,6 +47,7 @@ struct ratp_ctx { struct ratp_bb_pkt *fs_rx; + struct sconfig_notifier_block sconfig_notifier; struct poller_struct poller; struct work_queue wq; @@ -456,11 +458,22 @@ static void ratp_work_cancel(struct work_struct *w) free(rw); } +static void barebox_ratp_sconfig_update(struct sconfig_notifier_block *nb, + enum security_config_option opt, + bool allowed) +{ + if (!allowed && ratp_ctx) + ratp_unregister(ratp_ctx); +} + int barebox_ratp(struct console_device *cdev) { int ret; struct ratp_ctx *ctx; + if (!IS_ALLOWED(SCONFIG_RATP)) + return -EPERM; + if (!cdev->getc || !cdev->putc) return -EINVAL; @@ -515,6 +528,10 @@ int barebox_ratp(struct console_device *cdev) console_set_active(&ctx->ratp_console, CONSOLE_STDOUT | CONSOLE_STDERR | CONSOLE_STDIN); + sconfig_register_handler_filtered(&ctx->sconfig_notifier, + barebox_ratp_sconfig_update, + SCONFIG_RATP); + return 0; out: -- 2.39.5