Re: [PATCH V2 7/7] env: Add support for explicit write access list

2020-07-31 Thread Tom Rini
On Tue, Jul 07, 2020 at 08:51:39PM +0200, Marek Vasut wrote:

> This option marks any U-Boot variable which does not have explicit 'w'
> writeable flag set as read-only. This way the environment can be locked
> down and only variables explicitly configured to be writeable can ever
> be changed by either 'env import', 'env set' or loading user environment
> from environment storage.
> 
> Signed-off-by: Marek Vasut 
> Reviewed-by: Tom Rini 

Applied to u-boot/master, thanks!

-- 
Tom


signature.asc
Description: PGP signature


Re: [PATCH V2 7/7] env: Add support for explicit write access list

2020-07-24 Thread Tom Rini
On Tue, Jul 07, 2020 at 08:51:39PM +0200, Marek Vasut wrote:

> This option marks any U-Boot variable which does not have explicit 'w'
> writeable flag set as read-only. This way the environment can be locked
> down and only variables explicitly configured to be writeable can ever
> be changed by either 'env import', 'env set' or loading user environment
> from environment storage.
> 
> Signed-off-by: Marek Vasut 

Reviewed-by: Tom Rini 

-- 
Tom


signature.asc
Description: PGP signature


[PATCH V2 7/7] env: Add support for explicit write access list

2020-07-07 Thread Marek Vasut
This option marks any U-Boot variable which does not have explicit 'w'
writeable flag set as read-only. This way the environment can be locked
down and only variables explicitly configured to be writeable can ever
be changed by either 'env import', 'env set' or loading user environment
from environment storage.

Signed-off-by: Marek Vasut 
---
V2: - Only apply the filtering on external env, U-Boot can set variables
  from U-Boot shell and so on.
- Switch from if CONFIG_IS_ENABLED(ENV_WRITEABLE_LIST) to
  ifdef CONFIG_ENV_WRITEABLE_LIST
---
 env/Kconfig |  8 ++
 env/flags.c | 62 +
 include/env_flags.h |  6 -
 lib/hashtable.c |  5 +++-
 4 files changed, 68 insertions(+), 13 deletions(-)

diff --git a/env/Kconfig b/env/Kconfig
index 9f7eff4f69..44698d863d 100644
--- a/env/Kconfig
+++ b/env/Kconfig
@@ -613,6 +613,14 @@ config ENV_APPEND
  with newly imported data. This may be used in combination with static
  flags to e.g. to protect variables which must not be modified.
 
+config ENV_WRITEABLE_LIST
+   bool "Permit write access only to listed variables"
+   default n
+   help
+ If defined, only environment variables which explicitly set the 'w'
+ writeable flag can be written and modified at runtime. No variables
+ can be otherwise created, written or imported into the environment.
+
 config ENV_ACCESS_IGNORE_FORCE
bool "Block forced environment operations"
default n
diff --git a/env/flags.c b/env/flags.c
index f7a53775c4..df4aed26b2 100644
--- a/env/flags.c
+++ b/env/flags.c
@@ -28,8 +28,15 @@
 #define ENV_FLAGS_NET_VARTYPE_REPS ""
 #endif
 
+#ifdef CONFIG_ENV_WRITEABLE_LIST
+#define ENV_FLAGS_WRITEABLE_VARACCESS_REPS "w"
+#else
+#define ENV_FLAGS_WRITEABLE_VARACCESS_REPS ""
+#endif
+
 static const char env_flags_vartype_rep[] = "sdxb" ENV_FLAGS_NET_VARTYPE_REPS;
-static const char env_flags_varaccess_rep[] = "aroc";
+static const char env_flags_varaccess_rep[] =
+   "aroc" ENV_FLAGS_WRITEABLE_VARACCESS_REPS;
 static const int env_flags_varaccess_mask[] = {
0,
ENV_FLAGS_VARACCESS_PREVENT_DELETE |
@@ -38,7 +45,11 @@ static const int env_flags_varaccess_mask[] = {
ENV_FLAGS_VARACCESS_PREVENT_DELETE |
ENV_FLAGS_VARACCESS_PREVENT_OVERWR,
ENV_FLAGS_VARACCESS_PREVENT_DELETE |
-   ENV_FLAGS_VARACCESS_PREVENT_NONDEF_OVERWR};
+   ENV_FLAGS_VARACCESS_PREVENT_NONDEF_OVERWR,
+#ifdef CONFIG_ENV_WRITEABLE_LIST
+   ENV_FLAGS_VARACCESS_WRITEABLE,
+#endif
+   };
 
 #ifdef CONFIG_CMD_ENV_FLAGS
 static const char * const env_flags_vartype_names[] = {
@@ -56,6 +67,9 @@ static const char * const env_flags_varaccess_names[] = {
"read-only",
"write-once",
"change-default",
+#ifdef CONFIG_ENV_WRITEABLE_LIST
+   "writeable",
+#endif
 };
 
 /*
@@ -130,21 +144,25 @@ enum env_flags_vartype env_flags_parse_vartype(const char 
*flags)
  */
 enum env_flags_varaccess env_flags_parse_varaccess(const char *flags)
 {
+   enum env_flags_varaccess va_default = env_flags_varaccess_any;
+   enum env_flags_varaccess va;
char *access;
 
if (strlen(flags) <= ENV_FLAGS_VARACCESS_LOC)
-   return env_flags_varaccess_any;
+   return va_default;
 
access = strchr(env_flags_varaccess_rep,
flags[ENV_FLAGS_VARACCESS_LOC]);
 
-   if (access != NULL)
-   return (enum env_flags_varaccess)
+   if (access != NULL) {
+   va = (enum env_flags_varaccess)
(access - _flags_varaccess_rep[0]);
+   return va;
+   }
 
printf("## Warning: Unknown environment variable access method '%c'\n",
flags[ENV_FLAGS_VARACCESS_LOC]);
-   return env_flags_varaccess_any;
+   return va_default;
 }
 
 /*
@@ -152,17 +170,21 @@ enum env_flags_varaccess env_flags_parse_varaccess(const 
char *flags)
  */
 enum env_flags_varaccess env_flags_parse_varaccess_from_binflags(int binflags)
 {
+   enum env_flags_varaccess va_default = env_flags_varaccess_any;
+   enum env_flags_varaccess va;
int i;
 
for (i = 0; i < ARRAY_SIZE(env_flags_varaccess_mask); i++)
if (env_flags_varaccess_mask[i] ==
-   (binflags & ENV_FLAGS_VARACCESS_BIN_MASK))
-   return (enum env_flags_varaccess)i;
+   (binflags & ENV_FLAGS_VARACCESS_BIN_MASK)) {
+   va = (enum env_flags_varaccess)i;
+   return va;
+   }
 
printf("Warning: Non-standard access flags. (0x%x)\n",
binflags & ENV_FLAGS_VARACCESS_BIN_MASK);
 
-   return env_flags_varaccess_any;
+   return va_default;
 }
 
 static inline int is_hex_prefix(const char *value)
@@ -326,13 +348,14 @@ enum env_flags_vartype env_flags_get_type(const char 
*name)
 enum