Re: [PATCH] SCTP: Validate initiate tag and chunk type if verification tag is 0 when handling ICMP message

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

 



On Fri, Jun 06, 2008 at 03:23:42PM +0800, Wei Yongjun wrote:
> This patch add to validate initiate tag and chunk type if verification tag 
> is 0 when handling ICMP message.
>
> RFC 4960, Appendix C. ICMP Handling
>
> ICMP6) An implementation MUST validate that the Verification Tag contained 
> in the ICMP message matches the Verification Tag of the peer.  If the 
> Verification Tag is not 0 and does NOT match, discard the ICMP message.  If 
> it is 0 and the ICMP message contains enough bytes to verify that the chunk 
> type is an INIT chunk and that the Initiate Tag matches the tag of the 
> peer, continue with ICMP7.  If the ICMP message is too short or the chunk 
> type or the Initiate Tag does not match, silently discard the packet.
>
> Signed-off-by: Wei Yongjun <yjwei@xxxxxxxxxxxxxx>
>
> --- a/net/sctp/input.c	2008-05-31 23:49:24.000000000 -0400
> +++ b/net/sctp/input.c	2008-06-01 04:23:27.000000000 -0400
> @@ -430,6 +430,9 @@ struct sock *sctp_err_lookup(int family,
> 	struct sock *sk = NULL;
> 	struct sctp_association *asoc;
> 	struct sctp_transport *transport = NULL;
> +	struct sctp_init_chunk *chunkhdr;
> +	__u32 vtag = ntohl(sctphdr->vtag);
> +	int len = skb->len - ((void *)sctphdr - (void *)skb->data);
>
> 	*app = NULL; *tpp = NULL;
>
> @@ -451,7 +454,29 @@ struct sock *sctp_err_lookup(int family,
>
> 	sk = asoc->base.sk;
>
> -	if (ntohl(sctphdr->vtag) != asoc->c.peer_vtag) {
> +	/* RFC 4960, Appendix C. ICMP Handling
> +	 *
> +	 * ICMP6) An implementation MUST validate that the Verification Tag
> +	 * contained in the ICMP message matches the Verification Tag of
> +	 * the peer.  If the Verification Tag is not 0 and does NOT
> +	 * match, discard the ICMP message.  If it is 0 and the ICMP
> +	 * message contains enough bytes to verify that the chunk type is
> +	 * an INIT chunk and that the Initiate Tag matches the tag of the
> +	 * peer, continue with ICMP7.  If the ICMP message is too short
> +	 * or the chunk type or the Initiate Tag does not match, silently
> +	 * discard the packet.
> +	 */
> +	if (vtag == 0) {
> +		chunkhdr = (struct sctp_init_chunk *)((void *)sctphdr
> +				+ sizeof(struct sctphdr));
> +		if (len < sizeof(struct sctphdr) + sizeof(sctp_chunkhdr_t)
> +			  + sizeof(__be32)
> +		    || chunkhdr->chunk_hdr.type != SCTP_CID_INIT
> +		    || ntohl(chunkhdr->init_hdr.init_tag) != asoc->c.my_vtag) {
> +			ICMP_INC_STATS_BH(ICMP_MIB_INERRORS);
> +			goto out;
> +		}
> +	} else if (vtag != asoc->c.peer_vtag) {
> 		ICMP_INC_STATS_BH(ICMP_MIB_INERRORS);
> 		goto out;
> 	}
>
>
>
> --
> 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

I see that the the above comments relate specifically to ICMP6, but
sctp_err_lookup is common between ipv4 and ipv6 sctp.  I assume the same
verification requirement is common to v4 and v6 as well (despite the comment).
I don't see how it can hurt to check in both cases, but I wanted to be certain.

Regards
Neil

-- 
/****************************************************
 * Neil Horman <nhorman@xxxxxxxxxxxxx>
 * Software Engineer, Red Hat
 ****************************************************/
--
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