aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJouni Malinen <jouni@qca.qualcomm.com>2015-04-07 11:32:11 +0300
committerGerrit - the friendly Code Review server <code-review@localhost>2015-04-27 17:28:05 -0700
commit01421cbd7fc8acb7f7598c051f5e40aa10f48556 (patch)
tree070c7cb458692c996462d750276fc265a3c397ad /src
parent6df936660c8b3a515e97fa2de74cb5923f630fde (diff)
downloadandroid_external_wpa_supplicant_8-01421cbd7fc8acb7f7598c051f5e40aa10f48556.tar.gz
android_external_wpa_supplicant_8-01421cbd7fc8acb7f7598c051f5e40aa10f48556.tar.bz2
android_external_wpa_supplicant_8-01421cbd7fc8acb7f7598c051f5e40aa10f48556.zip
P2P: Validate SSID element length before copying it
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> Git-repo: git://w1.fi/srv/git/hostap.git Git-commit: 9ed4eee345f85e3025c33c6e20aa25696e341ccd CRs-Fixed: 819135 Change-Id: Ieb7a14af9751a75cf3f209408e5c09c44f0d37db
Diffstat (limited to 'src')
-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 4305bbeb..5e3eca66 100644
--- a/src/p2p/p2p.c
+++ b/src/p2p/p2p.c
@@ -746,6 +746,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)) {