[하루한줄] This shouldn't have happened: A vulnerability postmortem

URL

This shouldn’t have happened: A vulnerability postmortem

Target

Mozilla’s Network Security Services (NSS)

Explain

Mozilla에서 개발한 암호 라이브러리, Network Security Services (NSS)에서 메모리 오염 취약점이 발견되었습니다.

ASN.1으로 인코딩된 디지털 서명을 검증할 때 NSS는 VFYContext구조체를 생성합니다. VFYContext에는 공개키, 해쉬 알고리즘, 디지털 서명등의 정보를 저장합니다.

struct VFYContextStr {

   SECOidTag hashAlg; /* the hash algorithm */

   SECKEYPublicKey *key;

   union {

       unsigned char buffer[1];

       unsigned char dsasig[DSA_MAX_SIGNATURE_LEN];

       unsigned char ecdsasig[2 * MAX_ECKEY_LEN];

       unsigned char rsasig[(RSA_MAX_MODULUS_BITS + 7) / 8];

   } u;

   unsigned int pkcs1RSADigestInfoLen;

   unsigned char *pkcs1RSADigestInfo;

   void *wincx;

   void *hashcx;

   const SECHashObject *hashobj;

   SECOidTag encAlg;    /* enc alg */

   PRBool hasSignature;

   SECItem *params;

};

문제는 해당 구조체가 담을 수 있는 디지털 서명의 길이가 고정되어 있다는 것입니다. RSA의 경우 그 길이는 2048 bytes (163484 bits)입니다. 단순히 정해진 길이보다 긴 디지털 서명을 전달하는 것으로 고정된 크기의 buffer에 신뢰할 수 없는 데이터가 복사되어 메모리가 오염됩니다. 암호화 키와 디지털 서명에 대한 bound 검사가 없어 발생하는 전형적인 overflow 취약점 입니다.