Fabiano Fidêncio 5cd9619
From 08fb8316b4ac42fe74c1fa5ca0ac593222cdf81a Mon Sep 17 00:00:00 2001
Fabiano Fidêncio 5cd9619
From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= <fidencio@redhat.com>
Fabiano Fidêncio 5cd9619
Date: Wed, 3 Jul 2019 14:55:24 +0200
Fabiano Fidêncio 5cd9619
Subject: [PATCH] tools,install-script: Add --config-file (-f) option
Fabiano Fidêncio 5cd9619
MIME-Version: 1.0
Fabiano Fidêncio 5cd9619
Content-Type: text/plain; charset=UTF-8
Fabiano Fidêncio 5cd9619
Content-Transfer-Encoding: 8bit
Fabiano Fidêncio 5cd9619
Fabiano Fidêncio 5cd9619
Let's add a new option so users can set their config from a file,
Fabiano Fidêncio 5cd9619
instead of directly passing the values via command-line.
Fabiano Fidêncio 5cd9619
Fabiano Fidêncio 5cd9619
CVE-2019-13313
Fabiano Fidêncio 5cd9619
Libosinfo: osinfo-install-script option leaks password via command line
Fabiano Fidêncio 5cd9619
argument. 'osinfo-install-script' is used to generate a script for
Fabiano Fidêncio 5cd9619
automated guest installations. It accepts user and admin passwords via
Fabiano Fidêncio 5cd9619
command line arguments, thus leaking them via process listing.
Fabiano Fidêncio 5cd9619
Fabiano Fidêncio 5cd9619
Signed-off-by: Fabiano FidĂȘncio <fidencio@redhat.com>
Fabiano Fidêncio 5cd9619
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Fabiano Fidêncio 5cd9619
---
Fabiano Fidêncio 5cd9619
 tools/osinfo-install-script.c | 103 +++++++++++++++++++++++++++++++++-
Fabiano Fidêncio 5cd9619
 1 file changed, 102 insertions(+), 1 deletion(-)
Fabiano Fidêncio 5cd9619
Fabiano Fidêncio 5cd9619
diff --git a/tools/osinfo-install-script.c b/tools/osinfo-install-script.c
Fabiano Fidêncio 5cd9619
index 15af48d..af58440 100644
Fabiano Fidêncio 5cd9619
--- a/tools/osinfo-install-script.c
Fabiano Fidêncio 5cd9619
+++ b/tools/osinfo-install-script.c
Fabiano Fidêncio 5cd9619
@@ -37,6 +37,34 @@ static gboolean list_profile = FALSE;
Fabiano Fidêncio 5cd9619
 static gboolean list_inj_method = FALSE;
Fabiano Fidêncio 5cd9619
 static gboolean quiet = FALSE;
Fabiano Fidêncio 5cd9619
 
Fabiano Fidêncio 5cd9619
+static const gchar *configs[] = {
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_HARDWARE_ARCH,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_L10N_TIMEZONE,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_L10N_LANGUAGE,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_L10N_KEYBOARD,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_ADMIN_PASSWORD,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_USER_PASSWORD,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_USER_LOGIN,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_USER_REALNAME,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_USER_AUTOLOGIN,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_USER_ADMIN,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_REG_LOGIN,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_REG_PASSWORD,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_REG_PRODUCTKEY,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_HOSTNAME,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_TARGET_DISK,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_SCRIPT_DISK,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_AVATAR_LOCATION,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_AVATAR_DISK,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_PRE_INSTALL_DRIVERS_DISK,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_PRE_INSTALL_DRIVERS_LOCATION,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_POST_INSTALL_DRIVERS_DISK,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_POST_INSTALL_DRIVERS_LOCATION,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_DRIVER_SIGNING,
Fabiano Fidêncio 5cd9619
+    OSINFO_INSTALL_CONFIG_PROP_INSTALLATION_URL,
Fabiano Fidêncio 5cd9619
+    NULL
Fabiano Fidêncio 5cd9619
+};
Fabiano Fidêncio 5cd9619
+
Fabiano Fidêncio 5cd9619
 static OsinfoInstallConfig *config;
Fabiano Fidêncio 5cd9619
 
Fabiano Fidêncio 5cd9619
 static gboolean handle_config(const gchar *option_name G_GNUC_UNUSED,
Fabiano Fidêncio 5cd9619
@@ -65,6 +93,47 @@ static gboolean handle_config(const gchar *option_name G_GNUC_UNUSED,
Fabiano Fidêncio 5cd9619
 }
Fabiano Fidêncio 5cd9619
 
Fabiano Fidêncio 5cd9619
 
Fabiano Fidêncio 5cd9619
+static gboolean handle_config_file(const gchar *option_name G_GNUC_UNUSED,
Fabiano Fidêncio 5cd9619
+                                   const gchar *value,
Fabiano Fidêncio 5cd9619
+                                   gpointer data G_GNUC_UNUSED,
Fabiano Fidêncio 5cd9619
+                                   GError **error)
Fabiano Fidêncio 5cd9619
+{
Fabiano Fidêncio 5cd9619
+    GKeyFile *key_file = NULL;
Fabiano Fidêncio 5cd9619
+    gchar *val = NULL;
Fabiano Fidêncio 5cd9619
+    gsize i;
Fabiano Fidêncio 5cd9619
+    gboolean ret = FALSE;
Fabiano Fidêncio 5cd9619
+
Fabiano Fidêncio 5cd9619
+    key_file = g_key_file_new();
Fabiano Fidêncio 5cd9619
+    if (!g_key_file_load_from_file(key_file, value, G_KEY_FILE_NONE, error))
Fabiano Fidêncio 5cd9619
+        goto error;
Fabiano Fidêncio 5cd9619
+
Fabiano Fidêncio 5cd9619
+    for (i = 0; configs[i] != NULL; i++) {
Fabiano Fidêncio 5cd9619
+        val = g_key_file_get_string(key_file, "install-script", configs[i], error);
Fabiano Fidêncio 5cd9619
+        if (val == NULL) {
Fabiano Fidêncio 5cd9619
+            if (g_error_matches(*error, G_KEY_FILE_ERROR,
Fabiano Fidêncio 5cd9619
+                                G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
Fabiano Fidêncio 5cd9619
+                g_clear_error(error);
Fabiano Fidêncio 5cd9619
+                continue;
Fabiano Fidêncio 5cd9619
+            }
Fabiano Fidêncio 5cd9619
+
Fabiano Fidêncio 5cd9619
+            goto error;
Fabiano Fidêncio 5cd9619
+        }
Fabiano Fidêncio 5cd9619
+
Fabiano Fidêncio 5cd9619
+        osinfo_entity_set_param(OSINFO_ENTITY(config),
Fabiano Fidêncio 5cd9619
+                                configs[i],
Fabiano Fidêncio 5cd9619
+                                val);
Fabiano Fidêncio 5cd9619
+        g_free(val);
Fabiano Fidêncio 5cd9619
+    }
Fabiano Fidêncio 5cd9619
+
Fabiano Fidêncio 5cd9619
+    ret = TRUE;
Fabiano Fidêncio 5cd9619
+
Fabiano Fidêncio 5cd9619
+error:
Fabiano Fidêncio 5cd9619
+    g_key_file_unref(key_file);
Fabiano Fidêncio 5cd9619
+
Fabiano Fidêncio 5cd9619
+    return ret;
Fabiano Fidêncio 5cd9619
+}
Fabiano Fidêncio 5cd9619
+
Fabiano Fidêncio 5cd9619
+
Fabiano Fidêncio 5cd9619
 static GOptionEntry entries[] =
Fabiano Fidêncio 5cd9619
 {
Fabiano Fidêncio 5cd9619
     { "profile", 'p', 0, G_OPTION_ARG_STRING, (void*)&profile,
Fabiano Fidêncio 5cd9619
@@ -78,6 +147,9 @@ static GOptionEntry entries[] =
Fabiano Fidêncio 5cd9619
     { "config", 'c', 0, G_OPTION_ARG_CALLBACK,
Fabiano Fidêncio 5cd9619
       handle_config,
Fabiano Fidêncio 5cd9619
       N_("Set configuration parameter"), "key=value" },
Fabiano Fidêncio 5cd9619
+    { "config-file", 'f', 0, G_OPTION_ARG_CALLBACK,
Fabiano Fidêncio 5cd9619
+      handle_config_file,
Fabiano Fidêncio 5cd9619
+      N_("Set configuration parameters"), "file:///path/to/config/file" },
Fabiano Fidêncio 5cd9619
     { "list-config", '\0', 0, G_OPTION_ARG_NONE, (void*)&list_config,
Fabiano Fidêncio 5cd9619
       N_("List configuration parameters"), NULL },
Fabiano Fidêncio 5cd9619
     { "list-profiles", '\0', 0, G_OPTION_ARG_NONE, (void*)&list_profile,
Fabiano Fidêncio 5cd9619
@@ -448,6 +520,15 @@ script. Defaults to C<media>, but can also be C<network>.
Fabiano Fidêncio 5cd9619
 
Fabiano Fidêncio 5cd9619
 Set the configuration parameter C<key> to C<value>.
Fabiano Fidêncio 5cd9619
 
Fabiano Fidêncio 5cd9619
+=item B<--config-file=config-file>
Fabiano Fidêncio 5cd9619
+
Fabiano Fidêncio 5cd9619
+Set the configurations parameters according to the config-file passed.
Fabiano Fidêncio 5cd9619
+
Fabiano Fidêncio 5cd9619
+Note that use of --config-file is strongly recommended if the user or
Fabiano Fidêncio 5cd9619
+admin passwords need to be set. Providing passwords directly using
Fabiano Fidêncio 5cd9619
+B<--config=> is insecure as the password is visible to all processes
Fabiano Fidêncio 5cd9619
+and users on the same host.
Fabiano Fidêncio 5cd9619
+
Fabiano Fidêncio 5cd9619
 =back
Fabiano Fidêncio 5cd9619
 
Fabiano Fidêncio 5cd9619
 =head1 CONFIGURATION KEYS
Fabiano Fidêncio 5cd9619
@@ -510,9 +591,29 @@ The software registration user password
Fabiano Fidêncio 5cd9619
 
Fabiano Fidêncio 5cd9619
 =back
Fabiano Fidêncio 5cd9619
 
Fabiano Fidêncio 5cd9619
+=head1 CONFIGURATION FILE FORMAT
Fabiano Fidêncio 5cd9619
+
Fabiano Fidêncio 5cd9619
+The configuration file must consist in a file which contains a
Fabiano Fidêncio 5cd9619
+`install-script` group and, under this group, C<key>=C<value>
Fabiano Fidêncio 5cd9619
+pairs, as shown below:
Fabiano Fidêncio 5cd9619
+
Fabiano Fidêncio 5cd9619
+[install-script]
Fabiano Fidêncio 5cd9619
+l10n-timezone=GMT
Fabiano Fidêncio 5cd9619
+l10n-keyboard=uk
Fabiano Fidêncio 5cd9619
+l10n-language=en_GB
Fabiano Fidêncio 5cd9619
+admin-password=123456
Fabiano Fidêncio 5cd9619
+user-login=berrange
Fabiano Fidêncio 5cd9619
+user-password=123456
Fabiano Fidêncio 5cd9619
+user-realname="Daniel P Berrange"
Fabiano Fidêncio 5cd9619
+
Fabiano Fidêncio 5cd9619
 =head1 EXAMPLE USAGE
Fabiano Fidêncio 5cd9619
 
Fabiano Fidêncio 5cd9619
-The following usage generates a Fedora 16 kickstart script
Fabiano Fidêncio 5cd9619
+The following usages generates a Fedora 16 kickstart script
Fabiano Fidêncio 5cd9619
+
Fabiano Fidêncio 5cd9619
+  # osinfo-install-script \
Fabiano Fidêncio 5cd9619
+         --profile jeos \
Fabiano Fidêncio 5cd9619
+         --config-file /path/to/config/file \
Fabiano Fidêncio 5cd9619
+         fedora16
Fabiano Fidêncio 5cd9619
 
Fabiano Fidêncio 5cd9619
   # osinfo-install-script \
Fabiano Fidêncio 5cd9619
          --profile jeos \
Fabiano Fidêncio 5cd9619
-- 
Fabiano Fidêncio 5cd9619
2.21.0
Fabiano Fidêncio 5cd9619