|
Matej Habrnal |
fa1950 |
From 4e85328fd73b0d61fb82b535a7d2d8b642b3f95f Mon Sep 17 00:00:00 2001
|
|
Matej Habrnal |
fa1950 |
From: Jakub Filak <jfilak@redhat.com>
|
|
Matej Habrnal |
fa1950 |
Date: Thu, 7 May 2015 11:07:12 +0200
|
|
Matej Habrnal |
fa1950 |
Subject: [PATCH] daemon, dbus: allow only root to create CCpp, Koops, vmcore
|
|
Matej Habrnal |
fa1950 |
and xorg
|
|
Matej Habrnal |
fa1950 |
MIME-Version: 1.0
|
|
Matej Habrnal |
fa1950 |
Content-Type: text/plain; charset=UTF-8
|
|
Matej Habrnal |
fa1950 |
Content-Transfer-Encoding: 8bit
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
Florian Weimer <fweimer@redhat.com>:
|
|
Matej Habrnal |
fa1950 |
This prevents users from feeding things that are not actually
|
|
Matej Habrnal |
fa1950 |
coredumps and excerpts from /proc to these analyzers.
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
For example, it should not be possible to trigger a rule with
|
|
Matej Habrnal |
fa1950 |
“EVENT=post-create analyzer=CCpp” using NewProblem
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
Related: #1212861
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
Signed-off-by: Jakub Filak <jfilak@redhat.com>
|
|
Matej Habrnal |
fa1950 |
---
|
|
Matej Habrnal |
fa1950 |
src/daemon/abrt-server.c | 2 +-
|
|
Matej Habrnal |
fa1950 |
src/dbus/abrt-dbus.c | 10 +++++++++-
|
|
Matej Habrnal |
fa1950 |
src/include/libabrt.h | 2 ++
|
|
Matej Habrnal |
fa1950 |
src/lib/hooklib.c | 24 ++++++++++++++++++++++++
|
|
Matej Habrnal |
fa1950 |
4 files changed, 36 insertions(+), 2 deletions(-)
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
diff --git a/src/daemon/abrt-server.c b/src/daemon/abrt-server.c
|
|
Matej Habrnal |
fa1950 |
index 5fc4b1a..90339ab 100644
|
|
Matej Habrnal |
fa1950 |
--- a/src/daemon/abrt-server.c
|
|
Matej Habrnal |
fa1950 |
+++ b/src/daemon/abrt-server.c
|
|
Matej Habrnal |
fa1950 |
@@ -486,7 +486,7 @@ static gboolean key_value_ok(gchar *key, gchar *value)
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
- return TRUE;
|
|
Matej Habrnal |
fa1950 |
+ return allowed_new_user_problem_entry(client_uid, key, value);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
/* Handles a message received from client over socket. */
|
|
Matej Habrnal |
fa1950 |
diff --git a/src/dbus/abrt-dbus.c b/src/dbus/abrt-dbus.c
|
|
Matej Habrnal |
fa1950 |
index 489d273..62f331b 100644
|
|
Matej Habrnal |
fa1950 |
--- a/src/dbus/abrt-dbus.c
|
|
Matej Habrnal |
fa1950 |
+++ b/src/dbus/abrt-dbus.c
|
|
Matej Habrnal |
fa1950 |
@@ -175,6 +175,7 @@ bool allowed_problem_element(GDBusMethodInvocation *invocation, const char *elem
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
static char *handle_new_problem(GVariant *problem_info, uid_t caller_uid, char **error)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
+ char *problem_id = NULL;
|
|
Matej Habrnal |
fa1950 |
problem_data_t *pd = problem_data_new();
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
GVariantIter *iter;
|
|
Matej Habrnal |
fa1950 |
@@ -182,6 +183,12 @@ static char *handle_new_problem(GVariant *problem_info, uid_t caller_uid, char *
|
|
Matej Habrnal |
fa1950 |
gchar *key, *value;
|
|
Matej Habrnal |
fa1950 |
while (g_variant_iter_loop(iter, "{ss}", &key, &value))
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
+ if (allowed_new_user_problem_entry(caller_uid, key, value) == false)
|
|
Matej Habrnal |
fa1950 |
+ {
|
|
Matej Habrnal |
fa1950 |
+ *error = xasprintf("You are not allowed to create element '%s' containing '%s'", key, value);
|
|
Matej Habrnal |
fa1950 |
+ goto finito;
|
|
Matej Habrnal |
fa1950 |
+ }
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
problem_data_add_text_editable(pd, key, value);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
@@ -196,12 +203,13 @@ static char *handle_new_problem(GVariant *problem_info, uid_t caller_uid, char *
|
|
Matej Habrnal |
fa1950 |
/* At least it should generate local problem identifier UUID */
|
|
Matej Habrnal |
fa1950 |
problem_data_add_basics(pd);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
- char *problem_id = problem_data_save(pd);
|
|
Matej Habrnal |
fa1950 |
+ problem_id = problem_data_save(pd);
|
|
Matej Habrnal |
fa1950 |
if (problem_id)
|
|
Matej Habrnal |
fa1950 |
notify_new_path(problem_id);
|
|
Matej Habrnal |
fa1950 |
else if (error)
|
|
Matej Habrnal |
fa1950 |
*error = xasprintf("Cannot create a new problem");
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
+finito:
|
|
Matej Habrnal |
fa1950 |
problem_data_free(pd);
|
|
Matej Habrnal |
fa1950 |
return problem_id;
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
diff --git a/src/include/libabrt.h b/src/include/libabrt.h
|
|
Matej Habrnal |
fa1950 |
index 9de222d..5178eef 100644
|
|
Matej Habrnal |
fa1950 |
--- a/src/include/libabrt.h
|
|
Matej Habrnal |
fa1950 |
+++ b/src/include/libabrt.h
|
|
Matej Habrnal |
fa1950 |
@@ -56,6 +56,8 @@ enum {
|
|
Matej Habrnal |
fa1950 |
};
|
|
Matej Habrnal |
fa1950 |
#define dir_has_correct_permissions abrt_dir_has_correct_permissions
|
|
Matej Habrnal |
fa1950 |
bool dir_has_correct_permissions(const char *dir_name, int flags);
|
|
Matej Habrnal |
fa1950 |
+#define allowed_new_user_problem_entry abrt_allowed_new_user_problem_entry
|
|
Matej Habrnal |
fa1950 |
+bool allowed_new_user_problem_entry(uid_t uid, const char *name, const char *value);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
#define g_settings_nMaxCrashReportsSize abrt_g_settings_nMaxCrashReportsSize
|
|
Matej Habrnal |
fa1950 |
extern unsigned int g_settings_nMaxCrashReportsSize;
|
|
Matej Habrnal |
fa1950 |
diff --git a/src/lib/hooklib.c b/src/lib/hooklib.c
|
|
Matej Habrnal |
fa1950 |
index c94cadf..0a8d703 100644
|
|
Matej Habrnal |
fa1950 |
--- a/src/lib/hooklib.c
|
|
Matej Habrnal |
fa1950 |
+++ b/src/lib/hooklib.c
|
|
Matej Habrnal |
fa1950 |
@@ -552,3 +552,27 @@ bool dir_has_correct_permissions(const char *dir_name, int flags)
|
|
Matej Habrnal |
fa1950 |
*/
|
|
Matej Habrnal |
fa1950 |
return correct_group;
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+bool allowed_new_user_problem_entry(uid_t uid, const char *name, const char *value)
|
|
Matej Habrnal |
fa1950 |
+{
|
|
Matej Habrnal |
fa1950 |
+ /* Allow root to create everything */
|
|
Matej Habrnal |
fa1950 |
+ if (uid == 0)
|
|
Matej Habrnal |
fa1950 |
+ return true;
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ /* Permit non-root users to create everything except: analyzer and type */
|
|
Matej Habrnal |
fa1950 |
+ if (strcmp(name, FILENAME_ANALYZER) != 0
|
|
Matej Habrnal |
fa1950 |
+ && strcmp(name, FILENAME_TYPE) != 0
|
|
Matej Habrnal |
fa1950 |
+ /* compatibility value used in abrt-server */
|
|
Matej Habrnal |
fa1950 |
+ && strcmp(name, "basename") != 0)
|
|
Matej Habrnal |
fa1950 |
+ return true;
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ /* Permit non-root users to create all types except: C/C++, Koops, vmcore and xorg */
|
|
Matej Habrnal |
fa1950 |
+ if (strcmp(value, "CCpp") != 0
|
|
Matej Habrnal |
fa1950 |
+ && strcmp(value, "Kerneloops") != 0
|
|
Matej Habrnal |
fa1950 |
+ && strcmp(value, "vmcore") != 0
|
|
Matej Habrnal |
fa1950 |
+ && strcmp(value, "xorg") != 0)
|
|
Matej Habrnal |
fa1950 |
+ return true;
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ error_msg("Only root is permitted to create element '%s' containing '%s'", name, value);
|
|
Matej Habrnal |
fa1950 |
+ return false;
|
|
Matej Habrnal |
fa1950 |
+}
|
|
Matej Habrnal |
fa1950 |
--
|
|
Matej Habrnal |
fa1950 |
2.1.0
|
|
Matej Habrnal |
fa1950 |
|