View difference between Paste ID: 6dNV7vW9 and MheuF2UY
SHOW: | | - or go back to the newest paste.
1
On Linux execve() can be called with a NULL argv, which results in
2
argc being set to zero and an empty list for argv. Doing so causes the
3
polkit applications to misbehave, for example:
4
5
  $ python
6
  >>> import os
7
  >>> os.execve("/usr/bin/pkexec", [], {"FOO":"aaaaaaaaa"})
8
  Cannot run program FOO=aaaaaaaaa: No such file or directory
9
10
While this doesn't appear to have an further impact, setuid binaries
11
should be hardened against any possible misuse. Add an explicit check
12
for argc == 0 to all of the polkit applications.
13
14
Signed-off-by: Ryan Mallon <rmallon@gmail.com>
15
---
16
17
 src/programs/pkaction.c   |   10 ++++++++++
18
 src/programs/pkcheck.c    |   10 ++++++++++
19
 src/programs/pkexec.c     |   10 ++++++++++
20
 src/programs/pkttyagent.c |   10 ++++++++++
21
 4 files changed, 40 insertions(+)
22
23
diff --git a/src/programs/pkaction.c b/src/programs/pkaction.c
24
index f17a7dc..1034a82 100644
25
--- a/src/programs/pkaction.c
26
+++ b/src/programs/pkaction.c
27
@@ -121,6 +121,16 @@ main (int argc, char *argv[])
28
   actions = NULL;
29
   ret = 1;
30
31
+  /*
32
+   * Linux allows an empty list to be passed for argv. This is a non-standard
33
+   * (mis)feature, so don't allow it.
34
+   */
35
+  if (argc == 0)
36
+    {
37
+      g_printerr("Refusing to accept empty argv\n");
38
+      goto out;
39
+    }
40
+
41
   g_type_init ();
42
43
   opt_show_version = FALSE;
44
diff --git a/src/programs/pkcheck.c b/src/programs/pkcheck.c
45
index 5781893..c2352e3 100644
46
--- a/src/programs/pkcheck.c
47
+++ b/src/programs/pkcheck.c
48
@@ -362,6 +362,16 @@ main (int argc, char *argv[])
49
   local_agent_handle = NULL;
50
   ret = 126;
51
52
+  /*
53
+   * Linux allows an empty list to be passed for argv. This is a non-standard
54
+   * (mis)feature, so don't allow it.
55
+   */
56
+  if (argc == 0)
57
+    {
58
+      g_printerr("Refusing to accept empty argv\n");
59
+      goto out;
60
+    }
61
+
62
   g_type_init ();
63
64
   details = polkit_details_new ();
65
diff --git a/src/programs/pkexec.c b/src/programs/pkexec.c
66
index a7ca8e0..88363c0 100644
67
--- a/src/programs/pkexec.c
68
+++ b/src/programs/pkexec.c
69
@@ -502,6 +502,16 @@ main (int argc, char *argv[])
70
   opt_user = NULL;
71
   local_agent_handle = NULL;
72
73
+  /*
74
+   * Linux allows an empty list to be passed for argv. This is a non-standard
75
+   * (mis)feature, so don't allow it.
76
+   */
77
+  if (argc == 0)
78
+    {
79
+      g_printerr("Refusing to accept empty argv\n");
80
+      goto out;
81
+    }
82
+
83
   /* check for correct invocation */
84
   if (geteuid () != 0)
85
     {
86
diff --git a/src/programs/pkttyagent.c b/src/programs/pkttyagent.c
87
index 423b728..ed3caa5 100644
88
--- a/src/programs/pkttyagent.c
89
+++ b/src/programs/pkttyagent.c
90
@@ -74,6 +74,16 @@ main (int argc, char *argv[])
91
   guint ret = 126;
92
   GVariantBuilder builder;
93
94
+  /*
95
+   * Linux allows an empty list to be passed for argv. This is a non-standard
96
+   * (mis)feature, so don't allow it.
97
+   */
98
+  if (argc == 0)
99
+    {
100
+      g_printerr("Refusing to accept empty argv\n");
101
+      goto out;
102
+    }
103
+
104
   g_type_init ();
105
106
   error = NULL;
107
--
108
1.7.9.7