Optionally compare client address to addresses in ticket.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@4970 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -376,10 +376,30 @@ check_flags(hdb_entry *client, const char *client_name,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static krb5_boolean
|
||||||
|
check_addresses(HostAddresses *addresses, struct sockaddr *from)
|
||||||
|
{
|
||||||
|
krb5_error_code ret;
|
||||||
|
krb5_address addr;
|
||||||
|
|
||||||
|
if(check_ticket_addresses == 0)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
if(addresses == NULL)
|
||||||
|
return allow_null_ticket_addresses;
|
||||||
|
|
||||||
|
ret = krb5_sockaddr2address (from, &addr);
|
||||||
|
if(ret)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return krb5_address_search(context, &addr, addresses);
|
||||||
|
}
|
||||||
|
|
||||||
krb5_error_code
|
krb5_error_code
|
||||||
as_rep(KDC_REQ *req,
|
as_rep(KDC_REQ *req,
|
||||||
krb5_data *reply,
|
krb5_data *reply,
|
||||||
const char *from)
|
const char *from,
|
||||||
|
struct sockaddr *from_addr)
|
||||||
{
|
{
|
||||||
KDC_REQ_BODY *b = &req->req_body;
|
KDC_REQ_BODY *b = &req->req_body;
|
||||||
AS_REP rep;
|
AS_REP rep;
|
||||||
@@ -647,6 +667,13 @@ as_rep(KDC_REQ *req,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check for valid set of addresses */
|
||||||
|
if(!check_addresses(b->addresses, from_addr)) {
|
||||||
|
ret = KRB5KRB_AP_ERR_BADADDR;
|
||||||
|
kdc_log(0, "Bad address list requested -- %s", client_name);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if(context->ktype_is_etype) {
|
if(context->ktype_is_etype) {
|
||||||
krb5_keytype kt;
|
krb5_keytype kt;
|
||||||
ret = krb5_etype_to_keytype(context, sess_ktype, &kt);
|
ret = krb5_etype_to_keytype(context, sess_ktype, &kt);
|
||||||
@@ -709,7 +736,7 @@ as_rep(KDC_REQ *req,
|
|||||||
ALLOC(et.caddr);
|
ALLOC(et.caddr);
|
||||||
copy_HostAddresses(b->addresses, et.caddr);
|
copy_HostAddresses(b->addresses, et.caddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
copy_EncryptionKey(&et.key, &ek.key);
|
copy_EncryptionKey(&et.key, &ek.key);
|
||||||
|
|
||||||
/* The MIT ASN.1 library (obviously) doesn't tell lengths encoded
|
/* The MIT ASN.1 library (obviously) doesn't tell lengths encoded
|
||||||
@@ -1239,7 +1266,8 @@ static krb5_error_code
|
|||||||
tgs_rep2(KDC_REQ_BODY *b,
|
tgs_rep2(KDC_REQ_BODY *b,
|
||||||
PA_DATA *tgs_req,
|
PA_DATA *tgs_req,
|
||||||
krb5_data *reply,
|
krb5_data *reply,
|
||||||
const char *from)
|
const char *from,
|
||||||
|
struct sockaddr *from_addr)
|
||||||
{
|
{
|
||||||
krb5_ap_req ap_req;
|
krb5_ap_req ap_req;
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
@@ -1488,6 +1516,13 @@ tgs_rep2(KDC_REQ_BODY *b,
|
|||||||
ret = KRB5KDC_ERR_SERVER_NOMATCH;
|
ret = KRB5KDC_ERR_SERVER_NOMATCH;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check for valid set of addresses */
|
||||||
|
if(!check_addresses(tgt->caddr, from_addr)) {
|
||||||
|
ret = KRB5KRB_AP_ERR_BADADDR;
|
||||||
|
kdc_log(0, "Request from wrong address");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
ret = tgs_make_reply(b,
|
ret = tgs_make_reply(b,
|
||||||
tgt,
|
tgt,
|
||||||
@@ -1547,7 +1582,8 @@ out2:
|
|||||||
krb5_error_code
|
krb5_error_code
|
||||||
tgs_rep(KDC_REQ *req,
|
tgs_rep(KDC_REQ *req,
|
||||||
krb5_data *data,
|
krb5_data *data,
|
||||||
const char *from)
|
const char *from,
|
||||||
|
struct sockaddr *from_addr)
|
||||||
{
|
{
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@@ -1567,7 +1603,7 @@ tgs_rep(KDC_REQ *req,
|
|||||||
kdc_log(0, "TGS-REQ from %s without PA-TGS-REQ", from);
|
kdc_log(0, "TGS-REQ from %s without PA-TGS-REQ", from);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
ret = tgs_rep2(&req->req_body, tgs_req, data, from);
|
ret = tgs_rep2(&req->req_body, tgs_req, data, from, from_addr);
|
||||||
out:
|
out:
|
||||||
if(ret && data->data == NULL){
|
if(ret && data->data == NULL){
|
||||||
krb5_mk_error(context,
|
krb5_mk_error(context,
|
||||||
|
Reference in New Issue
Block a user