aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJouni Malinen <jouni@qca.qualcomm.com>2015-04-07 11:32:11 +0300
committerAbhisek Devkota <ciwrl@cyanogenmod.com>2015-05-07 19:22:05 +0000
commit9a5268240c8c47c78743d3130ea1e4366f97f8aa (patch)
tree2e203bd7a0ff3b3096ebd17cdbd5c11e77c660f1
parent15e433e0cb47d21a8c825601189cf175a19eea8e (diff)
downloadandroid_external_wpa_supplicant_8-stable/cm-12.0-YNG1TA.tar.gz
android_external_wpa_supplicant_8-stable/cm-12.0-YNG1TA.tar.bz2
android_external_wpa_supplicant_8-stable/cm-12.0-YNG1TA.zip
P2P: Validate SSID element length before copying itstable/cm-12.0-YNG1TA
This fixes a possible memcpy overflow for P2P dev->oper_ssid in p2p_add_device(). The length provided by the peer device (0..255 bytes) was used without proper bounds checking and that could have resulted in arbitrary data of up to 223 bytes being written beyond the end of the dev->oper_ssid[] array (of which about 150 bytes would be beyond the heap allocation) when processing a corrupted management frame for P2P peer discovery purposes. This could result in corrupted state in heap, unexpected program behavior due to corrupted P2P peer device information, denial of service due to process crash, exposure of memory contents during GO Negotiation, and potentially arbitrary code execution. Thanks to Google security team for reporting this issue and smart hardware research group of Alibaba security team for discovering it. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com> (cherry picked from commit fdb708a37d8f7f1483e3cd4e8ded974f53fedace) Change-Id: Ibc53ff533f78cfcd7c51fbb5d5494b828f184cc8 (cherry picked from commit 6f5b05b471d8cba1b522cb7af34e3a356925e787)
-rw-r--r--src/p2p/p2p.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/src/p2p/p2p.c b/src/p2p/p2p.c
index 9f3cff4c..5276f9e5 100644
--- a/src/p2p/p2p.c
+++ b/src/p2p/p2p.c
@@ -745,6 +745,7 @@ int p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq,
if (os_memcmp(addr, p2p_dev_addr, ETH_ALEN) != 0)
os_memcpy(dev->interface_addr, addr, ETH_ALEN);
if (msg.ssid &&
+ msg.ssid[1] <= sizeof(dev->oper_ssid) &&
(msg.ssid[1] != P2P_WILDCARD_SSID_LEN ||
os_memcmp(msg.ssid + 2, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN)
!= 0)) {