From 508603586c2cb5587dd32e61baf8ab55b56734dd Mon Sep 17 00:00:00 2001 From: MotherFraggr <32443585+MotherFraggr@users.noreply.github.com> Date: Thu, 23 Apr 2026 15:02:14 -0400 Subject: [PATCH 1/3] Implemented fix proposed by Kevalz95, Issue #564, in modbus_server.py --- conpot/protocols/modbus/modbus_server.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/conpot/protocols/modbus/modbus_server.py b/conpot/protocols/modbus/modbus_server.py index 5400b105..9edb73f7 100644 --- a/conpot/protocols/modbus/modbus_server.py +++ b/conpot/protocols/modbus/modbus_server.py @@ -134,10 +134,21 @@ def handle(self, sock, address): session.add_event({"type": "CONNECTION_TERMINATED"}) break _, _, length = struct.unpack(">HHH", request[:6]) + previous_request = None + stall_counter = 0 + #Implemented fix proposed by Kevalz95, Issue #564 + #Adds stall counter to prevent infinite loop on malformed requests while len(request) < (length + 6): try: + if previous_request and len(previous_request) == len(request): + stall_counter += 1 + if stall_counter >= 1000: + logger.info("Modbus client provided data {} but invalid.".format(session.id)) + session.add_event({"type": "CONNECTION_TERMINATED"}) + break new_byte = sock.recv(1) request += new_byte + previous_request = request except Exception: break query = modbus_tcp.TcpQuery() From 452cf4e85e2d61180a67dd2217e117165bdafad9 Mon Sep 17 00:00:00 2001 From: MotherFraggr <32443585+MotherFraggr@users.noreply.github.com> Date: Tue, 5 May 2026 08:48:20 -0400 Subject: [PATCH 2/3] Reformat modbus_server.py per Black code check --- conpot/protocols/modbus/modbus_server.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/conpot/protocols/modbus/modbus_server.py b/conpot/protocols/modbus/modbus_server.py index 9edb73f7..43979cb5 100644 --- a/conpot/protocols/modbus/modbus_server.py +++ b/conpot/protocols/modbus/modbus_server.py @@ -136,14 +136,18 @@ def handle(self, sock, address): _, _, length = struct.unpack(">HHH", request[:6]) previous_request = None stall_counter = 0 - #Implemented fix proposed by Kevalz95, Issue #564 - #Adds stall counter to prevent infinite loop on malformed requests + # Implemented fix proposed by Kevalz95, Issue #564 + # Adds stall counter to prevent infinite loop on malformed requests while len(request) < (length + 6): try: if previous_request and len(previous_request) == len(request): stall_counter += 1 if stall_counter >= 1000: - logger.info("Modbus client provided data {} but invalid.".format(session.id)) + logger.info( + "Modbus client provided data {} but invalid.".format( + session.id + ) + ) session.add_event({"type": "CONNECTION_TERMINATED"}) break new_byte = sock.recv(1) From 2bfb2d2fe153cbcccdc8be6c2c6e3e68836c2326 Mon Sep 17 00:00:00 2001 From: MotherFraggr <32443585+MotherFraggr@users.noreply.github.com> Date: Tue, 30 Jun 2026 16:15:36 -0400 Subject: [PATCH 3/3] Reordered length check logic Resolving "Check request length before and after recv()" PR review issue --- conpot/protocols/modbus/modbus_server.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/conpot/protocols/modbus/modbus_server.py b/conpot/protocols/modbus/modbus_server.py index 43979cb5..e0929bc2 100644 --- a/conpot/protocols/modbus/modbus_server.py +++ b/conpot/protocols/modbus/modbus_server.py @@ -140,19 +140,20 @@ def handle(self, sock, address): # Adds stall counter to prevent infinite loop on malformed requests while len(request) < (length + 6): try: + # Previous request now assigned before recv() called, length check performed after + previous_request = request + new_byte = sock.recv(1) + request += new_byte if previous_request and len(previous_request) == len(request): stall_counter += 1 - if stall_counter >= 1000: - logger.info( - "Modbus client provided data {} but invalid.".format( - session.id - ) + if stall_counter >= 1000: + logger.info( + "Modbus client provided data {} but invalid.".format( + session.id ) - session.add_event({"type": "CONNECTION_TERMINATED"}) - break - new_byte = sock.recv(1) - request += new_byte - previous_request = request + ) + session.add_event({"type": "CONNECTION_TERMINATED"}) + break except Exception: break query = modbus_tcp.TcpQuery()