secdev / scapy

Scapy: the Python-based interactive packet manipulation program & library.
https://scapy.net
GNU General Public License v2.0
10.29k stars 1.99k forks source link

do not fail on linux < 4.12 #4424

Open christian-sahlmann opened 2 weeks ago

christian-sahlmann commented 2 weeks ago

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
codecov[bot] commented 2 weeks ago

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 ```diff @@ 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](https://app.codecov.io/gh/secdev/scapy/pull/4424?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=secdev) | Coverage Δ | | |---|---|---| | [scapy/arch/linux/rtnetlink.py](https://app.codecov.io/gh/secdev/scapy/pull/4424?src=pr&el=tree&filepath=scapy%2Farch%2Flinux%2Frtnetlink.py&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=secdev#diff-c2NhcHkvYXJjaC9saW51eC9ydG5ldGxpbmsucHk=) | `93.39% <40.00%> (-1.32%)` | :arrow_down: | ... and [36 files with indirect coverage changes](https://app.codecov.io/gh/secdev/scapy/pull/4424/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=secdev)
gpotter2 commented 2 weeks ago

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

christian-sahlmann commented 2 weeks ago

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 commented 2 weeks ago

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

gpotter2 commented 1 week ago

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.

christian-sahlmann commented 1 week ago

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).

gpotter2 commented 1 week ago

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.