Hello, On Mon, Aug 22, 2022 at 08:45:29PM +0200, Alexander Bluhm wrote: > Hi, > > Hrvoje managed to crash the kernel in pf fragment reassembly. > > > r620-1# pfctl -e > > pf enabled > > r620-1# pfctl -f /etc/pf.conf > > uvm_fault(0xffffffff824b9278, 0xb7, 0, 2) -> e > > kernel: page fault trap, code=0 > > Stopped at pf_free_fragment+0x77: movq %rax,0xb8(%rcx) > > TID PID UID PRFLAGS PFLAGS CPU COMMAND > > 350110 79921 0 0x100003 0 2K tcpbench > > *301306 98239 0 0x14000 0x200 4 softnet > > 55791 2358 0 0x14000 0x200 3 softnet > > 176238 13130 0 0x14000 0x200 1 softnet > > 66977 54316 0 0x14000 0x200 5 systq > > 165986 42679 0 0x14000 0x40000200 0 softclock > > pf_free_fragment(fffffd83a5022010) at pf_free_fragment+0x77 > > pf_create_fragment(ffff800022d717ce) at pf_create_fragment+0xc8 > > pf_reassemble6(ffff800022d71708,ffff800022d71648,30,0,1,ffff800022d717ce) at > > pf_reassemble6+0x51 > > pf_normalize_ip6(ffff800022d716c8,ffff800022d717ce) at pf_normalize_ip6+0x8a > > pf_test(18,1,ffff800000095048,ffff800022d71978) at pf_test+0x30d > > ip6_input_if(ffff800022d71978,ffff800022d71984,29,0,ffff800000095048) at > > ip6_input_if+0x1ae > > ipv6_input(ffff800000095048,fffffd80a3f1dc00) at ipv6_input+0x39 > > ether_input(ffff800000095048,fffffd80a3f1dc00) at ether_input+0x3b1 > > if_input_process(ffff800000095048,ffff800022d71a68) at if_input_process+0x6f > > ifiq_process(ffff800000099900) at ifiq_process+0x69 > > taskq_thread(ffff800000032200) at taskq_thread+0x11a > > end trace frame: 0x0, count: 4 > > https://urldefense.com/v3/__https://www.openbsd.org/ddb.html__;!!ACWV5N9M2RV99hQ!Lp6PoTOkfwK6l_zUKCzgqp4LJWQKYlUZuOU7xnK4oGjI-tUtS1PjKwdJGLAXwJ8_jO2zCf0RZnVm5js3tfsTgQDDz5JAmCqmOQ$ > > describes the minimum info required in > > bug reports. Insufficient info makes it difficult to find and fix bugs. > > ddb{4}> > > It crashes here in pf_free_fragment() > 266 TAILQ_REMOVE(&pf_fragqueue, frag, frag_next); > > Putting a pf frag lock into pf_create_fragment() around > pf_flush_fragments() does not look sufficient. The pf_nfrents++ > also needs protection. So I moved the lock around pf_reassemble(). > > ok? >
fix looks good to me. thanks for taking care of it. OK sashan