Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 30 Jan 1999 00:09:07 -0800 (PST)
From:      shipley@dis.org
To:        FreeBSD-gnats-submit@FreeBSD.ORG
Cc:        shipley@dis.org, cyber@dis.org
Subject:   kern/9791: enhancement for netinet/ip_icmp.c to control ping responses
Message-ID:  <199901300809.AAA01151@dipshit.dis.org>

next in thread | raw e-mail | index | archive | help

>Number:         9791
>Category:       kern
>Synopsis:       enhancement for netinet/ip_icmp.c to control ping responses
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sat Jan 30 00:20:00 PST 1999
>Closed-Date:
>Last-Modified:
>Originator:     Peter Shipley
>Release:        FreeBSD 3.0-RELEASE i386
>Organization:
KPMG
>Environment:

	Network based FreeBSD systems with security concerns

>Description:

	These are patches to FreeBSD 3.0-RELEASE to add an option
	(satable via sysctl) to disallow pings (ICMP_ECHO) to all
	systems or restrict just to hosts in the local network.

	This can be set by modifying net.inet.icmp.icmpechosecurity
	with sysctl;

	   0 = normal operation
	   1 = reply to localnet pings
	   2 = ignore everyone 

	That is, if net.inet.icmp.icmpechosecurity is set to 0 (default)
	the system will respond to pings in a normal manner

	If net.inet.icmp.icmpechosecurity=1 the system will respond to
	pings originating from the localnet (as defined by the systems
	ipaddress and netmask).

	If net.inet.icmp.icmpechosecurity=2 the system will ignore all pings

	The reason for this is to enhance security on the system
	
	(I have written a user level program (pingd) that I will
	release to the ports collection in a week or so that will
	handle pings for local system as well a "proxy" them for
	system behind a firewall.  This enhancement will be required
	for this system to function optimally)


>How-To-Repeat:

	

>Fix:
	


*** netinet/ip_icmp.c.orig	Fri Jan 29 03:29:29 1999
--- netinet/ip_icmp.c	Fri Jan 29 19:20:20 1999
***************
*** 73,78 ****
--- 73,96 ----
  SYSCTL_INT(_net_inet_icmp, OID_AUTO, bmcastecho, CTLFLAG_RW, &icmpbmcastecho,
  	   0, "");
  
+ /*
+  *	0 = normally operation
+  *	1 = reply to localnet pings
+  *	2 = ignore everyone 
+  *	
+  *	negative values are considered 0
+  *	values greater then 2 are evaluated as 2
+  *
+  *	In theory this may be better done as a bitmask then merged
+  *	with icmpbmcastecho but I did not want to break things
+  *	<shipley@dis.org>
+  */
+ 
+ static int	icmpechosecurity = 0;
+ SYSCTL_INT(_net_inet_icmp, OID_AUTO, icmpechosecurity, CTLFLAG_RW,
+ &icmpechosecurity, 0, "");
+ 
+ 
  #ifdef ICMPPRINTFS
  int	icmpprintfs = 0;
  #endif
***************
*** 379,384 ****
--- 397,423 ----
  			icmpstat.icps_bmcastecho++;
  			break;
  		}
+ 
+ 		if ( icmpechosecurity >= 2 ) {
+ 			/* reject all */
+ 			break;
+ 		} else if ( icmpechosecurity == 1 ) {
+ 
+ 		    /* get netmask */
+ 		    ia = (struct in_ifaddr *)ifaof_ifpforaddr(
+ 			(struct sockaddr *)&icmpdst, m->m_pkthdr.rcvif);
+ 		    if (ia == 0 || ia->ia_ifp == 0) {
+ 			break;
+ 		    }
+ 
+ 		    /* test if there src address is on our subnet */
+ 		    if ((ip->ip_src.s_addr & ia->ia_sockmask.sin_addr.s_addr) !=
+ 			(ip->ip_dst.s_addr & ia->ia_sockmask.sin_addr.s_addr)) {
+ 			    break;
+ 		    }
+ 		} /* fall through if reply is OK */
+ 
+ 		/* thus icmpechosecurity <= 0 */
  		icp->icmp_type = ICMP_ECHOREPLY;
  		goto reflect;
  
>Release-Note:
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199901300809.AAA01151>