Package: iptables
Version: 1.8.7-1
Severity: normal
Tags: patch

Dear Maintainers,

   * What led up to the situation?

As a packet filter for a webserver, nftables is used via xtables
compatibility wrappers iptables by legacy scripts. They utilize
"ip(6)tables" to populate rulesets, also defining sets and hashlimits. 

Since i am in the process of porting these scripts to the native
nftables scripting environment, i was analyzing the chains as
presented by "iptables (nf_tables variant)" and "nft".

   * What exactly did you do (or not do) that was effective (or
     ineffective)?
   * What was the outcome of this action?

Listing the INPUT chain with "iptables -L" succeeds:

...
root@host:~ # iptables -V
iptables v1.8.7 (nf_tables)
root@host:~ # iptables -nvL INPUT
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target   prot  opt in  out  source  destination         
    0     0 DROP     all       *   *    ::/0    ::/0         rt type:0
88384 7886K ACCEPT   all       lo  *    ::/0    ::/0                
14257  856K DROP     all       *   *    ::/0    ::/0         state INVALID
 4952  339K SET      all       *   *    ::/0    ::/0         state NEW ! 
match-set ipv6_scanned_ports src,dst limit: above 1/hour burst 5 mode srcip 
htable-expire 10000 add-set ipv6_port_scanners src exist
...

Listing the chain INPUT with "nft list ruleset" fails with SIGFPE.

...
root@host:~ # nft --version
nftables v0.9.8 (E.D.S.)
root@host:~# nft list chain ip6 filter INPUT
table ip6 filter {
        chain INPUT {
                type filter hook input priority filter; policy drop;
                rt type 0 counter packets 0 bytes 0 drop
                iifname "lo" counter packets 88376 bytes 7885680 accept
                ct state invalid counter packets 14257 bytes 856062 drop
                ct state new # ! match-set ipv6_scanned_ports src,dst Floating 
point exception (core dumped)
...


Recompiling the "iptables" package with debug symbols reveals:

  Program received signal SIGFPE, Arithmetic exception.
  0x00007ffff7b47ce9 in print_packets_rate_xlate () from 
/usr/lib/x86_64-linux-gnu/xtables/libxt_hashlimit.so

I suspect divisions and modulo in extensions/libxt_hashlimit.c,
print_packets_rate_xlate(), lines 1224f:

   xt_xlate_add(xl, " %" PRIu64 "/%s ",
            _rates[i-1].mult / avg, _rates[i-1].name);

I do not understand why "avg" is zero if the ruleset is listed by "nft"
and nonzero if listed by "iptables".

If i normalize the value of avg to 1, as shown in the following patch,
then the SIGFPE goes away, but the comment behind "ct state new" does not
correctly reflect the iptables ruleset:

--- iptables-1.8.7.orig/extensions/libxt_hashlimit.c
+++ iptables-1.8.7/extensions/libxt_hashlimit.c
@@ -1218,11 +1218,11 @@ static void print_packets_rate_xlate(str

    for (i = 1; i < ARRAY_SIZE(rates); ++i)
        if (avg > _rates[i].mult ||
-           _rates[i].mult / avg < _rates[i].mult % avg)
+           _rates[i].mult / (avg ? avg : 1) < _rates[i].mult % (avg ? avg : 1))
            break;

    xt_xlate_add(xl, " %" PRIu64 "/%s ",
-            _rates[i-1].mult / avg, _rates[i-1].name);
+            _rates[i-1].mult / (avg ? avg : 1), _rates[i-1].name);
 }

...
root@host:~# nft list chain ip6 filter INPUT
table ip6 filter {
        chain INPUT {
                type filter hook input priority filter; policy drop;
                rt type 0 counter packets 0 bytes 0 drop
                iifname "lo" counter packets 88440 bytes 7891400 accept
                ct state invalid counter packets 14262 bytes 856362 drop
                ct state new # ! match-set ipv6_scanned_ports src,dst meter 
portscan { timeout 0s limit rate 10000/second  burst 0 packets} counter packets 
4952 bytes 339382 # add-set ipv6_port_scanners src exist
...

   * What outcome did you expect instead?

I do not expect informational comments in "nft list ..." to reflect any
legacy/non-portable properties of an ip6tables ruleset, but i expect
"nft list ..." to list the effective nftables ruleset.

Kind regards,
Tilman

-- System Information:
Debian Release: 11.0
  APT prefers stable
  APT policy: (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 4.19.0-9-amd64 (SMP w/2 CPU threads)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages iptables depends on:
ii  libc6                    2.31-13
ii  libip4tc2                1.8.7-1
ii  libip6tc2                1.8.7-1
ii  libmnl0                  1.0.4-3
ii  libnetfilter-conntrack3  1.0.8-3
ii  libnfnetlink0            1.0.1-3+b1
ii  libnftnl11               1.1.9-1
ii  libxtables12             1.8.7-1
ii  netbase                  6.3

Versions of packages iptables recommends:
ii  nftables  0.9.8-3.1

Versions of packages iptables suggests:
pn  firewalld  <none>
ii  kmod       28-1

-- no debconf information

Reply via email to