Skip to content
  • Daniel Borkmann's avatar
    netfilter: nf_nat: fix access to uninitialized buffer in IRC NAT helper · 2690d97a
    Daniel Borkmann authored
    Commit 5901b6be attempted to introduce IPv6 support into
    IRC NAT helper. By doing so, the following code seemed to be removed
    by accident:
    
      ip = ntohl(exp->master->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip);
      sprintf(buffer, "%u %u", ip, port);
      pr_debug("nf_nat_irc: inserting '%s' == %pI4, port %u\n", buffer, &ip, port);
    
    This leads to the fact that buffer[] was left uninitialized and
    contained some stack value. When we call nf_nat_mangle_tcp_packet(),
    we call strlen(buffer) on excatly this uninitialized buffer. If we
    are unlucky and the skb has enough tailroom, we overwrite resp. leak
    contents with values that sit on our stack into the packet and send
    that out to the receiver.
    
    Since the rather informal DCC spec [1] does not seem to specify
    IPv6 support right now, we log such occurences so that admins can
    act accordingly, and drop the packet. I've looked into XChat source,
    and IPv6 is not supported there: addresses are in u32 and print
    via %u format string.
    
    Therefore, restore old behaviour as in IPv4, use snprintf(). The
    IRC helper does not support IPv6 by now. By this, we can safely use
    strlen(buffer) in nf_nat_mangle_tcp_packet() and prevent a buffer
    overflow. Also simplify some code as we now have ct variable anyway.
    
      [1] http://www.irchelp.org/irchelp/rfc/ctcpspec.html
    
    Fixes: 5901b6be
    
     ("netfilter: nf_nat: support IPv6 in IRC NAT helper")
    Signed-off-by: default avatarDaniel Borkmann <dborkman@redhat.com>
    Cc: Harald Welte <laforge@gnumonks.org>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    2690d97a