summaryrefslogtreecommitdiff
blob: 5b11cd8f5e9806cd241a0b9b6682700d03ec60c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
From fc70fb0161c1b9144d26389434d34dd135cd3f4a Mon Sep 17 00:00:00 2001
From: Albert Astals Cid <aacid@kde.org>
Date: Sat, 2 Feb 2019 14:35:25 +0100
Subject: Remove support for passing gui QVariants to KAuth helpers

Supporting gui variants is very dangerous since they can end up triggering
image loading plugins which are one of the biggest vectors for crashes, which
for very smart people mean possible code execution, which is very dangerous
in code that is executed as root.

We've checked all the KAuth helpers inside KDE git and none seems to be using
gui variants, so we're not actually limiting anything that people wanted to do.

Reviewed by security@kde.org and Aleix Pol

Issue reported by Fabian Vogt
---
 src/backends/dbus/DBusHelperProxy.cpp | 9 +++++++++
 src/kauthaction.h                     | 2 ++
 2 files changed, 11 insertions(+)

diff --git a/src/backends/dbus/DBusHelperProxy.cpp b/src/backends/dbus/DBusHelperProxy.cpp
index 10c14c6..8f0d336 100644
--- a/src/backends/dbus/DBusHelperProxy.cpp
+++ b/src/backends/dbus/DBusHelperProxy.cpp
@@ -31,6 +31,8 @@
 #include "kf5authadaptor.h"
 #include "kauthdebug.h"
 
+extern Q_CORE_EXPORT const QMetaTypeInterface *qMetaTypeGuiHelper;
+
 namespace KAuth
 {
 
@@ -229,10 +231,17 @@ QByteArray DBusHelperProxy::performAction(const QString &action, const QByteArra
         return ActionReply::HelperBusyReply().serialized();
     }
 
+    // Make sure we don't try restoring gui variants, in particular QImage/QPixmap/QIcon are super dangerous
+    // since they end up calling the image loaders and thus are a vector for crashing → executing code
+    auto origMetaTypeGuiHelper = qMetaTypeGuiHelper;
+    qMetaTypeGuiHelper = nullptr;
+
     QVariantMap args;
     QDataStream s(&arguments, QIODevice::ReadOnly);
     s >> args;
 
+    qMetaTypeGuiHelper = origMetaTypeGuiHelper;
+
     m_currentAction = action;
     emit remoteSignal(ActionStarted, action, QByteArray());
     QEventLoop e;
diff --git a/src/kauthaction.h b/src/kauthaction.h
index c67a70a..01f3ba1 100644
--- a/src/kauthaction.h
+++ b/src/kauthaction.h
@@ -298,6 +298,8 @@ public:
      * This method sets the variant map that the application
      * can use to pass arbitrary data to the helper when executing the action.
      *
+     * Only non-gui variants are supported.
+     *
      * @param arguments The new arguments map
      */
     void setArguments(const QVariantMap &arguments);
-- 
cgit v1.1