diff options
author | Nardi Ivan <nardi.ivan@gmail.com> | 2024-03-19 19:48:41 +0100 |
---|---|---|
committer | Ivan Nardi <12729895+IvanNardi@users.noreply.github.com> | 2024-03-20 09:39:15 +0100 |
commit | f758f3605a25a9e4618f3b7773b4baab3783674b (patch) | |
tree | ed5bf283043e434714a9a1453454e6aba8202da6 /src | |
parent | ee87c4bc66bba569c2142fb2c53d6c8cf6969b77 (diff) |
STUN: dissection of TURN Channel Data
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/protocols/stun.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/src/lib/protocols/stun.c b/src/lib/protocols/stun.c index 7f79adc9d..4f7652491 100644 --- a/src/lib/protocols/stun.c +++ b/src/lib/protocols/stun.c @@ -555,7 +555,33 @@ static int stun_search_again(struct ndpi_detection_module_struct *ndpi_struct, } else if(first_byte <= 79) { if(flow->stun.is_turn) { NDPI_LOG_DBG(ndpi_struct, "TURN range\n"); - /* TODO */ + + if(packet->payload_packet_len >= 4) { + u_int16_t ch_len; + + ch_len = ntohs(*(u_int16_t *)&packet->payload[2]); + + if(ch_len <= packet->payload_packet_len - 4) { + const u_int8_t *orig_payload; + u_int16_t orig_payload_length; + + orig_payload = packet->payload; + orig_payload_length = packet->payload_packet_len; + packet->payload = packet->payload + 4; + packet->payload_packet_len = ch_len; + + stun_search_again(ndpi_struct, flow); + NDPI_LOG_DBG(ndpi_struct, "End recursion on turn channel\n"); + + packet->payload = orig_payload; + packet->payload_packet_len = orig_payload_length; + + } else { + if(flow->l4_proto == IPPROTO_UDP) /* The error is quite common on TCP since we don't reassemble msgs */ + NDPI_LOG_DBG(ndpi_struct, "Invalid channel length %d %d\n", + ch_len, packet->payload_packet_len - 4); + } + } } else { NDPI_LOG_DBG(ndpi_struct, "QUIC range (not turn). Unexpected\n"); } |