Lines 1-172
Link Here
|
1 |
Index: src/lib/restrict-access.c |
|
|
2 |
=================================================================== |
3 |
RCS file: /home/cvs/dovecot/src/lib/restrict-access.c,v |
4 |
retrieving revision 1.10 |
5 |
diff -u -3 -p -r1.10 restrict-access.c |
6 |
--- src/lib/restrict-access.c 4 Mar 2003 04:00:13 -0000 1.10 |
7 |
+++ src/lib/restrict-access.c 15 Apr 2003 17:37:26 -0000 |
8 |
@@ -31,12 +31,14 @@ |
9 |
#include <grp.h> |
10 |
|
11 |
void restrict_access_set_env(const char *user, uid_t uid, gid_t gid, |
12 |
- const char *chroot_dir) |
13 |
+ const char *chroot_dir, int allow_zg) |
14 |
{ |
15 |
if (user != NULL && *user != '\0') |
16 |
env_put(t_strconcat("RESTRICT_USER=", user, NULL)); |
17 |
if (chroot_dir != NULL && *chroot_dir != '\0') |
18 |
env_put(t_strconcat("RESTRICT_CHROOT=", chroot_dir, NULL)); |
19 |
+ if (allow_zg == TRUE) |
20 |
+ env_put(t_strdup("ALLOW_ZERO_GID=TRUE")); |
21 |
|
22 |
env_put(t_strdup_printf("RESTRICT_SETUID=%s", dec2str(uid))); |
23 |
env_put(t_strdup_printf("RESTRICT_SETGID=%s", dec2str(gid))); |
24 |
@@ -45,6 +47,7 @@ void restrict_access_set_env(const char |
25 |
void restrict_access_by_env(int disallow_root) |
26 |
{ |
27 |
const char *env; |
28 |
+ int allow_zero_gid; |
29 |
gid_t gid; |
30 |
uid_t uid; |
31 |
|
32 |
@@ -97,8 +100,14 @@ void restrict_access_by_env(int disallow |
33 |
i_fatal("We couldn't drop root privileges"); |
34 |
} |
35 |
|
36 |
- if ((gid != 0 && uid != 0) || disallow_root) { |
37 |
+ /* allow users with zero group id permission for BSD */ |
38 |
+ env = getenv("ALLOW_ZERO_GID"); |
39 |
+ allow_zero_gid = env == NULL ? FALSE : TRUE; |
40 |
+ |
41 |
+ if (allow_zero_gid == FALSE && |
42 |
+ ((gid != 0 && uid != 0) || disallow_root)) { |
43 |
if (getgid() == 0 || getegid() == 0 || setgid(0) == 0) |
44 |
i_fatal("We couldn't drop root group privileges"); |
45 |
} |
46 |
+ |
47 |
} |
48 |
Index: src/lib/restrict-access.h |
49 |
=================================================================== |
50 |
RCS file: /home/cvs/dovecot/src/lib/restrict-access.h,v |
51 |
retrieving revision 1.4 |
52 |
diff -u -3 -p -r1.4 restrict-access.h |
53 |
--- src/lib/restrict-access.h 4 Mar 2003 04:00:13 -0000 1.4 |
54 |
+++ src/lib/restrict-access.h 15 Apr 2003 17:37:26 -0000 |
55 |
@@ -4,7 +4,7 @@ |
56 |
/* set environment variables so they can be read with |
57 |
restrict_access_by_env() */ |
58 |
void restrict_access_set_env(const char *user, uid_t uid, gid_t gid, |
59 |
- const char *chroot_dir); |
60 |
+ const char *chroot_dir, int allow_zg); |
61 |
|
62 |
/* chroot, setuid() and setgid() based on environment variables. |
63 |
If disallow_roots is TRUE, we'll kill ourself if we didn't have the |
64 |
Index: src/master/auth-process.c |
65 |
=================================================================== |
66 |
RCS file: /home/cvs/dovecot/src/master/auth-process.c,v |
67 |
retrieving revision 1.41 |
68 |
diff -u -3 -p -r1.41 auth-process.c |
69 |
--- src/master/auth-process.c 2 Apr 2003 02:09:41 -0000 1.41 |
70 |
+++ src/master/auth-process.c 15 Apr 2003 17:37:27 -0000 |
71 |
@@ -307,7 +307,7 @@ static pid_t create_auth_process(struct |
72 |
|
73 |
/* setup access environment */ |
74 |
restrict_access_set_env(group->set->user, pwd->pw_uid, pwd->pw_gid, |
75 |
- group->set->chroot); |
76 |
+ group->set->chroot, set->allow_zero_gid); |
77 |
|
78 |
/* set other environment */ |
79 |
env_put(t_strconcat("AUTH_PROCESS=", dec2str(getpid()), NULL)); |
80 |
Index: src/master/login-process.c |
81 |
=================================================================== |
82 |
RCS file: /home/cvs/dovecot/src/master/login-process.c,v |
83 |
retrieving revision 1.40 |
84 |
diff -u -3 -p -r1.40 login-process.c |
85 |
--- src/master/login-process.c 15 Apr 2003 16:58:48 -0000 1.40 |
86 |
+++ src/master/login-process.c 15 Apr 2003 17:37:27 -0000 |
87 |
@@ -384,7 +384,8 @@ static void login_process_init_env(struc |
88 |
clean_child_process() since it clears environment */ |
89 |
restrict_access_set_env(group->set->user, |
90 |
group->set->uid, set->login_gid, |
91 |
- set->login_chroot ? set->login_dir : NULL); |
92 |
+ set->login_chroot ? set->login_dir : NULL, |
93 |
+ FALSE); |
94 |
|
95 |
env_put("DOVECOT_MASTER=1"); |
96 |
|
97 |
Index: src/master/mail-process.c |
98 |
=================================================================== |
99 |
RCS file: /home/cvs/dovecot/src/master/mail-process.c,v |
100 |
retrieving revision 1.13 |
101 |
diff -u -3 -p -r1.13 mail-process.c |
102 |
--- src/master/mail-process.c 15 Apr 2003 16:58:48 -0000 1.13 |
103 |
+++ src/master/mail-process.c 15 Apr 2003 17:37:28 -0000 |
104 |
@@ -25,7 +25,7 @@ static int validate_uid_gid(uid_t uid, g |
105 |
return FALSE; |
106 |
} |
107 |
|
108 |
- if (uid != 0 && gid == 0) { |
109 |
+ if (set->allow_zero_gid == FALSE && uid != 0 && gid == 0) { |
110 |
i_error("mail process isn't allowed to be in group 0"); |
111 |
return FALSE; |
112 |
} |
113 |
@@ -38,8 +38,9 @@ static int validate_uid_gid(uid_t uid, g |
114 |
return FALSE; |
115 |
} |
116 |
|
117 |
- if (gid < (gid_t)set->first_valid_gid || |
118 |
- (set->last_valid_gid != 0 && gid > (gid_t)set->last_valid_gid)) { |
119 |
+ if (set->allow_zero_gid == FALSE && |
120 |
+ (gid < (gid_t)set->first_valid_gid || |
121 |
+ (set->last_valid_gid != 0 && gid > (gid_t)set->last_valid_gid))) { |
122 |
i_error("mail process isn't allowed to use " |
123 |
"GID %s (UID is %s)", dec2str(gid), dec2str(uid)); |
124 |
return FALSE; |
125 |
@@ -150,7 +151,8 @@ int create_mail_process(int socket, stru |
126 |
(paranoia about filling up environment without noticing) */ |
127 |
restrict_access_set_env(data + reply->system_user_idx, |
128 |
reply->uid, reply->gid, |
129 |
- reply->chroot ? data + reply->home_idx : NULL); |
130 |
+ reply->chroot ? data + reply->home_idx : NULL, |
131 |
+ set->allow_zero_gid); |
132 |
|
133 |
restrict_process_size(process_size, (unsigned int)-1); |
134 |
|
135 |
Index: src/master/master-settings.c |
136 |
=================================================================== |
137 |
RCS file: /home/cvs/dovecot/src/master/master-settings.c,v |
138 |
retrieving revision 1.16 |
139 |
diff -u -3 -p -r1.16 master-settings.c |
140 |
--- src/master/master-settings.c 2 Apr 2003 02:09:41 -0000 1.16 |
141 |
+++ src/master/master-settings.c 15 Apr 2003 17:37:28 -0000 |
142 |
@@ -46,6 +46,7 @@ static struct setting_def setting_defs[] |
143 |
DEF(SET_INT, max_mail_processes), |
144 |
DEF(SET_BOOL, verbose_proctitle), |
145 |
|
146 |
+ DEF(SET_BOOL, allow_zero_gid), |
147 |
DEF(SET_INT, first_valid_uid), |
148 |
DEF(SET_INT, last_valid_uid), |
149 |
DEF(SET_INT, first_valid_gid), |
150 |
@@ -153,6 +154,7 @@ struct settings default_settings = { |
151 |
MEMBER(max_mail_processes) 1024, |
152 |
MEMBER(verbose_proctitle) FALSE, |
153 |
|
154 |
+ MEMBER(allow_zero_gid) FALSE, |
155 |
MEMBER(first_valid_uid) 500, |
156 |
MEMBER(last_valid_uid) 0, |
157 |
MEMBER(first_valid_gid) 1, |
158 |
Index: src/master/master-settings.h |
159 |
=================================================================== |
160 |
RCS file: /home/cvs/dovecot/src/master/master-settings.h,v |
161 |
retrieving revision 1.10 |
162 |
diff -u -3 -p -r1.10 master-settings.h |
163 |
--- src/master/master-settings.h 2 Apr 2003 02:09:41 -0000 1.10 |
164 |
+++ src/master/master-settings.h 15 Apr 2003 17:37:29 -0000 |
165 |
@@ -32,6 +32,7 @@ struct settings { |
166 |
unsigned int max_mail_processes; |
167 |
int verbose_proctitle; |
168 |
|
169 |
+ int allow_zero_gid; |
170 |
unsigned int first_valid_uid, last_valid_uid; |
171 |
unsigned int first_valid_gid, last_valid_gid; |
172 |
|