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
	 Johan Danielsson
					Johan Danielsson