lkml.org 
[lkml]   [2022]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 067/167] netfilter: nf_log: incorrect offset to network header
    Date
    From: Pablo Neira Ayuso <pablo@netfilter.org>

    [ Upstream commit 7a847c00eeba9744353ecdfad253143b9115678a ]

    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: 35b9395104d5 ("netfilter: add generic ARP packet logger")
    Reported-by: Tom Yan <tom.ty89@gmail.com>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    net/netfilter/nf_log_syslog.c | 8 ++++----
    1 file changed, 4 insertions(+), 4 deletions(-)

    diff --git a/net/netfilter/nf_log_syslog.c b/net/netfilter/nf_log_syslog.c
    index 13234641cdb3..7000e069bc07 100644
    --- a/net/netfilter/nf_log_syslog.c
    +++ b/net/netfilter/nf_log_syslog.c
    @@ -61,7 +61,7 @@ dump_arp_packet(struct nf_log_buf *m,
    unsigned int logflags;
    struct arphdr _arph;

    - ah = skb_header_pointer(skb, 0, sizeof(_arph), &_arph);
    + ah = skb_header_pointer(skb, nhoff, sizeof(_arph), &_arph);
    if (!ah) {
    nf_log_buf_add(m, "TRUNCATED");
    return;
    @@ -90,7 +90,7 @@ dump_arp_packet(struct nf_log_buf *m,
    ah->ar_pln != sizeof(__be32))
    return;

    - ap = skb_header_pointer(skb, sizeof(_arph), sizeof(_arpp), &_arpp);
    + ap = skb_header_pointer(skb, nhoff + sizeof(_arph), sizeof(_arpp), &_arpp);
    if (!ap) {
    nf_log_buf_add(m, " INCOMPLETE [%zu bytes]",
    skb->len - sizeof(_arph));
    @@ -144,7 +144,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,
    prefix);
    - dump_arp_packet(m, loginfo, skb, 0);
    + dump_arp_packet(m, loginfo, skb, skb_network_offset(skb));

    nf_log_buf_close(m);
    }
    @@ -829,7 +829,7 @@ static void nf_log_ip_packet(struct net *net, u_int8_t pf,
    if (in)
    dump_ipv4_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);
    }
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-07-19 14:38    [W:2.611 / U:0.180 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site