Scapy stop_filter вызывает огромную утечку памяти - PullRequest
0 голосов
/ 19 марта 2019

У меня есть приложение, которое запускает виртуальные хосты. Я заметил, что память быстро растет со временем. После многих попыток найти причину выясняется, что причиной является stop_filter в scapy.

Работает следующий упрощенный код, вы можете просто скопировать / вставить:

from scapy.all import *
import threading
from time import sleep

def stopFilter(packet):
    if ICMP in packet:
        if packet[1].dst == '192.168.0.70':
            print('packet found')
            return True
def host():
    while True:
        sniff(iface="Intel(R) PRO/1000 PT Dual Port Server Adapter #2", timeout=2, stop_filter=stopFilter, store=0)
        sleep(2)

for i in range(200):
    print(i)
    t = threading.Thread(target=host)
    t.start()
    sleep(0.1)

Конечно, вам нужно сменить адаптер и IP. Кроме того, используйте ping -t для IP во время выполнения кода, чтобы stopFilter() работал. Уже через несколько секунд вы можете видеть, что память накапливается. Я думаю, что аналогичная проблема в C с libpcap.

Есть идеи, как это решить?

Среда: Python 3.6.0, Win 7, Scapy 2.4.0 (та же проблема в Scapy 2.4.2)

1 Ответ

0 голосов
/ 19 марта 2019

Я сам исправил проблему. Просто перейдите на ~Lib\site-packages\scapy\sendrecv.py и под

if stop_filter and stop_filter(p): заменить:

sniff_sockets = []
break

с:

for s in sniff_sockets:
     s.close()
del sniff_sockets
return   

и теперь проблема с памятью исчезла.

Обновление:

Вышеупомянутое решение помогает только в 2.4.0 (без утечек памяти), но не помогает в 2.4.1 и 2.4.2

...