~ubuntu-branches/ubuntu/lucid/wpasupplicant/lucid-updates

« back to all changes in this revision

Viewing changes to debian/patches/CVE-2014-3686.patch

  • Committer: Package Import Robot
  • Author(s): Marc Deslauriers
  • Date: 2014-10-10 09:27:24 UTC
  • mfrom: (8.1.1 lucid-security)
  • Revision ID: package-import@ubuntu.com-20141010092724-cchjm0qok5spykcj
Tags: 0.6.9-3ubuntu3.2
* SECURITY UPDATE: arbitrary command execution via unsanitized string
  passed to action scripts by wpa_cli
  - debian/patches/CVE-2014-3686.patch: added os_exec() helper to
    src/utils/os.h, src/utils/os_unix.c, src/utils/os_win32.c,
    use instead of system() in wpa_supplicant/wpa_cli.c.
  - CVE-2014-3686

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
Description: fix arbitrary command execution via unsanitized string
 
2
 passed to action scripts by wpa_cli
 
3
Origin: backport, http://w1.fi/security/2014-1/
 
4
 
 
5
Index: wpasupplicant-0.6.9/src/utils/os.h
 
6
===================================================================
 
7
--- wpasupplicant-0.6.9.orig/src/utils/os.h
 
8
+++ wpasupplicant-0.6.9/src/utils/os.h
 
9
@@ -468,6 +468,15 @@ int os_snprintf(char *str, size_t size,
 
10
  */
 
11
 size_t os_strlcpy(char *dest, const char *src, size_t siz);
 
12
 
 
13
+/**
 
14
+ * os_exec - Execute an external program
 
15
+ * @program: Path to the program
 
16
+ * @arg: Command line argument string
 
17
+ * @wait_completion: Whether to wait until the program execution completes
 
18
+ * Returns: 0 on success, -1 on error
 
19
+ */
 
20
+int os_exec(const char *program, const char *arg, int wait_completion);
 
21
+
 
22
 
 
23
 #ifdef OS_REJECT_C_LIB_FUNCTIONS
 
24
 #define malloc OS_DO_NOT_USE_malloc
 
25
Index: wpasupplicant-0.6.9/src/utils/os_unix.c
 
26
===================================================================
 
27
--- wpasupplicant-0.6.9.orig/src/utils/os_unix.c
 
28
+++ wpasupplicant-0.6.9/src/utils/os_unix.c
 
29
@@ -14,6 +14,8 @@
 
30
 
 
31
 #include "includes.h"
 
32
 
 
33
+#include <sys/wait.h>
 
34
+
 
35
 #include "os.h"
 
36
 
 
37
 void os_sleep(os_time_t sec, os_time_t usec)
 
38
@@ -296,3 +298,57 @@ size_t os_strlcpy(char *dest, const char
 
39
 
 
40
        return s - src - 1;
 
41
 }
 
42
+
 
43
+
 
44
+int os_exec(const char *program, const char *arg, int wait_completion)
 
45
+{
 
46
+       pid_t pid;
 
47
+       int pid_status;
 
48
+
 
49
+       pid = fork();
 
50
+       if (pid < 0) {
 
51
+               perror("fork");
 
52
+               return -1;
 
53
+       }
 
54
+
 
55
+       if (pid == 0) {
 
56
+               /* run the external command in the child process */
 
57
+               const int MAX_ARG = 30;
 
58
+               char *_program, *_arg, *pos;
 
59
+               char *argv[MAX_ARG + 1];
 
60
+               int i;
 
61
+
 
62
+               _program = os_strdup(program);
 
63
+               _arg = os_strdup(arg);
 
64
+
 
65
+               argv[0] = _program;
 
66
+
 
67
+               i = 1;
 
68
+               pos = _arg;
 
69
+               while (i < MAX_ARG && pos && *pos) {
 
70
+                       while (*pos == ' ')
 
71
+                               pos++;
 
72
+                       if (*pos == '\0')
 
73
+                               break;
 
74
+                       argv[i++] = pos;
 
75
+                       pos = os_strchr(pos, ' ');
 
76
+                       if (pos)
 
77
+                               *pos++ = '\0';
 
78
+               }
 
79
+               argv[i] = NULL;
 
80
+
 
81
+               execv(program, argv);
 
82
+               perror("execv");
 
83
+               os_free(_program);
 
84
+               os_free(_arg);
 
85
+               exit(0);
 
86
+               return -1;
 
87
+       }
 
88
+
 
89
+       if (wait_completion) {
 
90
+               /* wait for the child process to complete in the parent */
 
91
+               waitpid(pid, &pid_status, 0);
 
92
+       }
 
93
+
 
94
+       return 0;
 
95
+}
 
96
Index: wpasupplicant-0.6.9/src/utils/os_win32.c
 
97
===================================================================
 
98
--- wpasupplicant-0.6.9.orig/src/utils/os_win32.c
 
99
+++ wpasupplicant-0.6.9/src/utils/os_win32.c
 
100
@@ -220,3 +220,9 @@ size_t os_strlcpy(char *dest, const char
 
101
 
 
102
        return s - src - 1;
 
103
 }
 
104
+
 
105
+
 
106
+int os_exec(const char *program, const char *arg, int wait_completion)
 
107
+{
 
108
+       return -1;
 
109
+}
 
110
Index: wpasupplicant-0.6.9/wpa_supplicant/wpa_cli.c
 
111
===================================================================
 
112
--- wpasupplicant-0.6.9.orig/wpa_supplicant/wpa_cli.c
 
113
+++ wpasupplicant-0.6.9/wpa_supplicant/wpa_cli.c
 
114
@@ -1349,28 +1349,19 @@ static int str_match(const char *a, cons
 
115
 static int wpa_cli_exec(const char *program, const char *arg1,
 
116
                        const char *arg2)
 
117
 {
 
118
-       char *cmd;
 
119
+       char *arg;
 
120
        size_t len;
 
121
        int res;
 
122
-       int ret = 0;
 
123
 
 
124
-       len = os_strlen(program) + os_strlen(arg1) + os_strlen(arg2) + 3;
 
125
-       cmd = os_malloc(len);
 
126
-       if (cmd == NULL)
 
127
+       len = os_strlen(arg1) + os_strlen(arg2) + 2;
 
128
+       arg = os_malloc(len);
 
129
+       if (arg == NULL)
 
130
                return -1;
 
131
-       res = os_snprintf(cmd, len, "%s %s %s", program, arg1, arg2);
 
132
-       if (res < 0 || (size_t) res >= len) {
 
133
-               os_free(cmd);
 
134
-               return -1;
 
135
-       }
 
136
-       cmd[len - 1] = '\0';
 
137
-#ifndef _WIN32_WCE
 
138
-       if (system(cmd) < 0)
 
139
-               ret = -1;
 
140
-#endif /* _WIN32_WCE */
 
141
-       os_free(cmd);
 
142
+       os_snprintf(arg, len, "%s %s", arg1, arg2);
 
143
+       res = os_exec(program, arg, 1);
 
144
+       os_free(arg);
 
145
 
 
146
-       return ret;
 
147
+       return res;
 
148
 }
 
149
 
 
150