1 |
jpp |
1.1 |
diff -up sudo-1.8.6p3/plugins/sudoers/check.c.CVE-2013 sudo-1.8.6p3/plugins/sudoers/check.c |
2 |
|
|
--- sudo-1.8.6p3/plugins/sudoers/check.c.CVE-2013 2013-10-07 14:28:55.946568106 +0200 |
3 |
|
|
+++ sudo-1.8.6p3/plugins/sudoers/check.c 2013-10-07 14:29:51.157768333 +0200 |
4 |
|
|
@@ -82,6 +82,7 @@ static struct tty_info { |
5 |
|
|
dev_t rdev; /* tty device ID */ |
6 |
|
|
ino_t ino; /* tty inode number */ |
7 |
|
|
struct timeval ctime; /* tty inode change time */ |
8 |
|
|
+ pid_t sid; /* ID of session with controlling tty */ |
9 |
|
|
} tty_info; |
10 |
|
|
|
11 |
|
|
static int build_timestamp(char **, char **); |
12 |
|
|
@@ -138,13 +139,14 @@ check_user(int validated, int mode) |
13 |
|
|
if (ISSET(mode, MODE_IGNORE_TICKET)) |
14 |
|
|
SET(validated, FLAG_CHECK_USER); |
15 |
|
|
|
16 |
|
|
- /* Stash the tty's ctime for tty ticket comparison. */ |
17 |
|
|
+ /* Stash the tty's device, session ID and ctime for ticket comparison. */ |
18 |
|
|
if (def_tty_tickets && user_ttypath && stat(user_ttypath, &sb) == 0) { |
19 |
|
|
tty_info.dev = sb.st_dev; |
20 |
|
|
tty_info.ino = sb.st_ino; |
21 |
|
|
tty_info.rdev = sb.st_rdev; |
22 |
|
|
if (tty_is_devpts(user_ttypath)) |
23 |
|
|
ctim_get(&sb, &tty_info.ctime); |
24 |
|
|
+ tty_info.sid = user_sid; |
25 |
|
|
} |
26 |
|
|
|
27 |
|
|
if (build_timestamp(×tampdir, ×tampfile) == -1) { |
28 |
|
|
@@ -627,31 +629,34 @@ timestamp_status(char *timestampdir, cha |
29 |
|
|
*/ |
30 |
|
|
if (status == TS_OLD && !ISSET(flags, TS_REMOVE)) { |
31 |
|
|
mtim_get(&sb, &mtime); |
32 |
|
|
- /* Negative timeouts only expire manually (sudo -k). */ |
33 |
|
|
- if (def_timestamp_timeout < 0 && mtime.tv_sec != 0) |
34 |
|
|
- status = TS_CURRENT; |
35 |
|
|
- else { |
36 |
|
|
- now = time(NULL); |
37 |
|
|
- if (def_timestamp_timeout && |
38 |
|
|
- now - mtime.tv_sec < 60 * def_timestamp_timeout) { |
39 |
|
|
- /* |
40 |
|
|
- * Check for bogus time on the stampfile. The clock may |
41 |
|
|
- * have been set back or someone could be trying to spoof us. |
42 |
|
|
- */ |
43 |
|
|
- if (mtime.tv_sec > now + 60 * def_timestamp_timeout * 2) { |
44 |
|
|
- time_t tv_sec = (time_t)mtime.tv_sec; |
45 |
|
|
- log_error(0, |
46 |
|
|
- _("timestamp too far in the future: %20.20s"), |
47 |
|
|
- 4 + ctime(&tv_sec)); |
48 |
|
|
- if (timestampfile) |
49 |
|
|
- (void) unlink(timestampfile); |
50 |
|
|
- else |
51 |
|
|
- (void) rmdir(timestampdir); |
52 |
|
|
- status = TS_MISSING; |
53 |
|
|
- } else if (get_boottime(&boottime) && timevalcmp(&mtime, &boottime, <)) { |
54 |
|
|
- status = TS_OLD; |
55 |
|
|
- } else { |
56 |
|
|
- status = TS_CURRENT; |
57 |
|
|
+ if (timevalisset(&mtime)) { |
58 |
|
|
+ /* Negative timeouts only expire manually (sudo -k). */ |
59 |
|
|
+ if (def_timestamp_timeout < 0) { |
60 |
|
|
+ status = TS_CURRENT; |
61 |
|
|
+ } else { |
62 |
|
|
+ now = time(NULL); |
63 |
|
|
+ if (def_timestamp_timeout && |
64 |
|
|
+ now - mtime.tv_sec < 60 * def_timestamp_timeout) { |
65 |
|
|
+ /* |
66 |
|
|
+ * Check for bogus time on the stampfile. The clock may |
67 |
|
|
+ * have been set back or user could be trying to spoof us. |
68 |
|
|
+ */ |
69 |
|
|
+ if (mtime.tv_sec > now + 60 * def_timestamp_timeout * 2) { |
70 |
|
|
+ time_t tv_sec = (time_t)mtime.tv_sec; |
71 |
|
|
+ log_error(0, |
72 |
|
|
+ _("timestamp too far in the future: %20.20s"), |
73 |
|
|
+ 4 + ctime(&tv_sec)); |
74 |
|
|
+ if (timestampfile) |
75 |
|
|
+ (void) unlink(timestampfile); |
76 |
|
|
+ else |
77 |
|
|
+ (void) rmdir(timestampdir); |
78 |
|
|
+ status = TS_MISSING; |
79 |
|
|
+ } else if (get_boottime(&boottime) && |
80 |
|
|
+ timevalcmp(&mtime, &boottime, <)) { |
81 |
|
|
+ status = TS_OLD; |
82 |
|
|
+ } else { |
83 |
|
|
+ status = TS_CURRENT; |
84 |
|
|
+ } |
85 |
|
|
} |
86 |
|
|
} |
87 |
|
|
} |
88 |
|
|
diff -up sudo-1.8.6p3/plugins/sudoers/sudoers.c.CVE-2013 sudo-1.8.6p3/plugins/sudoers/sudoers.c |
89 |
|
|
--- sudo-1.8.6p3/plugins/sudoers/sudoers.c.CVE-2013 2013-10-07 14:29:09.758620785 +0200 |
90 |
|
|
+++ sudo-1.8.6p3/plugins/sudoers/sudoers.c 2013-10-07 14:29:40.710731072 +0200 |
91 |
|
|
@@ -1429,6 +1429,10 @@ deserialize_info(char * const args[], ch |
92 |
|
|
sudo_user.cols = atoi(*cur + sizeof("cols=") - 1); |
93 |
|
|
continue; |
94 |
|
|
} |
95 |
|
|
+ if (MATCHES(*cur, "sid=")) { |
96 |
|
|
+ sudo_user.sid = atoi(*cur + sizeof("sid=") - 1); |
97 |
|
|
+ continue; |
98 |
|
|
+ } |
99 |
|
|
} |
100 |
|
|
if (user_cwd == NULL) |
101 |
|
|
user_cwd = "unknown"; |
102 |
|
|
diff -up sudo-1.8.6p3/plugins/sudoers/sudoers.h.CVE-2013 sudo-1.8.6p3/plugins/sudoers/sudoers.h |
103 |
|
|
--- sudo-1.8.6p3/plugins/sudoers/sudoers.h.CVE-2013 2013-10-07 14:29:21.401662293 +0200 |
104 |
|
|
+++ sudo-1.8.6p3/plugins/sudoers/sudoers.h 2013-10-07 14:29:40.711731073 +0200 |
105 |
|
|
@@ -95,6 +95,7 @@ struct sudo_user { |
106 |
|
|
int flags; |
107 |
|
|
uid_t uid; |
108 |
|
|
uid_t gid; |
109 |
|
|
+ pid_t sid; |
110 |
|
|
}; |
111 |
|
|
|
112 |
|
|
/* |
113 |
|
|
@@ -172,8 +173,8 @@ struct sudo_user { |
114 |
|
|
#define user_name (sudo_user.name) |
115 |
|
|
#define user_uid (sudo_user.uid) |
116 |
|
|
#define user_gid (sudo_user.gid) |
117 |
|
|
+#define user_sid (sudo_user.sid) |
118 |
|
|
#define user_passwd (sudo_user.pw->pw_passwd) |
119 |
|
|
-#define user_uuid (sudo_user.uuid) |
120 |
|
|
#define user_dir (sudo_user.pw->pw_dir) |
121 |
|
|
#define user_gids (sudo_user.gids) |
122 |
|
|
#define user_ngids (sudo_user.ngids) |
123 |
|
|
diff -up sudo-1.8.6p3/src/ttyname.c.CVE-2013 sudo-1.8.6p3/src/ttyname.c |
124 |
|
|
--- sudo-1.8.6p3/src/ttyname.c.CVE-2013 2013-10-07 14:28:12.969413189 +0200 |
125 |
|
|
+++ sudo-1.8.6p3/src/ttyname.c 2013-10-07 14:29:34.954709709 +0200 |
126 |
|
|
@@ -1,5 +1,5 @@ |
127 |
|
|
/* |
128 |
|
|
- * Copyright (c) 2012 Todd C. Miller <Todd.Miller@courtesan.com> |
129 |
|
|
+ * Copyright (c) 2012-2013 Todd C. Miller <Todd.Miller@courtesan.com> |
130 |
|
|
* |
131 |
|
|
* Permission to use, copy, modify, and distribute this software for any |
132 |
|
|
* purpose with or without fee is hereby granted, provided that the above |
133 |
|
|
@@ -377,14 +377,6 @@ get_process_ttyname(void) |
134 |
|
|
} |
135 |
|
|
efree(ki_proc); |
136 |
|
|
|
137 |
|
|
- /* If all else fails, fall back on ttyname(). */ |
138 |
|
|
- if (tty == NULL) { |
139 |
|
|
- if ((tty = ttyname(STDIN_FILENO)) != NULL || |
140 |
|
|
- (tty = ttyname(STDOUT_FILENO)) != NULL || |
141 |
|
|
- (tty = ttyname(STDERR_FILENO)) != NULL) |
142 |
|
|
- tty = estrdup(tty); |
143 |
|
|
- } |
144 |
|
|
- |
145 |
|
|
debug_return_str(tty); |
146 |
|
|
} |
147 |
|
|
#elif defined(HAVE_STRUCT_PSINFO_PR_TTYDEV) |
148 |
|
|
@@ -416,14 +408,6 @@ get_process_ttyname(void) |
149 |
|
|
} |
150 |
|
|
} |
151 |
|
|
|
152 |
|
|
- /* If all else fails, fall back on ttyname(). */ |
153 |
|
|
- if (tty == NULL) { |
154 |
|
|
- if ((tty = ttyname(STDIN_FILENO)) != NULL || |
155 |
|
|
- (tty = ttyname(STDOUT_FILENO)) != NULL || |
156 |
|
|
- (tty = ttyname(STDERR_FILENO)) != NULL) |
157 |
|
|
- tty = estrdup(tty); |
158 |
|
|
- } |
159 |
|
|
- |
160 |
|
|
debug_return_str(tty); |
161 |
|
|
} |
162 |
|
|
#elif defined(__linux__) |
163 |
|
|
@@ -442,7 +426,7 @@ get_process_ttyname(void) |
164 |
|
|
int i; |
165 |
|
|
debug_decl(get_process_ttyname, SUDO_DEBUG_UTIL) |
166 |
|
|
|
167 |
|
|
- /* Try to determine the tty from pr_ttydev in /proc/pid/psinfo. */ |
168 |
|
|
+ /* Try to determine the tty from tty_nr in /proc/pid/stat. */ |
169 |
|
|
for (i = 0; tty == NULL && i < 2; i++) { |
170 |
|
|
FILE *fp; |
171 |
|
|
char path[PATH_MAX]; |
172 |
|
|
@@ -470,14 +454,6 @@ get_process_ttyname(void) |
173 |
|
|
} |
174 |
|
|
efree(line); |
175 |
|
|
|
176 |
|
|
- /* If all else fails, fall back on ttyname(). */ |
177 |
|
|
- if (tty == NULL) { |
178 |
|
|
- if ((tty = ttyname(STDIN_FILENO)) != NULL || |
179 |
|
|
- (tty = ttyname(STDOUT_FILENO)) != NULL || |
180 |
|
|
- (tty = ttyname(STDERR_FILENO)) != NULL) |
181 |
|
|
- tty = estrdup(tty); |
182 |
|
|
- } |
183 |
|
|
- |
184 |
|
|
debug_return_str(tty); |
185 |
|
|
} |
186 |
|
|
#else |