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);
 | 
				
			||||||
@@ -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;
 | 
				
			||||||
@@ -1489,6 +1517,13 @@ tgs_rep2(KDC_REQ_BODY *b,
 | 
				
			|||||||
	    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, 
 | 
				
			||||||
			     b->kdc_options.enc_tkt_in_skey ? &adtkt : NULL, 
 | 
								     b->kdc_options.enc_tkt_in_skey ? &adtkt : NULL, 
 | 
				
			||||||
@@ -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