aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2006-05-22 19:55:14 -0400
committerDavid S. Miller <davem@davemloft.net>2006-05-22 19:55:14 -0400
commitf41d5bb1d9f49b03af7126d07a511facbe283a92 (patch)
tree3551fffccb0cafd2851bc441cf8ea1a81716a9f7
parentf5565f4a90bdfea99e4bcd8411ff5272ebdbdbf8 (diff)
[NETFILTER]: SNMP NAT: fix memory corruption
Fix memory corruption caused by snmp_trap_decode: - When snmp_trap_decode fails before the id and address are allocated, the pointers contain random memory, but are freed by the caller (snmp_parse_mangle). - When snmp_trap_decode fails after allocating just the ID, it tries to free both address and ID, but the address pointer still contains random memory. The caller frees both ID and random memory again. - When snmp_trap_decode fails after allocating both, it frees both, and the callers frees both again. The corruption can be triggered remotely when the ip_nat_snmp_basic module is loaded and traffic on port 161 or 162 is NATed. Found by multiple testcases of the trap-app and trap-enc groups of the PROTOS c06-snmpv1 testsuite. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/ipv4/netfilter/ip_nat_snmp_basic.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/net/ipv4/netfilter/ip_nat_snmp_basic.c b/net/ipv4/netfilter/ip_nat_snmp_basic.c
index c62253845538..688a2f29fadf 100644
--- a/net/ipv4/netfilter/ip_nat_snmp_basic.c
+++ b/net/ipv4/netfilter/ip_nat_snmp_basic.c
@@ -1003,12 +1003,12 @@ static unsigned char snmp_trap_decode(struct asn1_ctx *ctx,
1003 1003
1004 return 1; 1004 return 1;
1005 1005
1006err_addr_free:
1007 kfree((unsigned long *)trap->ip_address);
1008
1006err_id_free: 1009err_id_free:
1007 kfree(trap->id); 1010 kfree(trap->id);
1008 1011
1009err_addr_free:
1010 kfree((unsigned long *)trap->ip_address);
1011
1012 return 0; 1012 return 0;
1013} 1013}
1014 1014
@@ -1126,11 +1126,10 @@ static int snmp_parse_mangle(unsigned char *msg,
1126 struct snmp_v1_trap trap; 1126 struct snmp_v1_trap trap;
1127 unsigned char ret = snmp_trap_decode(&ctx, &trap, map, check); 1127 unsigned char ret = snmp_trap_decode(&ctx, &trap, map, check);
1128 1128
1129 /* Discard trap allocations regardless */ 1129 if (ret) {
1130 kfree(trap.id); 1130 kfree(trap.id);
1131 kfree((unsigned long *)trap.ip_address); 1131 kfree((unsigned long *)trap.ip_address);
1132 1132 } else
1133 if (!ret)
1134 return ret; 1133 return ret;
1135 1134
1136 } else { 1135 } else {