Re: [PATCH 1/2] sctp: fix to check the source address of COOKIE-ECHO chunk

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Wei Yongjun wrote:
>> Hi Wei
>>
>> Wei Yongjun wrote:
>>   
>>> SCTP does not check whether the source address of COOKIE-ECHO
>>> chunk is part of the any address parameters saved in COOKIE in
>>> CLOSED state. So even if the COOKIE-ECHO chunk other address
>>> with correct COOKIE, the COOKIE-ECHO chunk still be accepted.
>>> If the source does not match any address parameters saved in
>>> COOKIE, the COOKIE ECHO chunk should be silently discarded.
>>>
>>>     
>> I don't think this is correct.  An implementation is not required to specify
>> the source address in the address parameters list.  The way most
>> of rfc4960 is written, the combination of source and address parameters
>> is used to construct the transports.  There is no requirement that
>> the source should also be listed.
>>   
> 
> Oh, my real mean is that the source should either be the source address
> of the
> INIT chunk or any addtess be list in the address parameters list. If It
> is not any
> of them, the asoc is started with new address? This is not a big
> problem, but
> endpoint can now accept COOKIE-ECHO with *any source address* plus correct
> COOKIE in CLOSE state.

I believe that's expected.  We prevent adding new addresses on restart, but
if you start from closed, this would work.

This would be a very hard attack to pull off since the attacker would either
have to  be on-path, or have extremely detailed information about association.

I just checked BSD sources and they appear to handle this case the same way.

However, having said that, I originally missed one of the conditions that I thought
would cause the failure.  So, it looks like this would actually be a good check to add, but
I am wondering if we can do this in process_init.  That way we don't have
to walk the parameter list yet another time.

-vlad

> 
>> With this patch, we will start rejecting associations with such implementations.
>>
>> -vlad
>>
>>   
>>> Signed-off-by: Wei Yongjun <yjwei@xxxxxxxxxxxxxx>
>>> ---
>>>  include/net/sctp/constants.h |    1 +
>>>  net/sctp/sm_make_chunk.c     |   28 ++++++++++++++++++++++++++++
>>>  2 files changed, 29 insertions(+), 0 deletions(-)
>>>
>>> diff --git a/include/net/sctp/constants.h b/include/net/sctp/constants.h
>>> index 6390884..288f2b7 100644
>>> --- a/include/net/sctp/constants.h
>>> +++ b/include/net/sctp/constants.h
>>> @@ -183,6 +183,7 @@ typedef enum {
>>>  	SCTP_IERROR_NO_DATA,
>>>  	SCTP_IERROR_BAD_STREAM,
>>>  	SCTP_IERROR_BAD_PORTS,
>>> +	SCTP_IERROR_BAD_ADDR,
>>>  	SCTP_IERROR_AUTH_BAD_HMAC,
>>>  	SCTP_IERROR_AUTH_BAD_KEYID,
>>>  	SCTP_IERROR_PROTO_VIOLATION,
>>> diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
>>> index 17cb400..bc7ac37 100644
>>> --- a/net/sctp/sm_make_chunk.c
>>> +++ b/net/sctp/sm_make_chunk.c
>>> @@ -1591,6 +1591,7 @@ struct sctp_association *sctp_unpack_cookie(
>>>  	struct sk_buff *skb = chunk->skb;
>>>  	struct timeval tv;
>>>  	struct hash_desc desc;
>>> +	union sctp_params param;
>>>  
>>>  	/* Header size is static data prior to the actual cookie, including
>>>  	 * any padding.
>>> @@ -1670,6 +1671,33 @@ no_hmac:
>>>  		goto fail;
>>>  	}
>>>  
>>> +	/* Check whether the source address of COOKIE ECHO chunk is part
>>> +	 * of the any address parameters. If the value does not match, the
>>> +	 * COOKIE ECHO chunk MUST be silently discarded.
>>> +	 */
>>> +	if (asoc || sctp_cmp_addr_exact(sctp_source(chunk),
>>> +					&bear_cookie->peer_addr))
>>> +		goto addr_match;
>>> +
>>> +	sctp_walk_params(param, &bear_cookie->peer_init[0], init_hdr.params) {
>>> +		if (param.p->type == SCTP_PARAM_IPV4_ADDRESS ||
>>> +		    param.p->type == SCTP_PARAM_IPV6_ADDRESS) {
>>> +			struct sctp_af *af;
>>> +			union sctp_addr addr;
>>> +
>>> +			af = sctp_get_af_specific(param_type2af(param.p->type));
>>> +			af->from_addr_param(&addr, param.addr,
>>> +					    chunk->sctp_hdr->source, 0);
>>> +
>>> +			if (sctp_cmp_addr_exact(sctp_source(chunk), &addr))
>>> +				goto addr_match;
>>> +		}
>>> +	}
>>> +
>>> +	*error = -SCTP_IERROR_BAD_ADDR;
>>> +	goto fail;
>>> +
>>> +addr_match:
>>>  	/* Check to see if the cookie is stale.  If there is already
>>>  	 * an association, there is no need to check cookie's expiration
>>>  	 * for init collision case of lost COOKIE ACK.
>>>     
>>   
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-sctp" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Networking Development]     [Linux OMAP]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux