[Bug 1713] New: iptables-restore cmd crash

bugzilla-daemon at netfilter.org bugzilla-daemon at netfilter.org
Sun Oct 8 03:37:31 CEST 2023


https://bugzilla.netfilter.org/show_bug.cgi?id=1713

            Bug ID: 1713
           Summary: iptables-restore cmd crash
           Product: iptables
           Version: unspecified
          Hardware: All
                OS: All
            Status: NEW
          Severity: critical
          Priority: P5
         Component: iptables-restore
          Assignee: netfilter-buglog at lists.netfilter.org
          Reporter: xwlpt at 126.com

Recently I met an issue on the iptables-restore command, when I run the
command:

iptables-restore -T filter --noflush < replace

It shows the Segmentation fault error.

Then I did further check. Here are my findings.

The backtrace:

Reading symbols from /home/centos/bin/iptbales/sbin/iptables-restore...

[New LWP 3272596]

[Thread debugging using libthread_db enabled]

Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Core was generated by `/home/centos/bin/iptbales/sbin/iptables-restore -T
filter --noflush'.

Program terminated with signal SIGSEGV, Segmentation fault.

#0  __strcmp_evex () at ../sysdeps/x86_64/multiarch/strcmp-evex.S:139

139 ../sysdeps/x86_64/multiarch/strcmp-evex.S: No such file or directory.

(gdb) bt

#0  __strcmp_evex () at ../sysdeps/x86_64/multiarch/strcmp-evex.S:139

#1  0x00007f2c961c4810 in __iptcc_bsearch_chain_index
(name=name at entry=0x55b9b4177490 "SNTL_F_set_d2ebb6067e1f5247",
offset=offset at entry=0,

    idx=idx at entry=0x7ffc5ed6e654, handle=handle at entry=0x55b9b37ad2b0,
type=type at entry=BSEARCH_NAME) at /root/iptables-1.8.9/libiptc/libiptc.c:402

#2  0x00007f2c961c4c2c in iptcc_bsearch_chain_index (handle=0x55b9b37ad2b0,
idx=0x7ffc5ed6e654, name=0x55b9b4177490 "SNTL_F_set_d2ebb6067e1f5247")

    at /root/iptables-1.8.9/libiptc/libiptc.c:425

#3  iptcc_find_label (name=name at entry=0x55b9b4177490
"SNTL_F_set_d2ebb6067e1f5247", handle=handle at entry=0x55b9b37ad2b0)

    at /root/iptables-1.8.9/libiptc/libiptc.c:734

#4  0x00007f2c961c67d0 in iptc_rename_chain
(oldname=oldname at entry=0x55b9b4177460 "STMP_F_set_d2ebb6067e1f5247",

    newname=newname at entry=0x55b9b4177490 "SNTL_F_set_d2ebb6067e1f5247",
handle=0x55b9b37ad2b0) at /root/iptables-1.8.9/libiptc/libiptc.c:2373

#5  0x000055b9b2db67a5 in do_command4 (argc=<optimized out>,
argv=argv at entry=0x7ffc5ed6ea58, table=table at entry=0x7ffc5ed6ea68,

    handle=handle at entry=0x7ffc5ed6ea28, restore=restore at entry=true) at
iptables.c:861

#6  0x000055b9b2db3f30 in ip46tables_restore_main (cb=0x55b9b2dbca00
<ipt_restore_cb>, argc=argc at entry=4, argv=argv at entry=0x7ffc5ed71ff8,

    cb=0x55b9b2dbca00 <ipt_restore_cb>) at iptables-restore.c:338

#7  0x000055b9b2db4744 in iptables_restore_main (argc=4, argv=0x7ffc5ed71ff8)
at iptables-restore.c:388

#8  0x00007f2c95fbbd90 in __libc_start_call_main
(main=main at entry=0x55b9b2daddc0 <main>, argc=argc at entry=4,
argv=argv at entry=0x7ffc5ed71ff8)

    at ../sysdeps/nptl/libc_start_call_main.h:58

#9  0x00007f2c95fbbe40 in __libc_start_main_impl (main=0x55b9b2daddc0 <main>,
argc=4, argv=0x7ffc5ed71ff8, init=<optimized out>, fini=<optimized out>,

    rtld_fini=<optimized out>, stack_end=0x7ffc5ed71fe8) at
../csu/libc-start.c:392

#10 0x000055b9b2daddf5 in _start ()




This is the line that code crashed:

https://git.netfilter.org/iptables/tree/libiptc/libiptc.c#n402

Looks like the pos+1 out of the bound of array handle->chain_index


After I enabled the debug logs of iptables, then we can see the context:

https://git.netfilter.org/iptables/tree/libiptc/libiptc.c#n341


bsearch Find chain:SNTL_F_set_cf70fcb2da2c9d75 (pos:2 end:5) (offset:0)

bsearch Index[2] name:SNTL_F_set_847f79f7c669e9bb res:43 jump forward to pos:3
(end:5)

bsearch Index[3] name:SNTL_F_set_c8da4e747a025ea3 res:46


We can see that when pos=3, then pos+1 will out the boundary of array
handle->chain_index, but the array size supposed to be handle->chain_index_sz =
5.


So there should be code bugs in the iptables-restore command.


After check for more, I'd think it triggered by following code path:

TC_RENAME_CHAIN->iptcc_chain_index_delete_chain->iptcc_chain_index_rebuild

In this function, there are chain deleted
(https://git.netfilter.org/iptables/tree/libiptc/libiptc.c#n605), which makes
the num_chain to be decreased from 161 to 160 (In the test, we are restore for
161 chains), then it will generate the array handle->chain_index with  only 4
elements (160/40), but keep handle->chain_index_sz = 5.
https://git.netfilter.org/iptables/tree/libiptc/libiptc.c#n544

-- 
You are receiving this mail because:
You are watching all bug changes.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.netfilter.org/pipermail/netfilter-buglog/attachments/20231008/59b6894a/attachment.html>


More information about the netfilter-buglog mailing list