LOR with pf + synproxy state

Volker volker at vwsoft.com
Mon Aug 18 22:39:02 UTC 2008


Hi!

Last week I discovered an LOR on 7-STABLE (last build: 2008-Aug-17,
RELENG_7).

I can easily recreate the problem when running a synproxy state rule for
incoming tcp connections and ssh'ing to my box.

W/o using synproxy state (keep'ing state instead), no LOR takes place.


 lock order reversal:
 1st 0xc575c92c pf task mtx (pf task mtx) @
/usr/src/sys/modules/pf/../../contrib/pf/net/pf.c:6774
 2nd 0xc521777c radix node head (radix node head) @
/usr/src/sys/net/route.c:278
 KDB: stack backtrace:
 db_trace_self_wrapper(c0a2fa65,e557b890,c075f315,c0a30e10,c521777c,...)
at db_trace_self_wrapper+0x26
 kdb_backtrace(c0a30e10,c521777c,c0a31129,c0a31129,c0a374a0,...) at
kdb_backtrace+0x29
 witness_checkorder(c521777c,9,c0a374a0,116,c507d000,...) at
witness_checkorder+0x5e5
 _mtx_lock_flags(c521777c,0,c0a374a0,116,c5fe9a00,...) at
_mtx_lock_flags+0x34
 rtalloc1_fib(e557b998,1,100,0,e557b994,...) at rtalloc1_fib+0x76
 rtalloc_ign_fib(e557b994,100,0,e557b9b4,c5734a38,...) at
rtalloc_ign_fib+0xad
 in_rtalloc_ign(e557b994,100,0,692a1600,5b47f56,...) at in_rtalloc_ign+0x1f
 pf_calc_mss(c62a881c,2,5b4,2,e557bb4c,...) at pf_calc_mss+0x88
 pf_test_tcp(e557bb68,e557bb64,1,c56e9400,c5fe9a00,...) at pf_test_tcp+0xdf6
 pf_test(1,c507d000,e557bbc4,0,0,...) at pf_test+0x1028
 pf_check_in(0,e557bbc4,c507d000,1,0,...) at pf_check_in+0x39
 pfil_run_hooks(c0b79ec0,e557bc18,c507d000,1,0,...) at pfil_run_hooks+0x78
 ip_input(c5fe9a00,14e,800,c507d000,800,...) at ip_input+0x265
 netisr_dispatch(2,c5fe9a00,10,3,0,...) at netisr_dispatch+0x55
 ether_demux(c507d000,c5fe9a00,3,0,3,...) at ether_demux+0x1c1
 ether_input(c507d000,c5fe9a00,c0a0391b,c57,c507d000,...) at
ether_input+0x323
 bge_intr(c5084000,0,c0a2b122,4b6,c4ef84e8,...) at bge_intr+0x77a
 ithread_loop(c50814f0,e557bd38,c0a2af4a,305,c508cad0,...) at
ithread_loop+0x155
 fork_exit(c07102d0,c50814f0,e557bd38) at fork_exit+0x94
 fork_trampoline() at fork_trampoline+0x8
 --- trap 0, eip = 0, esp = 0xe557bd70, ebp = 0 ---
 KDB: enter: witness_checkorder
 exclusive sleep mutex pf task mtx r = 0 (0xc575c92c) locked @
/usr/src/sys/modules/pf/../../contrib/pf/net/pf.c:6774
 shared rw PFil hook read/write mutex r = 0 (0xc0b79ed8) locked @
/usr/src/sys/net/pfil.c:73
 exclusive sx so_rcv_sx r = 0 (0xc5db208c) locked @
/usr/src/sys/kern/uipc_sockbuf.c:148
 exclusive sx so_rcv_sx r = 0 (0xc551f22c) locked @
/usr/src/sys/kern/uipc_sockbuf.c:148
 exclusive sleep mutex pf task mtx r = 0 (0xc575c92c) locked @
/usr/src/sys/modules/pf/../../contrib/pf/net/pf.c:6774
 shared rw PFil hook read/write mutex r = 0 (0xc0b79ed8) locked @
/usr/src/sys/net/pfil.c:73


pf rules used:
## Macros
TCPSYN="S/SA"

if_lan = "bge0"
if_wlan = "ndis0"
if_ipsec = "enc"

###########################
tcp_in = "{ ssh http mdns 9102 49101 5900 }"
udp_in = "{ mdns snmp 5029 }"

passicmp = "{ 3 4 6 9 10 11 12 17 18 }"

samba_tcp = "{ 139 445 }"
samba_udp = "{ 137 1434 }"

######################################################
table <rfcnoroute> { 127/8 10/8 172.16/12 192.168/16 }
table <multicast> { 224/8 239/8 }


######################################################
## GLOBAL OPTIONS
set block-policy drop
set fingerprints "/etc/pf.os"
set state-policy if-bound
set skip on lo0
set optimization conservative

###########################
## TRAFFIC NORMALIZATION
scrub all random-id fragment reassemble reassemble tcp

###########################
## TRANSLATION RULES (NAT)
nat on $if_lan -> ($if_lan)
nat on $if_wlan -> ($if_wlan)

######################################################
## FILTER RULES

block quick on lo0 proto {tcp udp} from any to any port biff
pass quick on lo0 all
antispoof log quick for { $if_lan $if_wlan }

block drop log all
block return in quick proto { tcp udp } from any to any port auth

###########################
# IPSEC VPN
###########################
pass log quick on {$if_lan $if_wlan} proto udp from any \
	to any port isakmp keep state
pass log quick on {$if_lan $if_wlan} proto udp from any \
	to any port isakmp keep state
pass quick log on {$if_lan $if_wlan} proto { ah, esp } from any \
	to any keep state
pass quick log on {$if_lan $if_wlan} proto { ah, esp } from any \
	to any keep state
pass quick log on $if_ipsec from any to any keep state


###########################
# ICMP
###########################
pass quick log on {$if_lan $if_wlan} proto icmp from any to any \
	tag PASSOK keep state
pass quick log inet proto icmp all icmp-type $passicmp keep state  \
	(max 2, max-src-states 1, max-src-nodes 1, source-track rule )
pass in quick log on {$if_lan $if_wlan} proto icmp from any to any \
	keep state probability 50%

###########################
# out traffic
###########################
pass out log quick on {$if_lan $if_wlan} all flags $TCPSYN keep state

###########################
# in traffic
###########################
# allow broadcasts + samba - don't log
pass quick on $if_lan from any to ($if_lan:broadcast)
pass quick on $if_wlan from any to ($if_wlan:broadcast)
pass quick on {$if_lan $if_wlan} from any to 255.255.255.255

pass in log on {$if_lan $if_wlan} proto tcp \
	from any to any port $tcp_in \
	flags $TCPSYN synproxy state
# change to 'keep state' here to avoid LOR
pass in log on {$if_lan $if_wlan} proto tcp from any port $tcp_in \
	to any flags $TCPSYN synproxy state
# change to 'keep state' here to avoid LOR
pass in log on {$if_lan $if_wlan} proto udp from any \
	to any port $udp_in keep state
pass in log on {$if_lan $if_wlan} proto udp from any port $udp_in \
	to any keep state

pass quick on {$if_lan $if_wlan} from any to <multicast>
# EOF

That LOR may be the same as reported here before (2007-12) - haven't
checked the old sources (will verify if it's worth the time to confirm):
http://unix.derkeiler.com/Mailing-Lists/FreeBSD/net/2007-12/msg00150.html

`uname -a`:
FreeBSD cesar.sz.vwsoft.com 7.0-STABLE FreeBSD 7.0-STABLE #38: Sun Aug
17 15:12:10 CEST 2008
root at cesar.sz.vwsoft.com:/usr/obj/usr/src/sys/CESAR  i386

Volker


More information about the freebsd-pf mailing list