[하루한줄] 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