[하루한줄] CVE-2026-21897: NASA CryptoLib의 Out-of-Bounds Write
URL
https://github.com/nasa/CryptoLib/security/advisories/GHSA-9x7j-gx23-7m5r
Target
- CryptoLib ≤ 1.4.2
- Fixed in 1.4.3
Explain
NASA CryptoLib은 cFS(core Flight System)를 실행하는 우주선과 지상국 간의 통신을 보호하기 위해 CCSDS(Consultative Committee for Space Data Systems) Space Data Link Security Protocol - Extended Procedures (SDLS-EP)를 사용하는 소프트웨어 기반 솔루션입니다.
해당 라이브러리는 GVCID(SCID/VCID/TFVN) 조합별 보안 파라미터를 전역 배열에 저장하고, 등록 인덱스는 전역 카운터로 관리합니다.
gvcid_managed_parameters_array는 GVCID별 Managed Parameters를 저장하는 고정 크기 배열입니다. 배열 크기는 GVCID_MAN_PARAM_SIZE로 정의됩니다.
GvcidManagedParameters_t gvcid_managed_parameters_array[GVCID_MAN_PARAM_SIZE];
gvcid_counter는 다음에 저장할 배열 인덱스를 의미하며, 현재 등록된 Managed Parameters의 개수를 나타냅니다.
int gvcid_counter = 0;
1. Root Cause
Crypto_Config_Add_Gvcid_Managed_Parameters() 함수는 gvcid_counter를 배열 인덱스로 사용해 구조체를 저장한 뒤, 카운터를 1 증가시킵니다.
이 과정에서 gvcid_counter는 항상 0 이상 GVCID_MAN_PARAM_SIZE - 1 이하의 값을 가져야 합니다.
------------------------------------------------------------------------
GvcidManagedParameters_t gvcid_managed_parameters_array[GVCID_MAN_PARAM_SIZE];
int gvcid_counter = 0;
-----------------------------------------------------------------
int32_t Crypto_Config_Add_Gvcid_Managed_Parameters(GvcidManagedParameters_t s)
{
if (gvcid_counter > GVCID_MAN_PARAM_SIZE)
return CRYPTO_LIB_ERR_EXCEEDS_MANAGED_PARAMETER_MAX_LIMIT;
gvcid_managed_parameters_array[gvcid_counter] = s;
gvcid_counter++;
return CRYPTO_LIB_SUCCESS;
}
2. 취약점
비정상 동작은 잘못된 크기 검증에 의해 발생합니다. gvcid_counter의 경계 조건이 > 로 작성되어 발생합니다.
gvcid_counter가 배열 크기와 같은 값 (gvcid_counter == GVCID_MAN_PARAM_SIZE)인 경우가 차단되지 않아, 구조체 대입 시 배열 범위를 벗어난 쓰기가 발생할 수 있습니다.
이 쓰기는 배열 바로 뒤에 위치한 전역 메모리 영역에 영향을 줄 수 있습니다.
3.취약점 패치
if (gvcid_counter >= GVCID_MAN_PARAM_SIZE)
return CRYPTO_LIB_ERR_EXCEEDS_MANAGED_PARAMETER_MAX_LIMIT;
패치는 경계 조건을 >=로 수정하여, 배열 크기 이상인 경우 즉시 오류를 반환하도록 합니다.
Reference
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.