🇰🇷 한글 설명
CMS 비밀번호 기반 복호화 과정에서 공격자가 스트림 모드 KEK 암호를 선택하면, kek_unwrap_key() 함수에서 힙 영역의 바이트 초과 읽기가 발생할 수 있습니다. 이는 입력 버퍼가 메모리 페이지 경계에 위치할 때 애플리케이션 충돌을 유발하여 서비스 거부(DoS)로 이어질 수 있습니다.
💡 쉬운 설명
CMS 데이터를 처리할 때 잘못된 암호 방식을 선택하면 프로그램이 오류를 일으켜 충돌할 수 있습니다. 이 취약점은 데이터를 훔치는 것이 아니라 프로그램을 멈추게 하는 데 주로 사용됩니다.
🇺🇸 원문 (English)
Issue summary: When CMS password-based decryption (RFC 3211 / PWRI key unwrap)
processes attacker-supplied CMS data, an attacker-chosen stream-mode KEK
cipher can trigger a heap out-of-bounds read in kek_unwrap_key().
Impact summary: A heap buffer over-read may trigger a crash which leads to
Denial of Service for an application if the input buffer ends at a memory
page boundary and the following page is unmapped. There is no information
disclosure as the over-read bytes are not revealed to the attacker.
The key unwrapping function performs a check-byte test as specified in the
RFC that reads 7 bytes from a heap allocation that is based on the wrapped
key length from the message. There is a minimum length check based on the
block length of the wrapping cipher. However the cipher is selected from
an OID carried in the attacker's PWRI keyEncryptionAlgorithm with no
requirement that the cipher be a block cipher. When an attacker selects
a stream-mode cipher the guard will be ineffective and the allocated buffer
containing the unwrapped key can be too small to fit the check-bytes
specified in the RFC and a buffer over-read can happen.
Applications calling CMS_decrypt() or CMS_decrypt_set1_password()
(equivalently openssl cms -decrypt -pwri_password ...) on untrusted CMS
data are vulnerable to this issue. No password knowledge is required: the
over-read happens during the unwrap attempt before any authentication
succeeds.
The over-read is limited to a few bytes and is not written to output, so
there is no information disclosure. Triggering a crash requires the
allocation to border unmapped memory, which is unlikely with the normal
allocator.
The FIPS modules are not affected by this issue.
📍 영향받는 시스템
OpenSSL (CMS_decrypt 및 CMS_decrypt_set1_password 함수를 사용하는 애플리케이션)
⚔️ 공격 벡터
공격자가 생성한 악의적인 CMS 데이터를 애플리케이션의 복호화 함수에 주입하여 힙 메모리 초과 읽기를 유도합니다.
🛡️ 대응 방법
OpenSSL을 최신 안정 버전으로 업그레이드하여 패치된 라이브러리를 적용합니다.
🔧 검증 코드
출력된 버전이 취약한 버전보다 최신인지 확인하여 패치가 적용되었는지 검증합니다.