patches for easier mirroring, to eliminate a special copy, to make www.freebsd.org/security a full copy of security.freebsd.org and be eventually be the same. For now files are just sitting there. The symlinks are missing. Discussed on: www (repository location) Discussed with: simon (so)
		
			
				
	
	
		
			219 lines
		
	
	
	
		
			7.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			219 lines
		
	
	
	
		
			7.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
-----BEGIN PGP SIGNED MESSAGE-----
 | 
						|
 | 
						|
=============================================================================
 | 
						|
FreeBSD-SA-98:01                                            Security Advisory
 | 
						|
                                                                FreeBSD, Inc.
 | 
						|
 | 
						|
Topic:          LAND attack can cause harm to running FreeBSD systems
 | 
						|
 | 
						|
Category:       core
 | 
						|
Module:         kern
 | 
						|
Announced:      1997-12-01
 | 
						|
Affects:        FreeBSD 2.1.*, FreeBSD 2.2.0R, 2.2.1R, 2.2.5R
 | 
						|
		FreeBSD-stable and FreeBSD-current 
 | 
						|
Doesn't Affect:	FreeBSD 2.2.2R
 | 
						|
Corrected:      FreeBSD 2.2.6R, FreeBSD-current as of Jan 21, 1998
 | 
						|
		FreeBSD-stable as of Jan 30, 1998
 | 
						|
FreeBSD only:   no
 | 
						|
 | 
						|
Patches:        ftp://ftp.freebsd.org/pub/CERT/patches/SA-98:01/
 | 
						|
 | 
						|
=============================================================================
 | 
						|
IMPORTANT MESSAGE: The FreeBSD advisory archive has moved from
 | 
						|
ftp://freebsd.org/pub/CERT to ftp://ftp.freebsd.org/pub/CERT
 | 
						|
=============================================================================
 | 
						|
 | 
						|
I.   Background
 | 
						|
 | 
						|
     In most TCP stacks state is kept based on the source and
 | 
						|
     destination address of a packet received.
 | 
						|
 | 
						|
II.  Problem Description
 | 
						|
 | 
						|
     A problem exists in most FreeBSD derived stacks that allows a
 | 
						|
     malicious user to send a packet that causes the sytsem to lock
 | 
						|
     up, thus producing a denial of service attack.
 | 
						|
 | 
						|
III. Impact
 | 
						|
 | 
						|
     Any person on the Internet who can send a FreeBSD machine a
 | 
						|
     packet can cause it to lock up and be taken out of service.
 | 
						|
     
 | 
						|
IV.  Workaround
 | 
						|
 | 
						|
     A firewall can be used to filter packets from the Internet that
 | 
						|
     appear to be from your local network.  This will not eliminate
 | 
						|
     the threat, but will eliminate external attacks.
 | 
						|
 | 
						|
V.   Solution
 | 
						|
 | 
						|
     Apply the enclosed patch.  There are two patches, one for FreeBSD
 | 
						|
     -current, and another for FreeBSD 2.2-stable.
 | 
						|
 | 
						|
    patch for -current prior to Jan 21, 1998.  Found in land-current.
 | 
						|
 | 
						|
    Index: tcp_input.c
 | 
						|
    ===================================================================
 | 
						|
    RCS file: /home/imp/FreeBSD/CVS/src/sys/netinet/tcp_input.c,v
 | 
						|
    retrieving revision 1.67
 | 
						|
    retrieving revision 1.68
 | 
						|
    diff -u -r1.67 -r1.68
 | 
						|
    --- tcp_input.c	1997/12/19 23:46:15	1.67
 | 
						|
    +++ tcp_input.c	1998/01/21 02:05:59	1.68
 | 
						|
    @@ -626,6 +613,7 @@
 | 
						|
     	 * If the state is LISTEN then ignore segment if it contains an RST.
 | 
						|
     	 * If the segment contains an ACK then it is bad and send a RST.
 | 
						|
     	 * If it does not contain a SYN then it is not interesting; drop it.
 | 
						|
    +	 * If it is from this socket, drop it, it must be forged.
 | 
						|
     	 * Don't bother responding if the destination was a broadcast.
 | 
						|
     	 * Otherwise initialize tp->rcv_nxt, and tp->irs, select an initial
 | 
						|
     	 * tp->iss, and send a segment:
 | 
						|
    @@ -644,6 +632,9 @@
 | 
						|
     			goto dropwithreset;
 | 
						|
     		if ((tiflags & TH_SYN) == 0)
 | 
						|
     			goto drop;
 | 
						|
    +		if ((ti->ti_dport == ti->ti_sport) &&
 | 
						|
    +		    (ti->ti_dst.s_addr == ti->ti_src.s_addr))
 | 
						|
    +			goto drop;
 | 
						|
     		/*
 | 
						|
     		 * RFC1122 4.2.3.10, p. 104: discard bcast/mcast SYN
 | 
						|
     		 * in_broadcast() should never return true on a received
 | 
						|
    @@ -762,6 +753,23 @@
 | 
						|
     		}
 | 
						|
     
 | 
						|
     	/*
 | 
						|
    +	 * If the state is SYN_RECEIVED:
 | 
						|
    +	 *	if seg contains SYN/ACK, send a RST.
 | 
						|
    +	 *	if seg contains an ACK, but not for our SYN/ACK, send a RST.
 | 
						|
    +	 */
 | 
						|
    +	case TCPS_SYN_RECEIVED:
 | 
						|
    +		if (tiflags & TH_ACK) {
 | 
						|
    +			if (tiflags & TH_SYN) {
 | 
						|
    +				tcpstat.tcps_badsyn++;
 | 
						|
    +				goto dropwithreset;
 | 
						|
    +			}
 | 
						|
    +			if (SEQ_LEQ(ti->ti_ack, tp->snd_una) ||
 | 
						|
    +			    SEQ_GT(ti->ti_ack, tp->snd_max))
 | 
						|
    +				goto dropwithreset;
 | 
						|
    +		}
 | 
						|
    +		break;
 | 
						|
    +
 | 
						|
    +	/*
 | 
						|
     	 * If the state is SYN_SENT:
 | 
						|
     	 *	if seg contains an ACK, but not for our SYN, drop the input.
 | 
						|
     	 *	if seg contains a RST, then drop the connection.
 | 
						|
    @@ -1176,14 +1184,11 @@
 | 
						|
     	switch (tp->t_state) {
 | 
						|
     
 | 
						|
     	/*
 | 
						|
    -	 * In SYN_RECEIVED state if the ack ACKs our SYN then enter
 | 
						|
    -	 * ESTABLISHED state and continue processing, otherwise
 | 
						|
    -	 * send an RST.
 | 
						|
    +	 * In SYN_RECEIVED state, the ack ACKs our SYN, so enter
 | 
						|
    +	 * ESTABLISHED state and continue processing.
 | 
						|
    +	 * The ACK was checked above.
 | 
						|
     	 */
 | 
						|
     	case TCPS_SYN_RECEIVED:
 | 
						|
    -		if (SEQ_GT(tp->snd_una, ti->ti_ack) ||
 | 
						|
    -		    SEQ_GT(ti->ti_ack, tp->snd_max))
 | 
						|
    -			goto dropwithreset;
 | 
						|
     
 | 
						|
     		tcpstat.tcps_connects++;
 | 
						|
     		soisconnected(so);
 | 
						|
 | 
						|
    patch for 2.2.5 and 2.2.5-stable before Jan 30, 1998 found in land-22
 | 
						|
 | 
						|
    Index: tcp_input.c
 | 
						|
    ===================================================================
 | 
						|
    RCS file: /home/imp/FreeBSD/CVS/src/sys/netinet/tcp_input.c,v
 | 
						|
    retrieving revision 1.54.2.6
 | 
						|
    retrieving revision 1.54.2.7
 | 
						|
    diff -u -r1.54.2.6 -r1.54.2.7
 | 
						|
    --- tcp_input.c	1997/11/20 21:45:34	1.54.2.6
 | 
						|
    +++ tcp_input.c	1998/01/30 19:13:55	1.54.2.7
 | 
						|
    @@ -627,6 +614,7 @@
 | 
						|
     	 * If the state is LISTEN then ignore segment if it contains an RST.
 | 
						|
     	 * If the segment contains an ACK then it is bad and send a RST.
 | 
						|
     	 * If it does not contain a SYN then it is not interesting; drop it.
 | 
						|
    +	 * If it is from this socket, drop it, it must be forged.
 | 
						|
     	 * Don't bother responding if the destination was a broadcast.
 | 
						|
     	 * Otherwise initialize tp->rcv_nxt, and tp->irs, select an initial
 | 
						|
     	 * tp->iss, and send a segment:
 | 
						|
    @@ -646,6 +634,9 @@
 | 
						|
     			goto dropwithreset;
 | 
						|
     		if ((tiflags & TH_SYN) == 0)
 | 
						|
     			goto drop;
 | 
						|
    +		if ((ti->ti_dport == ti->ti_sport) &&
 | 
						|
    +		    (ti->ti_dst.s_addr == ti->ti_src.s_addr))
 | 
						|
    +			goto drop;
 | 
						|
     		/*
 | 
						|
     		 * RFC1122 4.2.3.10, p. 104: discard bcast/mcast SYN
 | 
						|
     		 * in_broadcast() should never return true on a received
 | 
						|
    @@ -765,6 +756,23 @@
 | 
						|
     		}
 | 
						|
     
 | 
						|
     	/*
 | 
						|
    +	 * If the state is SYN_RECEIVED:
 | 
						|
    +	 *	if seg contains SYN/ACK, send a RST.
 | 
						|
    +	 *	if seg contains an ACK, but not for our SYN/ACK, send a RST.
 | 
						|
    +	 */
 | 
						|
    +	case TCPS_SYN_RECEIVED:
 | 
						|
    +		if (tiflags & TH_ACK) {
 | 
						|
    +			if (tiflags & TH_SYN) {
 | 
						|
    +				tcpstat.tcps_badsyn++;
 | 
						|
    +				goto dropwithreset;
 | 
						|
    +			}
 | 
						|
    +			if (SEQ_LEQ(ti->ti_ack, tp->snd_una) ||
 | 
						|
    +			    SEQ_GT(ti->ti_ack, tp->snd_max))
 | 
						|
    +				goto dropwithreset;
 | 
						|
    +		}
 | 
						|
    +		break;
 | 
						|
    +
 | 
						|
    +	/*
 | 
						|
     	 * If the state is SYN_SENT:
 | 
						|
     	 *	if seg contains an ACK, but not for our SYN, drop the input.
 | 
						|
     	 *	if seg contains a RST, then drop the connection.
 | 
						|
    @@ -1179,14 +1187,11 @@
 | 
						|
     	switch (tp->t_state) {
 | 
						|
     
 | 
						|
     	/*
 | 
						|
    -	 * In SYN_RECEIVED state if the ack ACKs our SYN then enter
 | 
						|
    -	 * ESTABLISHED state and continue processing, otherwise
 | 
						|
    -	 * send an RST.
 | 
						|
    +	 * In SYN_RECEIVED state, the ack ACKs our SYN, so enter
 | 
						|
    +	 * ESTABLISHED state and continue processing.
 | 
						|
    +	 * The ACK was checked above.
 | 
						|
     	 */
 | 
						|
     	case TCPS_SYN_RECEIVED:
 | 
						|
    -		if (SEQ_GT(tp->snd_una, ti->ti_ack) ||
 | 
						|
    -		    SEQ_GT(ti->ti_ack, tp->snd_max))
 | 
						|
    -			goto dropwithreset;
 | 
						|
     
 | 
						|
     		tcpstat.tcps_connects++;
 | 
						|
     		soisconnected(so);
 | 
						|
    
 | 
						|
 | 
						|
=============================================================================
 | 
						|
FreeBSD, Inc.
 | 
						|
 | 
						|
Web Site:                       http://www.freebsd.org/
 | 
						|
Confidential contacts:          security-officer@freebsd.org
 | 
						|
PGP Key:                        ftp://ftp.freebsd.org/pub/CERT/public_key.asc
 | 
						|
Security notifications:         security-notifications@freebsd.org
 | 
						|
Security public discussion:     security@freebsd.org
 | 
						|
 | 
						|
Notice: Any patches in this document may not apply cleanly due to
 | 
						|
        modifications caused by digital signature or mailer software.
 | 
						|
        Please reference the URL listed at the top of this document
 | 
						|
        for original copies of all patches if necessary.
 | 
						|
=============================================================================
 | 
						|
 | 
						|
-----BEGIN PGP SIGNATURE-----
 | 
						|
Version: 2.6.2
 | 
						|
 | 
						|
iQCVAwUBNQg21FUuHi5z0oilAQFsYAP/TSdBmRb90H9/JqCvM/7pn1FOngoJgLPV
 | 
						|
GzEBEKe1cbeY5tOY/rCLPVX3g+JjRjPFkMICaTYk0JdFEO29CLhw5qoX/OAm4M+M
 | 
						|
erMJvXUJ3SPaEAEgK7zh5c73t9I4573Rbp1IxU3uZiqVSc3myJxCtFa4ZW2O6zkm
 | 
						|
G57fsHlGRKo=
 | 
						|
=4fC3
 | 
						|
-----END PGP SIGNATURE-----
 |