🇰🇷 한글 설명
OpenSSL 3.5와 3.6에서 'openssl dgst' 명령줄 도구가 일회성 서명 알고리즘을 사용할 때 입력 데이터를 16MB로 잘라내고 성공으로 보고하는 문제
💡 쉬운 설명
OpenSSL 3.5와 3.6에서 큰 파일을 서명하거나 검증할 때, 16MB 이상의 데이터는 인증되지 않음. 이는 파일의 일부가 수정되어도検출되지 않게 하는 취약점.
🇺🇸 원문 (English)
Issue summary: The 'openssl dgst' command-line tool silently truncates input
data to 16MB when using one-shot signing algorithms and reports success instead
of an error.
Impact summary: A user signing or verifying files larger than 16MB with
one-shot algorithms (such as Ed25519, Ed448, or ML-DSA) may believe the entire
file is authenticated while trailing data beyond 16MB remains unauthenticated.
When the 'openssl dgst' command is used with algorithms that only support
one-shot signing (Ed25519, Ed448, ML-DSA-44, ML-DSA-65, ML-DSA-87), the input
is buffered with a 16MB limit. If the input exceeds this limit, the tool
silently truncates to the first 16MB and continues without signaling an error,
contrary to what the documentation states. This creates an integrity gap where
trailing bytes can be modified without detection if both signing and
verification are performed using the same affected codepath.
The issue affects only the command-line tool behavior. Verifiers that process
the full message using library APIs will reject the signature, so the risk
primarily affects workflows that both sign and verify with the affected
'openssl dgst' command. Streaming digest algorithms for 'openssl dgst' and
library users are unaffected.
The FIPS modules in 3.5 and 3.6 are not affected by this issue, as the
command-line tools are outside the OpenSSL FIPS module boundary.
OpenSSL 3.5 and 3.6 are vulnerable to this issue.
OpenSSL 3.4, 3.3, 3.0, 1.1.1 and 1.0.2 are not affected by this issue.
📍 영향받는 시스템
OpenSSL 3.5, OpenSSL 3.6
⚔️ 공격 벡터
일회성 서명 알고리즘을 사용하여 큰 파일을 서명하거나 검증
🛡️ 대응 방법
OpenSSL을 최신 버전으로 업데이트하거나, 대체 명령줄 도구를 사용
🔧 검증 코드
이 코드는 로컬 시스템의 OpenSSL 버전을 확인하여 취약점 여부를 판단. Python 3.x가 설치되어 있어야 함.
python -c "import subprocess; output = subprocess.check_output(['openssl', 'version']).decode('utf-8'); if 'OpenSSL 3.5' in output or 'OpenSSL 3.6' in output: print('{"result": "취약", "reason": "OpenSSL 버전이 3.5 또는 3.6"}'); else: print('{"result": "양호", "reason": "OpenSSL 버전이 3.5 또는 3.6가 아님"}')"