scapy icon indicating copy to clipboard operation
scapy copied to clipboard

do not fail on linux < 4.12

Open christian-sahlmann opened this issue 1 year ago • 7 comments

I was getting this error after https://github.com/secdev/scapy/pull/4352 was merged:

  File "/usr/lib/python3.11/site-packages/scapy/layers/snmp.py", line 20, in <module>
    from scapy.layers.inet import UDP, IP, ICMP
  File "/usr/lib/python3.11/site-packages/scapy/layers/inet.py", line 20, in <module>
    from scapy.ansmachine import AnsweringMachine
  File "/usr/lib/python3.11/site-packages/scapy/ansmachine.py", line 20, in <module>
    from scapy.arch import get_if_addr
  File "/usr/lib/python3.11/site-packages/scapy/arch/__init__.py", line 189, in <module>
    _set_conf_sockets()  # Apply config
    ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/scapy/config.py", line 826, in _set_conf_sockets
    conf.ifaces.reload()
  File "/usr/lib/python3.11/site-packages/scapy/interfaces.py", line 253, in reload
    self._reload_provs()
  File "/usr/lib/python3.11/site-packages/scapy/interfaces.py", line 249, in _reload_provs
    self._load(prov.reload(), prov)
               ^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/scapy/interfaces.py", line 51, in reload
    return self.load()
           ^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/scapy/arch/linux/__init__.py", line 173, in load
    for iface in _get_if_list().values():
                 ^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/scapy/arch/linux/rtnetlink.py", line 790, in _get_if_list
    results = _sr1_rtrequest(
              ^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/scapy/arch/linux/rtnetlink.py", line 718, in _sr1_rtrequest
    sock.setsockopt(SOL_NETLINK, NETLINK_EXT_ACK, 1)
OSError: [Errno 92] Protocol not available

christian-sahlmann avatar Jun 14 '24 11:06 christian-sahlmann

Codecov Report

Attention: Patch coverage is 40.00000% with 3 lines in your changes missing coverage. Please review.

Project coverage is 80.39%. Comparing base (6b26ace) to head (ea01a92). Report is 7 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #4424      +/-   ##
==========================================
- Coverage   82.21%   80.39%   -1.82%     
==========================================
  Files         352      353       +1     
  Lines       84032    87515    +3483     
==========================================
+ Hits        69083    70359    +1276     
- Misses      14949    17156    +2207     
Files Coverage Δ
scapy/arch/linux/rtnetlink.py 93.39% <40.00%> (-1.32%) :arrow_down:

... and 36 files with indirect coverage changes

codecov[bot] avatar Jun 14 '24 11:06 codecov[bot]

Could you share details about your setup? What OS / version are affected?

gpotter2 avatar Jun 14 '24 15:06 gpotter2

My problem is that I'm stuck (at least for now) with a pretty old linux kernel (3.10.0-1160.45.1.el7.x86_64). So far, scapy worked perfectly fine there for my purposes (and does again with this fix).

christian-sahlmann avatar Jun 17 '24 11:06 christian-sahlmann

I did a little bit more research and found out that the minimum version for this to work is Linux 4.12.

See https://github.com/torvalds/linux/commit/2d4bc93368f5a0ddb57c8c885cdad9c9b7a10ed5

christian-sahlmann avatar Jun 17 '24 11:06 christian-sahlmann

That's interesting thanks. What if you just try: except: pass this request, does it work on your linux version? From what I understand Scapy shouldn't need extended ack reporting to work.

gpotter2 avatar Jun 22 '24 11:06 gpotter2

Yes, I've tried that as well, but then I get an exception at sock.setsockopt(SOL_NETLINK, NETLINK_GET_STRICT_CHK, 1), which apparently is available only since Linux 4.20 (https://github.com/torvalds/linux/commit/89d35528d17d25819a755a2b52931e911baebc66).

christian-sahlmann avatar Jun 24 '24 07:06 christian-sahlmann

Alright, thanks for the pointers.

I'll pop a VM with a Linux 3.0 kernel and investigate to see what we can do, and get back to you.

I can't really merge this PR because it's just a workaround. Scapy should have a way of reading routes on old linux kernels, as it used to. If it happens that RTNETLINK really isn't supported, we'll add a fallback to some other method.

gpotter2 avatar Jun 24 '24 08:06 gpotter2