From 73da36ba1a4b6964ada8af8ac693d01edc078e94 Mon Sep 17 00:00:00 2001 From: Mark Latimer Date: Sun, 11 Jan 2015 12:19:20 +0100 Subject: mz: allow for zero udp checksum I have been investigating tools to generate UDP with checksums of zero for software testing. This is legal in IPv4 but unwise due to inability to verify the data has not been corrupted. I found that mausezahn was not able to create these packets due despite being able to create incorrect UDP checksums. The code does not distinguish set to zero and unset. Results as seen by wireshark (UDP checksum verification enabled) mausezahn eth0 -A 192.168.0.105 -B 192.168.0.104 -t udp "sp=32452,dp=1024" -P Hello -> UDP checksum is automatically set to the valid value. mausezahn eth0 -A 192.168.0.105 -B 192.168.0.104 -t udp "sp=32452,dp=1024,udp_sum=1" -P Hello -> UDP checksum is set to 1 (which is invalid and highlighted by wireshark). mausezahn eth0 -A 192.168.0.105 -B 192.168.0.104 -t udp "sp=32452,dp=1024,udp_sum=0" -P Hello -> Before patch the checksum was set to the valid value. -> After patch the checksum was sent to zero. Signed-off-by: Mark Latimer Signed-off-by: Daniel Borkmann --- staging/layer4.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/staging/layer4.c b/staging/layer4.c index ca4d229..a4431a1 100644 --- a/staging/layer4.c +++ b/staging/layer4.c @@ -146,7 +146,8 @@ libnet_ptag_t create_udp_packet (libnet_t *l) char argval[MAX_PAYLOAD_SIZE]; int T; // only an abbreviation for tx.packet_mode int i; - + int udp_sum_set = 0; + ///////////////////////////// // Default UDP header fields // Already reset in init.c @@ -216,6 +217,7 @@ libnet_ptag_t create_udp_packet (libnet_t *l) if (getarg(tx.arg_string,"udp_sum", argval)==1) { tx.udp_sum = (u_int16_t) str2int(argval); + udp_sum_set = 1; } @@ -277,7 +279,7 @@ libnet_ptag_t create_udp_packet (libnet_t *l) 0); // Checksum overwrite? Libnet IPv6 checksum calculation can't deal with extension headers, we have to do it ourself... - libnet_toggle_checksum(l, t, (tx.udp_sum || ipv6_mode) ? LIBNET_OFF : LIBNET_ON); + libnet_toggle_checksum(l, t, (udp_sum_set || ipv6_mode) ? LIBNET_OFF : LIBNET_ON); if (t == -1) { -- cgit v1.2.3-54-g00ecf