Commit 7a847c00 authored by Pablo Neira Ayuso's avatar Pablo Neira Ayuso

netfilter: nf_log: incorrect offset to network header

NFPROTO_ARP is expecting to find the ARP header at the network offset.

In the particular case of ARP, HTYPE= field shows the initial bytes of
the ethernet header destination MAC address.

 netdev out: IN= OUT=bridge0 MACSRC=c2:76:e5:71:e1:de MACDST=36:b0:4a:e2:72:ea MACPROTO=0806 ARP HTYPE=14000 PTYPE=0x4ae2 OPCODE=49782

NFPROTO_NETDEV egress hook is also expecting to find the IP headers at
the network offset.

Fixes: 35b93951 ("netfilter: add generic ARP packet logger")
Reported-by: default avatarTom Yan <tom.ty89@gmail.com>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 0ed8f619
...@@ -67,7 +67,7 @@ dump_arp_packet(struct nf_log_buf *m, ...@@ -67,7 +67,7 @@ dump_arp_packet(struct nf_log_buf *m,
unsigned int logflags; unsigned int logflags;
struct arphdr _arph; struct arphdr _arph;
ah = skb_header_pointer(skb, 0, sizeof(_arph), &_arph); ah = skb_header_pointer(skb, nhoff, sizeof(_arph), &_arph);
if (!ah) { if (!ah) {
nf_log_buf_add(m, "TRUNCATED"); nf_log_buf_add(m, "TRUNCATED");
return; return;
...@@ -96,7 +96,7 @@ dump_arp_packet(struct nf_log_buf *m, ...@@ -96,7 +96,7 @@ dump_arp_packet(struct nf_log_buf *m,
ah->ar_pln != sizeof(__be32)) ah->ar_pln != sizeof(__be32))
return; return;
ap = skb_header_pointer(skb, sizeof(_arph), sizeof(_arpp), &_arpp); ap = skb_header_pointer(skb, nhoff + sizeof(_arph), sizeof(_arpp), &_arpp);
if (!ap) { if (!ap) {
nf_log_buf_add(m, " INCOMPLETE [%zu bytes]", nf_log_buf_add(m, " INCOMPLETE [%zu bytes]",
skb->len - sizeof(_arph)); skb->len - sizeof(_arph));
...@@ -149,7 +149,7 @@ static void nf_log_arp_packet(struct net *net, u_int8_t pf, ...@@ -149,7 +149,7 @@ static void nf_log_arp_packet(struct net *net, u_int8_t pf,
nf_log_dump_packet_common(m, pf, hooknum, skb, in, out, loginfo, nf_log_dump_packet_common(m, pf, hooknum, skb, in, out, loginfo,
prefix); prefix);
dump_arp_packet(m, loginfo, skb, 0); dump_arp_packet(m, loginfo, skb, skb_network_offset(skb));
nf_log_buf_close(m); nf_log_buf_close(m);
} }
...@@ -850,7 +850,7 @@ static void nf_log_ip_packet(struct net *net, u_int8_t pf, ...@@ -850,7 +850,7 @@ static void nf_log_ip_packet(struct net *net, u_int8_t pf,
if (in) if (in)
dump_mac_header(m, loginfo, skb); dump_mac_header(m, loginfo, skb);
dump_ipv4_packet(net, m, loginfo, skb, 0); dump_ipv4_packet(net, m, loginfo, skb, skb_network_offset(skb));
nf_log_buf_close(m); nf_log_buf_close(m);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment