Thanks for pointing this out, it was an oversight in the recent changes
to pf_test_rule().

I recommend specifying explicitly the correct protocols if you're
wanting to to match by user/group/os fingerprints.

        block return out log proto { tcp, udp } all user = 1002

If you'd like, you can apply the patch below which will force you to do
it this way, but it's not strictly necessary. (hopefully this will be in
a snapshot near you soon)


On Tue, Jul 12, 2011 at 11:46:47AM -0400, Jiri B wrote:
> Hello,
> 
> with latest snapshot (Jul 11 2011) I see this strange behavior
> which I haven't seen before upgrade (ping caught by strange pf
> rule).
> 
> $ id ;netstat -rnf inet | grep default
> uid=1000(jirib) gid=10(users) groups=10(users), 0(wheel), 5(operator)
> default            192.168.1.1        UGS        6     1320     -    12 iwn0
> 
> $ ping 192.168.1.1
> PING 192.168.1.1 (192.168.1.1): 56 data bytes
> ping: sendto: No route to host
> ping: wrote 192.168.1.1 64 chars, ret=-1
> --- 192.168.1.1 ping statistics ---
> 1 packets transmitted, 0 packets received, 100.0% packet loss
> 
> OK, why? It was caught by pf:
> 
> # tcpdump -i pflog0 -n -ttt -e icmp                                           
>            tcpdump: WARNING: snaplen raised from 116 to 160                   
>                       
> tcpdump: listening on pflog0, link-type PFLOG
> Jul 12 17:43:00.412525 rule 9/(match) block out on iwn0: 192.168.1.254 > 
> 192.168.1.1: icmp: echo request
> 
> Interesting... what is that rule?
> 
> # pfctl -R 9 -vv -sr                
> @9 block return out log all user = 1002
>   [ Evaluations: 275       Packets: 23        Bytes: 1912        States: 0    
>  ]
>   [ Inserted: uid 0 pid 30333 State Creations: 0     ]
> 
> So, why was ping caught by rule which should apply only to
> uid = 1002? FYI, the ping is caught for root as well?
> 
> Am i doing something wrong or I haven't seen some info for
> -current followers?
> 
> jirib
> 

-- 


Index: parse.y
===================================================================
RCS file: /cvs/src/sbin/pfctl/parse.y,v
retrieving revision 1.604
diff -u -p -r1.604 parse.y
--- parse.y     8 Jul 2011 18:52:47 -0000       1.604
+++ parse.y     13 Jul 2011 03:52:25 -0000
@@ -3941,9 +3941,23 @@ rule_consistent(struct pf_rule *r, int a
 {
        int     problems = 0;
 
+       if (r->proto != IPPROTO_TCP && r->os_fingerprint != PF_OSFP_ANY) {
+               yyerror("os only applies to tcp");
+               problems++;
+       }
        if (r->proto != IPPROTO_TCP && r->proto != IPPROTO_UDP &&
            (r->src.port_op || r->dst.port_op)) {
                yyerror("port only applies to tcp/udp");
+               problems++;
+       }
+       if (r->proto != IPPROTO_TCP && r->proto != IPPROTO_UDP &&
+           r->uid.op) {
+               yyerror("user only applies to tcp/udp");
+               problems++;
+       }
+       if (r->proto != IPPROTO_TCP && r->proto != IPPROTO_UDP &&
+           r->gid.op) {
+               yyerror("group only applies to tcp/udp");
                problems++;
        }
        if (r->proto != IPPROTO_ICMP && r->proto != IPPROTO_ICMPV6 &&

Reply via email to