[하루한줄] 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 취약점 입니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.