Skip to content

Commit b61e58d

Browse files
alexey-tikhonovikerexxe
authored andcommitted
KRB5_CHILD: don't check if FILE:/DIR: path accessible in advance
Inaccessible FILE:/DIR: path is a system configuration error that needs to be fixed anyway. It doesn't make much difference to fail before or after credentials check in this case. Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com> Reviewed-by: Sumit Bose <sbose@redhat.com>
1 parent 1f9d22c commit b61e58d

File tree

5 files changed

+32
-459
lines changed

5 files changed

+32
-459
lines changed

src/providers/krb5/krb5_ccache.c

Lines changed: 0 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -112,154 +112,6 @@ static errno_t find_ccdir_parent_data(TALLOC_CTX *mem_ctx,
112112
return ret;
113113
}
114114

115-
static errno_t check_parent_stat(struct stat *parent_stat, uid_t uid)
116-
{
117-
if (parent_stat->st_uid != 0 && parent_stat->st_uid != uid) {
118-
DEBUG(SSSDBG_CRIT_FAILURE,
119-
"Private directory can only be created below a directory "
120-
"belonging to root or to [%"SPRIuid"].\n", uid);
121-
return EINVAL;
122-
}
123-
124-
if (parent_stat->st_uid == uid) {
125-
if (!(parent_stat->st_mode & S_IXUSR)) {
126-
DEBUG(SSSDBG_CRIT_FAILURE,
127-
"Parent directory does not have the search bit set for "
128-
"the owner.\n");
129-
return EINVAL;
130-
}
131-
} else {
132-
if (!(parent_stat->st_mode & S_IXOTH)) {
133-
DEBUG(SSSDBG_CRIT_FAILURE,
134-
"Parent directory does not have the search bit set for "
135-
"others.\n");
136-
return EINVAL;
137-
}
138-
}
139-
140-
return EOK;
141-
}
142-
143-
static errno_t create_ccache_dir(const char *ccdirname, uid_t uid, gid_t gid)
144-
{
145-
int ret = EFAULT;
146-
struct stat parent_stat;
147-
struct string_list *missing_parents = NULL;
148-
struct string_list *li = NULL;
149-
mode_t old_umask;
150-
mode_t new_dir_mode;
151-
TALLOC_CTX *tmp_ctx = NULL;
152-
153-
tmp_ctx = talloc_new(NULL);
154-
if (tmp_ctx == NULL) {
155-
DEBUG(SSSDBG_CRIT_FAILURE,
156-
"talloc_new failed.\n");
157-
return ENOMEM;
158-
}
159-
160-
if (*ccdirname != '/') {
161-
DEBUG(SSSDBG_MINOR_FAILURE,
162-
"Only absolute paths are allowed, not [%s] .\n", ccdirname);
163-
ret = EINVAL;
164-
goto done;
165-
}
166-
167-
ret = find_ccdir_parent_data(tmp_ctx, ccdirname, &parent_stat,
168-
&missing_parents);
169-
if (ret != EOK) {
170-
DEBUG(SSSDBG_MINOR_FAILURE,
171-
"find_ccdir_parent_data failed.\n");
172-
goto done;
173-
}
174-
175-
ret = check_parent_stat(&parent_stat, uid);
176-
if (ret != EOK) {
177-
DEBUG(SSSDBG_FATAL_FAILURE,
178-
"Check the ownership and permissions of krb5_ccachedir: [%s].\n",
179-
ccdirname);
180-
goto done;
181-
}
182-
183-
DLIST_FOR_EACH(li, missing_parents) {
184-
DEBUG(SSSDBG_TRACE_INTERNAL,
185-
"Creating directory [%s].\n", li->s);
186-
new_dir_mode = 0700;
187-
188-
old_umask = umask(0000);
189-
ret = mkdir(li->s, new_dir_mode);
190-
umask(old_umask);
191-
if (ret != EOK) {
192-
ret = errno;
193-
DEBUG(SSSDBG_MINOR_FAILURE,
194-
"mkdir [%s] failed: [%d][%s].\n", li->s, ret,
195-
strerror(ret));
196-
goto done;
197-
}
198-
ret = chown(li->s, uid, gid);
199-
if (ret != EOK) {
200-
ret = errno;
201-
DEBUG(SSSDBG_MINOR_FAILURE,
202-
"chown failed [%d][%s].\n", ret, strerror(ret));
203-
goto done;
204-
}
205-
}
206-
207-
ret = EOK;
208-
209-
done:
210-
talloc_free(tmp_ctx);
211-
return ret;
212-
}
213-
214-
errno_t sss_krb5_precreate_ccache(const char *ccname, uid_t uid, gid_t gid)
215-
{
216-
TALLOC_CTX *tmp_ctx = NULL;
217-
const char *filename;
218-
char *ccdirname;
219-
char *end;
220-
errno_t ret;
221-
222-
if (ccname[0] == '/') {
223-
filename = ccname;
224-
} else if (strncmp(ccname, "FILE:", 5) == 0) {
225-
filename = ccname + 5;
226-
} else if (strncmp(ccname, "DIR:", 4) == 0) {
227-
filename = ccname + 4;
228-
} else {
229-
/* only FILE and DIR types need precreation so far, we ignore any
230-
* other type */
231-
return EOK;
232-
}
233-
234-
tmp_ctx = talloc_new(NULL);
235-
if (!tmp_ctx) return ENOMEM;
236-
237-
ccdirname = talloc_strdup(tmp_ctx, filename);
238-
if (ccdirname == NULL) {
239-
DEBUG(SSSDBG_CRIT_FAILURE, "talloc_strdup failed.\n");
240-
ret = ENOMEM;
241-
goto done;
242-
}
243-
244-
/* We'll remove all trailing slashes from the back so that
245-
* we only pass /some/path to find_ccdir_parent_data, not
246-
* /some/path/ */
247-
do {
248-
end = strrchr(ccdirname, '/');
249-
if (end == NULL || end == ccdirname) {
250-
DEBUG(SSSDBG_CRIT_FAILURE, "Cannot find parent directory of [%s], "
251-
"/ is not allowed.\n", ccdirname);
252-
ret = EINVAL;
253-
goto done;
254-
}
255-
*end = '\0';
256-
} while (*(end+1) == '\0');
257-
258-
ret = create_ccache_dir(ccdirname, uid, gid);
259-
done:
260-
talloc_free(tmp_ctx);
261-
return ret;
262-
}
263115

264116
struct sss_krb5_ccache {
265117
struct sss_creds *creds;

src/providers/krb5/krb5_ccache.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@ struct tgt_times {
3535
time_t renew_till;
3636
};
3737

38-
errno_t sss_krb5_precreate_ccache(const char *ccname, uid_t uid, gid_t gid);
39-
4038
errno_t sss_krb5_cc_destroy(const char *ccname, uid_t uid, gid_t gid);
4139

4240
errno_t sss_krb5_check_ccache_princ(krb5_context kctx,

src/providers/krb5/krb5_child.c

Lines changed: 30 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -3945,94 +3945,53 @@ static errno_t old_ccache_valid(struct krb5_req *kr, bool *_valid)
39453945
return EOK;
39463946
}
39473947

3948-
static int k5c_check_old_ccache(struct krb5_req *kr)
3948+
static void k5c_ccache_check(struct krb5_req *kr, uint32_t offline)
39493949
{
39503950
errno_t ret;
39513951

3952-
if (kr->old_ccname) {
3953-
ret = old_ccache_valid(kr, &kr->old_cc_valid);
3954-
if (ret != EOK) {
3955-
DEBUG(SSSDBG_OP_FAILURE, "old_ccache_valid failed.\n");
3956-
return ret;
3957-
}
3952+
kr->old_cc_valid = false;
3953+
kr->old_cc_active = false;
3954+
3955+
if (kr->pd->cmd == SSS_PAM_ACCT_MGMT) {
3956+
return;
3957+
}
3958+
3959+
if (kr->old_ccname == NULL) {
3960+
return;
3961+
}
39583962

3963+
ret = old_ccache_valid(kr, &kr->old_cc_valid);
3964+
if (ret != EOK) {
3965+
DEBUG(SSSDBG_OP_FAILURE, "old_ccache_valid() failed.\n");
3966+
} else {
39593967
ret = check_if_uid_is_active(kr->uid, &kr->old_cc_active);
39603968
if (ret != EOK) {
3961-
DEBUG(SSSDBG_OP_FAILURE, "check_if_uid_is_active failed.\n");
3962-
return ret;
3969+
DEBUG(SSSDBG_OP_FAILURE, "check_if_uid_is_active() failed.\n");
3970+
kr->old_cc_valid = false;
39633971
}
3964-
3965-
DEBUG(SSSDBG_TRACE_ALL,
3966-
"Ccache_file is [%s] and is %s active and TGT is %s valid.\n",
3967-
kr->old_ccname ? kr->old_ccname : "not set",
3968-
kr->old_cc_active ? "" : "not",
3969-
kr->old_cc_valid ? "" : "not");
39703972
}
39713973

3972-
return EOK;
3973-
}
3974-
3975-
static int k5c_precreate_ccache(struct krb5_req *kr, uint32_t offline)
3976-
{
3977-
errno_t ret;
3974+
DEBUG(SSSDBG_TRACE_ALL,
3975+
"Old ccache is [%s] and is %s active and TGT is %s valid.\n",
3976+
kr->old_ccname ? kr->old_ccname : "not set",
3977+
kr->old_cc_active ? "" : "not",
3978+
kr->old_cc_valid ? "" : "not");
39783979

3979-
/* The ccache file should be (re)created if one of the following conditions
3980+
/* Old ccache can't be used if one of the following conditions
39803981
* is true:
3981-
* - it doesn't exist (kr->old_ccname == NULL)
3982+
* - the backend is offline and the current cache file not used and
3983+
* it does not contain a valid TGT (1)
39823984
* - the backend is online and the current ccache file is not used, i.e
39833985
* the related user is currently not logged in and it is not a renewal
3984-
* request
3985-
* (offline && !kr->old_cc_active && kr->pd->cmd != SSS_CMD_RENEW)
3986-
* - the backend is offline and the current cache file not used and
3987-
* it does not contain a valid TGT
3988-
* (offline && !kr->old_cc_active && !kr->valid_tgt)
3986+
* request (2)
39893987
*/
3990-
if (kr->old_ccname == NULL ||
3991-
(offline && !kr->old_cc_active && !kr->old_cc_valid) ||
3992-
(!offline && !kr->old_cc_active && kr->pd->cmd != SSS_CMD_RENEW)) {
3993-
DEBUG(SSSDBG_TRACE_ALL, "Recreating ccache\n");
3994-
3995-
ret = sss_krb5_precreate_ccache(kr->ccname, kr->uid, kr->gid);
3996-
if (ret != EOK) {
3997-
DEBUG(SSSDBG_OP_FAILURE, "ccache check failed.\n");
3998-
return ret;
3999-
}
3988+
if ((offline && !kr->old_cc_active && !kr->old_cc_valid) || /* (1) */
3989+
(!offline && !kr->old_cc_active && kr->pd->cmd != SSS_CMD_RENEW)) /* (2) */ {
3990+
DEBUG(SSSDBG_TRACE_ALL, "Ignoring old ccache\n");
40003991
} else {
40013992
/* We can reuse the old ccache */
40023993
kr->ccname = kr->old_ccname;
40033994
}
4004-
4005-
return EOK;
4006-
}
4007-
4008-
static int k5c_ccache_check(struct krb5_req *kr, uint32_t offline)
4009-
{
4010-
errno_t ret;
4011-
4012-
if (kr->pd->cmd == SSS_PAM_ACCT_MGMT) {
4013-
return EOK;
4014-
}
4015-
4016-
ret = k5c_check_old_ccache(kr);
4017-
if (ret != 0) {
4018-
DEBUG(SSSDBG_CRIT_FAILURE, "Cannot check old ccache [%s]: [%d][%s]. " \
4019-
"Assuming old cache is invalid " \
4020-
"and not used.\n",
4021-
kr->old_ccname, ret, sss_strerror(ret));
4022-
}
4023-
4024-
/* Pre-creating the ccache must be done as root, otherwise we can't mkdir
4025-
* some of the DIR: cache components. One example is /run/user/$UID because
4026-
* logind doesn't create the directory until the session phase, whereas
4027-
* we need the directory during the auth phase already
4028-
*/
4029-
ret = k5c_precreate_ccache(kr, offline);
4030-
if (ret != 0) {
4031-
DEBUG(SSSDBG_OP_FAILURE, "Cannot precreate ccache\n");
4032-
return ret;
4033-
}
4034-
4035-
return EOK;
40363995
}
40373996

40383997
static int k5c_setup(struct krb5_req *kr, uint32_t offline)
@@ -4207,11 +4166,7 @@ static krb5_error_code privileged_krb5_setup(struct krb5_req *kr,
42074166
return ret;
42084167
}
42094168

4210-
ret = k5c_ccache_check(kr, offline);
4211-
if (ret != EOK) {
4212-
DEBUG(SSSDBG_CRIT_FAILURE, "k5c_ccache_check() failed.\n");
4213-
return ret;
4214-
}
4169+
k5c_ccache_check(kr, offline);
42154170

42164171
if (!(offline ||
42174172
(kr->fast_val == K5C_FAST_NEVER && kr->validate == false))) {

0 commit comments

Comments
 (0)