file: strengthen exec access control
authorErik Karlsson <erik.karlsson@genexis.eu>
Mon, 29 May 2023 17:54:23 +0000 (19:54 +0200)
committerHauke Mehrtens <hauke@hauke-m.de>
Sun, 25 Jun 2023 16:46:59 +0000 (18:46 +0200)
Do not allow setting environment variables if there is a session as
there is no access control for environment variables and allowing
arbitrary data into the environment is unsafe. Do not leak arguments
through unchecked if the size of the buffer for access checking the
whole command line is exceeded. Adjust the maximum number of allowed
arguments so it matches the actual implementation.

Signed-off-by: Erik Karlsson <erik.karlsson@genexis.eu>
file.c

diff --git a/file.c b/file.c
index 07b4d3cf17a50a60ab1bc38d86adf5e4374d15cd..1e5b2f4106f8fd3456e79eac8d9bfa83446d456d 100644 (file)
--- a/file.c
+++ b/file.c
@@ -809,6 +809,9 @@ rpc_file_exec_run(const char *cmd, const struct blob_attr *sid,
 
        struct rpc_file_exec_context *c;
 
+       if (sid && env)
+               return UBUS_STATUS_PERMISSION_DENIED;
+
        cmd = rpc_file_exec_lookup(cmd);
 
        if (!cmd)
@@ -824,7 +827,7 @@ rpc_file_exec_run(const char *cmd, const struct blob_attr *sid,
                if (arg == NULL || strlen(executable) >= sizeof(cmdstr))
                        return UBUS_STATUS_PERMISSION_DENIED;
 
-               arglen = 0;
+               arglen = 2;
                p = cmdstr + sprintf(cmdstr, "%s", executable);
 
                blobmsg_for_each_attr(cur, arg, rem)
@@ -834,7 +837,7 @@ rpc_file_exec_run(const char *cmd, const struct blob_attr *sid,
 
                        if (arglen == 255 ||
                            p + blobmsg_data_len(cur) >= cmdstr + sizeof(cmdstr))
-                               break;
+                               return UBUS_STATUS_PERMISSION_DENIED;
 
                        p += sprintf(p, " %s", blobmsg_get_string(cur));
                        arglen++;