|
DistroBaker |
2fccc8 |
commit e062c17e3829f3c04c25b5f6fc17ccc4491befa8
|
|
DistroBaker |
2fccc8 |
Author: Tomas Bzatek <tbzatek@redhat.com>
|
|
DistroBaker |
2fccc8 |
Date: Tue Mar 23 16:48:08 2021 +0100
|
|
DistroBaker |
2fccc8 |
|
|
DistroBaker |
2fccc8 |
modules: Limit module name to alphanumeric characters and -_ separators
|
|
DistroBaker |
2fccc8 |
|
|
DistroBaker |
2fccc8 |
A hardening feature as long as the module name is directly involved
|
|
DistroBaker |
2fccc8 |
in filename creation.
|
|
DistroBaker |
2fccc8 |
|
|
DistroBaker |
2fccc8 |
diff --git a/doc/udisks2-sections.txt.daemon.sections.in b/doc/udisks2-sections.txt.daemon.sections.in
|
|
DistroBaker |
2fccc8 |
index 16eaf74e..204ca897 100644
|
|
DistroBaker |
2fccc8 |
--- a/doc/udisks2-sections.txt.daemon.sections.in
|
|
DistroBaker |
2fccc8 |
+++ b/doc/udisks2-sections.txt.daemon.sections.in
|
|
DistroBaker |
2fccc8 |
@@ -312,6 +312,7 @@ udisks_daemon_util_get_free_mdraid_device
|
|
DistroBaker |
2fccc8 |
udisks_ata_identify_get_word
|
|
DistroBaker |
2fccc8 |
udisks_daemon_util_trigger_uevent
|
|
DistroBaker |
2fccc8 |
udisks_daemon_util_trigger_uevent_sync
|
|
DistroBaker |
2fccc8 |
+udisks_module_validate_name
|
|
DistroBaker |
2fccc8 |
</SECTION>
|
|
DistroBaker |
2fccc8 |
|
|
DistroBaker |
2fccc8 |
<SECTION>
|
|
DistroBaker |
2fccc8 |
diff --git a/src/udisksconfigmanager.c b/src/udisksconfigmanager.c
|
|
DistroBaker |
2fccc8 |
index 9558e276..5868e864 100644
|
|
DistroBaker |
2fccc8 |
--- a/src/udisksconfigmanager.c
|
|
DistroBaker |
2fccc8 |
+++ b/src/udisksconfigmanager.c
|
|
DistroBaker |
2fccc8 |
@@ -26,6 +26,7 @@
|
|
DistroBaker |
2fccc8 |
#include "udiskslogging.h"
|
|
DistroBaker |
2fccc8 |
#include "udisksdaemontypes.h"
|
|
DistroBaker |
2fccc8 |
#include "udisksconfigmanager.h"
|
|
DistroBaker |
2fccc8 |
+#include "udisksdaemonutil.h"
|
|
DistroBaker |
2fccc8 |
|
|
DistroBaker |
2fccc8 |
struct _UDisksConfigManager {
|
|
DistroBaker |
2fccc8 |
GObject parent_instance;
|
|
DistroBaker |
2fccc8 |
@@ -60,6 +61,8 @@ enum
|
|
DistroBaker |
2fccc8 |
#define DEFAULTS_GROUP_NAME "defaults"
|
|
DistroBaker |
2fccc8 |
#define DEFAULTS_ENCRYPTION_KEY "encryption"
|
|
DistroBaker |
2fccc8 |
|
|
DistroBaker |
2fccc8 |
+#define MODULES_ALL_ARG "*"
|
|
DistroBaker |
2fccc8 |
+
|
|
DistroBaker |
2fccc8 |
static void
|
|
DistroBaker |
2fccc8 |
udisks_config_manager_get_property (GObject *object,
|
|
DistroBaker |
2fccc8 |
guint property_id,
|
|
DistroBaker |
2fccc8 |
@@ -170,7 +173,16 @@ parse_config_file (UDisksConfigManager *manager,
|
|
DistroBaker |
2fccc8 |
{
|
|
DistroBaker |
2fccc8 |
modules_tmp = modules;
|
|
DistroBaker |
2fccc8 |
for (module_i = *modules_tmp; module_i; module_i = *++modules_tmp)
|
|
DistroBaker |
2fccc8 |
- *out_modules = g_list_append (*out_modules, g_strdup (g_strstrip (module_i)));
|
|
DistroBaker |
2fccc8 |
+ {
|
|
DistroBaker |
2fccc8 |
+ g_strstrip (module_i);
|
|
DistroBaker |
2fccc8 |
+ if (! udisks_module_validate_name (module_i) && !g_str_equal (module_i, MODULES_ALL_ARG))
|
|
DistroBaker |
2fccc8 |
+ {
|
|
DistroBaker |
2fccc8 |
+ g_warning ("Invalid module name '%s' specified in the %s config file.",
|
|
DistroBaker |
2fccc8 |
+ module_i, conf_filename);
|
|
DistroBaker |
2fccc8 |
+ continue;
|
|
DistroBaker |
2fccc8 |
+ }
|
|
DistroBaker |
2fccc8 |
+ *out_modules = g_list_append (*out_modules, g_strdup (module_i));
|
|
DistroBaker |
2fccc8 |
+ }
|
|
DistroBaker |
2fccc8 |
g_strfreev (modules);
|
|
DistroBaker |
2fccc8 |
}
|
|
DistroBaker |
2fccc8 |
}
|
|
DistroBaker |
2fccc8 |
@@ -397,7 +409,7 @@ udisks_config_manager_get_modules_all (UDisksConfigManager *manager)
|
|
DistroBaker |
2fccc8 |
|
|
DistroBaker |
2fccc8 |
parse_config_file (manager, NULL, NULL, &modules);
|
|
DistroBaker |
2fccc8 |
|
|
DistroBaker |
2fccc8 |
- ret = !modules || (g_strcmp0 (modules->data, "*") == 0 && g_list_length (modules) == 1);
|
|
DistroBaker |
2fccc8 |
+ ret = !modules || (g_strcmp0 (modules->data, MODULES_ALL_ARG) == 0 && g_list_length (modules) == 1);
|
|
DistroBaker |
2fccc8 |
|
|
DistroBaker |
2fccc8 |
g_list_free_full (modules, (GDestroyNotify) g_free);
|
|
DistroBaker |
2fccc8 |
|
|
DistroBaker |
2fccc8 |
diff --git a/src/udisksdaemonutil.c b/src/udisksdaemonutil.c
|
|
DistroBaker |
2fccc8 |
index 60134765..1695b524 100644
|
|
DistroBaker |
2fccc8 |
--- a/src/udisksdaemonutil.c
|
|
DistroBaker |
2fccc8 |
+++ b/src/udisksdaemonutil.c
|
|
DistroBaker |
2fccc8 |
@@ -1880,3 +1880,29 @@ udisks_daemon_util_trigger_uevent_sync (UDisksDaemon *daemon,
|
|
DistroBaker |
2fccc8 |
}
|
|
DistroBaker |
2fccc8 |
|
|
DistroBaker |
2fccc8 |
/* ---------------------------------------------------------------------------------------------------- */
|
|
DistroBaker |
2fccc8 |
+
|
|
DistroBaker |
2fccc8 |
+/**
|
|
DistroBaker |
2fccc8 |
+ * udisks_module_validate_name:
|
|
DistroBaker |
2fccc8 |
+ * @module_name: A udisks2 module name.
|
|
DistroBaker |
2fccc8 |
+ *
|
|
DistroBaker |
2fccc8 |
+ * Checks the string for a valid udisks2 module name. Only alphanumeric characters
|
|
DistroBaker |
2fccc8 |
+ * along with the '-' and '_' separators are permitted.
|
|
DistroBaker |
2fccc8 |
+ *
|
|
DistroBaker |
2fccc8 |
+ * Returns: %TRUE if the string is a valid udisks2 module name, %FALSE otherwise.
|
|
DistroBaker |
2fccc8 |
+ */
|
|
DistroBaker |
2fccc8 |
+gboolean
|
|
DistroBaker |
2fccc8 |
+udisks_module_validate_name (const gchar *module_name)
|
|
DistroBaker |
2fccc8 |
+{
|
|
DistroBaker |
2fccc8 |
+ int i;
|
|
DistroBaker |
2fccc8 |
+
|
|
DistroBaker |
2fccc8 |
+ for (i = 0; module_name[i] != '\0'; i++)
|
|
DistroBaker |
2fccc8 |
+ /* going ASCII, will disqualify any UTF-* string */
|
|
DistroBaker |
2fccc8 |
+ if (! g_ascii_isalnum (module_name[i]) &&
|
|
DistroBaker |
2fccc8 |
+ module_name[i] != '-' &&
|
|
DistroBaker |
2fccc8 |
+ module_name[i] != '_')
|
|
DistroBaker |
2fccc8 |
+ return FALSE;
|
|
DistroBaker |
2fccc8 |
+
|
|
DistroBaker |
2fccc8 |
+ return TRUE;
|
|
DistroBaker |
2fccc8 |
+}
|
|
DistroBaker |
2fccc8 |
+
|
|
DistroBaker |
2fccc8 |
+/* ---------------------------------------------------------------------------------------------------- */
|
|
DistroBaker |
2fccc8 |
diff --git a/src/udisksdaemonutil.h b/src/udisksdaemonutil.h
|
|
DistroBaker |
2fccc8 |
index 2d7ac981..df584de4 100644
|
|
DistroBaker |
2fccc8 |
--- a/src/udisksdaemonutil.h
|
|
DistroBaker |
2fccc8 |
+++ b/src/udisksdaemonutil.h
|
|
DistroBaker |
2fccc8 |
@@ -129,6 +129,8 @@ gchar *udisks_daemon_util_get_free_mdraid_device (void);
|
|
DistroBaker |
2fccc8 |
|
|
DistroBaker |
2fccc8 |
guint16 udisks_ata_identify_get_word (const guchar *identify_data, guint word_number);
|
|
DistroBaker |
2fccc8 |
|
|
DistroBaker |
2fccc8 |
+gboolean udisks_module_validate_name (const gchar *module_name);
|
|
DistroBaker |
2fccc8 |
+
|
|
DistroBaker |
2fccc8 |
/* Utility macro for policy verification. */
|
|
DistroBaker |
2fccc8 |
#define UDISKS_DAEMON_CHECK_AUTHORIZATION(daemon, \
|
|
DistroBaker |
2fccc8 |
object, \
|
|
DistroBaker |
2fccc8 |
diff --git a/src/udiskslinuxmanager.c b/src/udiskslinuxmanager.c
|
|
DistroBaker |
2fccc8 |
index 8af65d97..26d8a5d7 100644
|
|
DistroBaker |
2fccc8 |
--- a/src/udiskslinuxmanager.c
|
|
DistroBaker |
2fccc8 |
+++ b/src/udiskslinuxmanager.c
|
|
DistroBaker |
2fccc8 |
@@ -956,6 +956,15 @@ handle_enable_module (UDisksManager *object,
|
|
DistroBaker |
2fccc8 |
UDisksLinuxManager *manager = UDISKS_LINUX_MANAGER (object);
|
|
DistroBaker |
2fccc8 |
EnableModulesData *data;
|
|
DistroBaker |
2fccc8 |
|
|
DistroBaker |
2fccc8 |
+ if (! udisks_module_validate_name (arg_name))
|
|
DistroBaker |
2fccc8 |
+ {
|
|
DistroBaker |
2fccc8 |
+ g_dbus_method_invocation_return_error (invocation,
|
|
DistroBaker |
2fccc8 |
+ G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,
|
|
DistroBaker |
2fccc8 |
+ "Requested module name '%s' is not a valid udisks2 module name.",
|
|
DistroBaker |
2fccc8 |
+ arg_name);
|
|
DistroBaker |
2fccc8 |
+ return TRUE;
|
|
DistroBaker |
2fccc8 |
+ }
|
|
DistroBaker |
2fccc8 |
+
|
|
DistroBaker |
2fccc8 |
if (! arg_enable)
|
|
DistroBaker |
2fccc8 |
{
|
|
DistroBaker |
2fccc8 |
/* TODO: implement proper module unloading */
|