bin/153252: [ipfw][patch] ipfw lockdown system in subsequent call of "/etc/rc.d/ipfw start"

Alexander Verbod AlexJ at freebsd.forum
Fri Dec 17 16:30:15 UTC 2010


>Number:         153252
>Category:       bin
>Synopsis:       [ipfw][patch] ipfw lockdown system in subsequent call of "/etc/rc.d/ipfw start"
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Dec 17 16:30:14 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Alexander Verbod
>Release:        8.1-RELEASE
>Organization:
>Environment:
FreeBSD test.private.local 8.1-RELEASE FreeBSD 8.1-RELEASE #0: Mon Jul 19 02:55:53 UTC 2010     root at almeida.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  i386
>Description:
1. Firewall lock-down system if script "/etc/rc.d/ipfw start" called twice.

2. "sysctl" utility inside "/etc/rc.d/ipfw" script used without full path
   prefix that cause error in case if PATH environment variable contain path
   to current directory "./" and script called from directory "/etc/rc.d"

3. /etc/rc.d/ipfw script always add "/etc/rc.d/natd" to "firewall_coscripts"
   variable regardless if "natd" was enabled in rc.conf or not.

>How-To-Repeat:
Add to "/etc/rc.conf" following strings:

#=====================
firewall_enable='YES'
firewall_type='OPEN'
firewall_logging='YES'
firewall_quiet='NO'

firewall_nat_enable='NO'
natd_enable='NO'
dummynet_enable='NO'
#=====================

then start firewall:
/etc/rc.d/ipfw start

second attempt to run 
/etc/rc.d/ipfw start

will lock-down system

>Fix:
Attached patch will fix all three issues

Patch attached with submission follows:

*** ipfw.orig	2010-07-31 18:52:54.000000000 -0400
--- ipfw	2010-12-17 10:02:54.000000000 -0500
***************
*** 39,45 ****
--- 39,56 ----
  
  	_firewall_type=$1
  
+ 	# check if firewall already running to prevent subsequent start calls
+ 	#
+ 	[ $( ${SYSCTL_N} net.inet.ip.fw.enable ) -ne 0 ] && {
+ 		warn 'Firewall is already running.';
+ 		_ipfw_running_status=1;
+ 		return 1;
+ 	} || {
+ 		_ipfw_running_status=0;
+ 	}
+ 
  	# set the firewall rules script if none was specified
+ 	#
  	[ -z "${firewall_script}" ] && firewall_script=/etc/rc.firewall
  
  	if [ -r "${firewall_script}" ]; then
***************
*** 55,61 ****
  	#
  	if checkyesno firewall_logging; then
  		echo 'Firewall logging enabled.'
! 		sysctl net.inet.ip.fw.verbose=1 >/dev/null
  	fi
  }
  
--- 66,72 ----
  	#
  	if checkyesno firewall_logging; then
  		echo 'Firewall logging enabled.'
! 		${SYSCTL_W} net.inet.ip.fw.verbose=1 >/dev/null
  	fi
  }
  
***************
*** 63,72 ****
  {
  	local	_coscript
  
  	# Start firewall coscripts
  	#
  	for _coscript in ${firewall_coscripts} ; do
! 		if [ -f "${_coscript}" ]; then
  			${_coscript} quietstart
  		fi
  	done
--- 74,89 ----
  {
  	local	_coscript
  
+ 	# stop proccessing if firewall is already running
+ 	#
+ 	[ ${_ipfw_running_status} -eq 1 ] && {
+ 		return 1;
+ 	}
+ 
  	# Start firewall coscripts
  	#
  	for _coscript in ${firewall_coscripts} ; do
! 		if [ -f "${_coscript}" -a -x "${_coscript}" ]; then
  			${_coscript} quietstart
  		fi
  	done
***************
*** 98,110 ****
  	# Stop firewall coscripts
  	#
  	for _coscript in `reverse_list ${firewall_coscripts}` ; do
! 		if [ -f "${_coscript}" ]; then
  			${_coscript} quietstop
  		fi
  	done
  }
  
  load_rc_config $name
! firewall_coscripts="/etc/rc.d/natd ${firewall_coscripts}"
  
  run_rc_command $*
--- 115,132 ----
  	# Stop firewall coscripts
  	#
  	for _coscript in `reverse_list ${firewall_coscripts}` ; do
! 		if [ -f "${_coscript}" -a -x "${_coscript}" ]; then
  			${_coscript} quietstop
  		fi
  	done
  }
  
  load_rc_config $name
! 
! if checkyesno firewall_nat_enable; then
! 	firewall_coscripts="/etc/rc.d/natd ${firewall_coscripts}"
! elif checkyesno natd_enable; then
! 	firewall_coscripts="/etc/rc.d/natd ${firewall_coscripts}"
! fi
  
  run_rc_command $*


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list