Skip to content

Commit 7de2efd

Browse files
committed
erase the plain-text VDM message after processing it.
fix #2426 Signed-off-by: Aaron Li <[email protected]>
1 parent 22d10f4 commit 7de2efd

File tree

6 files changed

+39
-5
lines changed

6 files changed

+39
-5
lines changed

library/spdm_requester_lib/libspdm_req_handle_error_response.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,7 @@ libspdm_return_t libspdm_handle_error_large_response(
453453
*inout_response_size = large_response_size;
454454

455455
LIBSPDM_INTERNAL_DUMP_HEX(large_response, large_response_size);
456+
libspdm_zero_mem(large_response, large_response_size);
456457
}
457458
}
458459

library/spdm_requester_lib/libspdm_req_send_receive.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@ libspdm_return_t libspdm_send_request(void *spdm_context, const uint32_t *sessio
9595
status = context->transport_encode_message(
9696
context, session_id, is_app_message, true, request_size,
9797
request, &message_size, (void **)&message);
98+
if (session_id != NULL) {
99+
/* clean up secure message which was copied to scratch buffer */
100+
libspdm_zero_mem(request, request_size);
101+
}
98102
if (LIBSPDM_STATUS_IS_ERROR(status)) {
99103
LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "transport_encode_message status - %xu\n", status));
100104
if ((session_id != NULL) &&
@@ -591,6 +595,7 @@ libspdm_return_t libspdm_handle_large_request(
591595
&& send_info->chunk_bytes_transferred < send_info->large_message_size);
592596

593597
if (LIBSPDM_STATUS_IS_ERROR(status)) {
598+
libspdm_zero_mem(send_info->large_message, send_info->large_message_capacity);
594599
send_info->chunk_in_use = false;
595600
send_info->chunk_handle++; /* Implicit wrap-around*/
596601
send_info->chunk_seq_no = 0;
@@ -749,6 +754,7 @@ libspdm_return_t libspdm_receive_spdm_response(libspdm_context_t *spdm_context,
749754

750755
/* This response may either be an actual response or ERROR_LARGE_RESPONSE,
751756
* the latter which should be handled in the large response handler. */
757+
libspdm_zero_mem(send_info->large_message, send_info->large_message_capacity);
752758
send_info->chunk_in_use = false;
753759
send_info->chunk_handle++; /* Implicit wrap-around*/
754760
send_info->chunk_seq_no = 0;

library/spdm_requester_lib/libspdm_req_vendor_request.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ libspdm_return_t libspdm_try_vendor_send_request_receive_response(
167167
libspdm_release_sender_buffer (spdm_context);
168168
return LIBSPDM_STATUS_SEND_FAIL;
169169
}
170+
libspdm_zero_mem(message, message_size);
170171
libspdm_release_sender_buffer (spdm_context);
171172
spdm_request = (void *)spdm_context->last_spdm_request;
172173

@@ -296,6 +297,14 @@ libspdm_return_t libspdm_try_vendor_send_request_receive_response(
296297

297298
status = LIBSPDM_STATUS_SUCCESS;
298299
done:
300+
libspdm_zero_mem(spdm_context->last_spdm_request,
301+
libspdm_get_scratch_buffer_last_spdm_request_capacity(spdm_context));
302+
spdm_context->last_spdm_request_size = 0;
303+
/*
304+
* reciver buffer "message" contains crypted message
305+
* "spdm_response" contains the plain-text VDM message
306+
*/
307+
libspdm_zero_mem(spdm_response, spdm_response_size);
299308
libspdm_release_receiver_buffer (spdm_context); /* this will free up response-message, need to find workaround */
300309
return status;
301310
}

library/spdm_responder_lib/libspdm_rsp_chunk_get.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ libspdm_return_t libspdm_get_response_chunk_get(
208208

209209
LIBSPDM_ASSERT(get_info->chunk_bytes_transferred <= get_info->large_message_size);
210210
if (get_info->chunk_bytes_transferred == get_info->large_message_size) {
211+
libspdm_zero_mem(get_info->large_message, get_info->large_message_capacity);
211212
get_info->chunk_in_use = false;
212213
get_info->chunk_handle++; /* implicit wrap - around to 0. */
213214
get_info->chunk_seq_no = 0;

library/spdm_responder_lib/libspdm_rsp_receive_send.c

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,7 @@ libspdm_return_t libspdm_process_request(void *spdm_context, uint32_t **session_
284284
libspdm_get_scratch_buffer_last_spdm_request_capacity(context),
285285
decoded_message_ptr,
286286
decoded_message_size);
287+
libspdm_zero_mem (decoded_message_ptr, decoded_message_size);
287288

288289
if (!(*is_app_message)) {
289290
/* Check for minimal SPDM message size. */
@@ -738,15 +739,16 @@ libspdm_return_t libspdm_build_response(void *spdm_context, const uint32_t *sess
738739
* return UNSUPPORTED and clear response_size to continue the dispatch without send response.*/
739740
if ((my_response_size == 0) && (status == LIBSPDM_STATUS_UNSUPPORTED_CAP)) {
740741
*response_size = 0;
741-
return LIBSPDM_STATUS_UNSUPPORTED_CAP;
742+
status = LIBSPDM_STATUS_UNSUPPORTED_CAP;
743+
goto done;
742744
}
743745

744746
if (LIBSPDM_STATUS_IS_ERROR(status)) {
745747
status = libspdm_generate_error_response(
746748
context, SPDM_ERROR_CODE_UNSUPPORTED_REQUEST,
747749
spdm_request->request_response_code, &my_response_size, my_response);
748750
if (LIBSPDM_STATUS_IS_ERROR(status)) {
749-
return status;
751+
goto done;
750752
}
751753
}
752754

@@ -767,7 +769,7 @@ libspdm_return_t libspdm_build_response(void *spdm_context, const uint32_t *sess
767769
libspdm_free_session_id(context, *session_id);
768770
}
769771
LIBSPDM_DEBUG((LIBSPDM_DEBUG_INFO, "transport_encode_message : %xu\n", status));
770-
return status;
772+
goto done;
771773
}
772774

773775
request_response_code = spdm_response->request_response_code;
@@ -857,7 +859,19 @@ libspdm_return_t libspdm_build_response(void *spdm_context, const uint32_t *sess
857859
}
858860
}
859861

860-
return LIBSPDM_STATUS_SUCCESS;
862+
status = LIBSPDM_STATUS_SUCCESS;
863+
done:
864+
if (spdm_request->request_response_code == SPDM_VENDOR_DEFINED_REQUEST) {
865+
if (session_id != NULL) {
866+
/* clean plain text in stratch buffer */
867+
libspdm_zero_mem (my_response, my_response_size);
868+
}
869+
libspdm_zero_mem (context->last_spdm_request,
870+
libspdm_get_scratch_buffer_last_spdm_request_capacity(context));
871+
context->last_spdm_request_size = 0;
872+
context->last_spdm_request_session_id_valid = false;
873+
}
874+
return status;
861875
}
862876

863877
void libspdm_register_get_response_func(void *context, libspdm_get_response_func get_response_func)

library/spdm_responder_lib/libspdm_rsp_respond_if_ready.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
22
* Copyright Notice:
3-
* Copyright 2021-2022 DMTF. All rights reserved.
3+
* Copyright 2021-2025 DMTF. All rights reserved.
44
* License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libspdm/blob/main/LICENSE.md
55
**/
66

@@ -69,6 +69,9 @@ libspdm_return_t libspdm_get_response_respond_if_ready(libspdm_context_t *spdm_c
6969
spdm_context->cache_spdm_request,
7070
response_size, response);
7171

72+
libspdm_zero_mem(spdm_context->cache_spdm_request, spdm_context->cache_spdm_request_size);
73+
spdm_context->cache_spdm_request_size = 0;
74+
7275
return status;
7376
}
7477

0 commit comments

Comments
 (0)