EAP peer: Clear temporary message buffers before freeing
These buffers in TLS-based EAP methods might contain keys or password (e.g., when using TTLS-PAP or PEAP-GTC), so clear them explicitly to avoid leaving such material into heap memory unnecessarily. Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
This commit is contained in:
parent
8f99a3c26a
commit
789b48bb48
3 changed files with 56 additions and 56 deletions
|
@ -250,8 +250,8 @@ static void eap_fast_deinit(struct eap_sm *sm, void *priv)
|
|||
os_memset(data->key_data, 0, EAP_FAST_KEY_LEN);
|
||||
os_memset(data->emsk, 0, EAP_EMSK_LEN);
|
||||
os_free(data->session_id);
|
||||
wpabuf_free(data->pending_phase2_req);
|
||||
wpabuf_free(data->pending_resp);
|
||||
wpabuf_clear_free(data->pending_phase2_req);
|
||||
wpabuf_clear_free(data->pending_resp);
|
||||
os_free(data);
|
||||
}
|
||||
|
||||
|
@ -486,7 +486,7 @@ static int eap_fast_phase2_request(struct eap_sm *sm,
|
|||
(config->pending_req_identity || config->pending_req_password ||
|
||||
config->pending_req_otp || config->pending_req_new_password ||
|
||||
config->pending_req_sim)) {
|
||||
wpabuf_free(data->pending_phase2_req);
|
||||
wpabuf_clear_free(data->pending_phase2_req);
|
||||
data->pending_phase2_req = wpabuf_alloc_copy(hdr, len);
|
||||
} else if (*resp == NULL)
|
||||
return -1;
|
||||
|
@ -801,7 +801,7 @@ static struct wpabuf * eap_fast_process_crypto_binding(
|
|||
ret->methodState = METHOD_DONE;
|
||||
ret->decision = DECISION_FAIL;
|
||||
data->phase2_success = 0;
|
||||
wpabuf_free(resp);
|
||||
wpabuf_clear_free(resp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -815,7 +815,7 @@ static struct wpabuf * eap_fast_process_crypto_binding(
|
|||
} else {
|
||||
wpa_printf(MSG_ERROR, "EAP-FAST: Failed to derive "
|
||||
"Session-Id");
|
||||
wpabuf_free(resp);
|
||||
wpabuf_clear_free(resp);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
@ -1150,7 +1150,7 @@ static int eap_fast_encrypt_response(struct eap_sm *sm,
|
|||
wpa_printf(MSG_INFO, "EAP-FAST: Failed to encrypt a Phase 2 "
|
||||
"frame");
|
||||
}
|
||||
wpabuf_free(resp);
|
||||
wpabuf_clear_free(resp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1328,14 +1328,14 @@ continue_req:
|
|||
wpa_printf(MSG_INFO, "EAP-FAST: Too short Phase 2 "
|
||||
"TLV frame (len=%lu)",
|
||||
(unsigned long) wpabuf_len(in_decrypted));
|
||||
wpabuf_free(in_decrypted);
|
||||
wpabuf_clear_free(in_decrypted);
|
||||
return -1;
|
||||
}
|
||||
|
||||
res = eap_fast_process_decrypted(sm, data, ret, identifier,
|
||||
in_decrypted, out_data);
|
||||
|
||||
wpabuf_free(in_decrypted);
|
||||
wpabuf_clear_free(in_decrypted);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
@ -1613,7 +1613,7 @@ static struct wpabuf * eap_fast_process(struct eap_sm *sm, void *priv,
|
|||
if (sm->waiting_ext_cert_check) {
|
||||
wpa_printf(MSG_DEBUG,
|
||||
"EAP-FAST: Waiting external server certificate validation");
|
||||
wpabuf_free(data->pending_resp);
|
||||
wpabuf_clear_free(data->pending_resp);
|
||||
data->pending_resp = resp;
|
||||
return NULL;
|
||||
}
|
||||
|
@ -1641,7 +1641,7 @@ static struct wpabuf * eap_fast_process(struct eap_sm *sm, void *priv,
|
|||
"EAP-FAST: Could not derive keys");
|
||||
ret->methodState = METHOD_DONE;
|
||||
ret->decision = DECISION_FAIL;
|
||||
wpabuf_free(resp);
|
||||
wpabuf_clear_free(resp);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
@ -1650,7 +1650,7 @@ static struct wpabuf * eap_fast_process(struct eap_sm *sm, void *priv,
|
|||
/*
|
||||
* Application data included in the handshake message.
|
||||
*/
|
||||
wpabuf_free(data->pending_phase2_req);
|
||||
wpabuf_clear_free(data->pending_phase2_req);
|
||||
data->pending_phase2_req = resp;
|
||||
resp = NULL;
|
||||
res = eap_fast_decrypt(sm, data, ret, id, &msg, &resp);
|
||||
|
@ -1658,7 +1658,7 @@ static struct wpabuf * eap_fast_process(struct eap_sm *sm, void *priv,
|
|||
}
|
||||
|
||||
if (res == 1) {
|
||||
wpabuf_free(resp);
|
||||
wpabuf_clear_free(resp);
|
||||
return eap_peer_tls_build_ack(id, EAP_TYPE_FAST,
|
||||
data->fast_version);
|
||||
}
|
||||
|
@ -1684,9 +1684,9 @@ static void eap_fast_deinit_for_reauth(struct eap_sm *sm, void *priv)
|
|||
data->phase2_method->deinit_for_reauth(sm, data->phase2_priv);
|
||||
os_free(data->key_block_p);
|
||||
data->key_block_p = NULL;
|
||||
wpabuf_free(data->pending_phase2_req);
|
||||
wpabuf_clear_free(data->pending_phase2_req);
|
||||
data->pending_phase2_req = NULL;
|
||||
wpabuf_free(data->pending_resp);
|
||||
wpabuf_clear_free(data->pending_resp);
|
||||
data->pending_resp = NULL;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue