diff options
author | Garrett Wollman <wollman@FreeBSD.org> | 1997-07-28 15:29:29 +0000 |
---|---|---|
committer | Garrett Wollman <wollman@FreeBSD.org> | 1997-07-28 15:29:29 +0000 |
commit | 35d02eb78de79a4b37cd6aa4a2e50ff8a709ec12 (patch) | |
tree | 23d1030ef64334d88649a3ddc7bff03c7b36d4c6 /net/radius/files/patch-ad | |
parent | netatalk - File and Print Server for AppleTalk (diff) |
I hope Torsten doesn't mind me stepping on his toes a bit here...
Fix one serious bug in the RADIUS server's Kerberos interface, one
minor nit in the build, and add one feature:
- Properly validate the Kerberos ticket we obtained against an actual
service so we know it wasn't forged.
- Make sure the test programs are built knowing where the database is.
- If the make variable KRB_INSTANCE is defined, it names the instance of
each user to be used in validating their Kerberos password. (If this
instance doesn't exist, the validation will fail.) This can be used
for both access control and to keep separate one's login password from
the less secure RADIUS mechanism (since exposure of the instance does
not expose the null instance).
Notes
Notes:
svn path=/head/; revision=7428
Diffstat (limited to 'net/radius/files/patch-ad')
-rw-r--r-- | net/radius/files/patch-ad | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/net/radius/files/patch-ad b/net/radius/files/patch-ad new file mode 100644 index 000000000000..535bd0f0aa90 --- /dev/null +++ b/net/radius/files/patch-ad @@ -0,0 +1,64 @@ +diff -ru orig/src/rad.kerberos.c ./src/rad.kerberos.c +--- orig/src/rad.kerberos.c Wed Sep 18 11:34:21 1996 ++++ src/rad.kerberos.c Sat Jul 26 17:33:30 1997 +@@ -177,7 +177,8 @@ + #if defined(M_KERB) + if (strcmp (authreq->direct_aatv->id, "MKERB") == 0) + { +- krbval = krb_get_in_tkt (userid, "", realm, "krbtgt", realm, ++ krbval = krb_get_in_tkt (userid, KRB_INSTANCE, realm, "krbtgt", ++ realm, + DEFAULT_TKT_LIFE, mit_passwd_to_key, + NULL, passwd); + } +@@ -192,6 +193,12 @@ + } + #endif /* A_KERB */ + ++ /* ++ * XXX ++ * This can be spoofed fairly easily... Should attempt to authenticate ++ * to some service on this machine (e.g., radius.thishost@REALM) ++ * in order to ensure that the ticket we just got is really valid. ++ */ + switch (krbval) + { + case INTK_OK: +@@ -207,6 +214,37 @@ + func, krbval); + break; + } ++#ifdef M_KERB ++ /* ++ * Ticket verification code based loosely on Berkeley klogin.c 8.3 ++ */ ++ if (krbreturn != EV_ACK) { ++ dest_tkt(); ++ memset(passwd, 0, sizeof passwd); ++ } else { ++ struct sockaddr_in sin; ++ char host[MAXHOSTNAMELEN], *p; ++ AUTH_DAT authdata; ++ KTEXT_ST ticket; ++ ++ krb_get_local_addr(&sin); ++ gethostname(host, sizeof host); ++ if ((p = strchr(host, '.')) != 0) ++ *p = '\0'; ++ krbval = krb_mk_req(&ticket, "radius", host, realm, 33); ++ if (krbval == KSUCCESS) { ++ krbval = krb_rd_req(&ticket, "radius", host, ++ sin.sin_addr.s_addr, &authdata, ++ ""); ++ } ++ if (krbval != KSUCCESS) { ++ logit(LOG_DAEMON, LOG_ERR, ++ "Kerberos error verifying ticket for %s: %s", ++ func, krb_err_txt[krbval]); ++ krbreturn = EV_NAK; ++ } ++ } ++#endif /* M_KERB */ + + dest_tkt (); /* destroy the ticket */ + memset (passwd, 0, sizeof (passwd)); |