
압축 라이브러리 zlib 프로젝트가 메모리 처리와 압축파일 해제 과정의 보안 문제를 수정한 1.4 버전을 공개했다. 11월 4일자로 작성된 GitHub 공식 릴리스 노트에는 버퍼 범위 밖 읽기·쓰기, 초기화되지 않은 메모리의 출력, 부속 도구 minizip의 경로 처리 문제 등이 수정 사항으로 담겼다.
주요 수정 대상에는 비차단 방식으로 동작하는 gzwrite()의 버퍼 오버플로가 포함된다. 이 문제에는 CVE-2026-85091 식별자가 붙었다. inflateGetDictionary()에서는 잘못된 윈도 크기를 가진 zlib 헤더를 처리한 뒤 특정 초기화·동기화 함수를 호출하면, 호출자가 제공한 32KB 버퍼의 끝을 넘어 최대 8MB까지 쓸 수 있는 문제를 수정했다. 프로젝트가 명시한 해당 문제의 영향 버전은 1.3.1과 1.3.2다.
그 밖에도 inflateSync() 이후 발생할 수 있는 윈도 버퍼 초과 쓰기, inflatePrime() 처리와 관련된 입력 영역 이전 읽기, 반복적인 deflatePrime() 호출에 따른 버퍼 초과 쓰기를 바로잡았다. inflateBack()이 잘못된 압축 데이터를 처리하거나 데이터 기록 전에 gzseek()를 수행하는 과정에서 초기화되지 않은 메모리가 출력에 섞일 수 있던 문제도 수정 목록에 올랐다.
ZIP 파일을 다루는 부속 코드인 minizip에도 보완이 이뤄졌다. 이중 해제와 널 포인터 참조, 추가 필드와 Zip64 레코드의 경계 검증 문제가 수정됐다. 압축 해제 도구 miniunz가 지정된 해제 디렉터리 밖에 디렉터리를 만들거나 Windows에서 임의 경로에 파일을 쓸 수 있던 문제는 경로를 구성요소별로 처리하도록 바꿔 대응했다. 이 수정은 부속 도구의 동작에 관한 것으로, 모든 zlib 사용 프로그램이 같은 경로 문제에 노출된다는 의미는 아니다.
보안 수정과 함께 빌드 호환성에도 변화가 있다. CMake 최소 요구 버전은 3.12에서 3.15로 높아졌다. MSVC 환경의 라이브러리 이름은 z에서 libz로 바뀌어 libz.dll과 libz.lib, 정적 라이브러리 libzs.lib 등의 이름을 사용한다. minizip 라이브러리 이름에도 같은 변경이 적용된다.
기본 파일 오프셋 자료형인 z_off_t는 별도 조건으로 정해지지 않은 경우 1.3.2의 long long 대신 1.3.1과 같은 long으로 돌아간다. 프로젝트는 1.3.2 헤더로 빌드한 Windows 애플리케이션을 다시 컴파일해야 한다고 안내했다. Windows에서 64비트 파일 오프셋이 필요하면 애플리케이션을 빌드할 때 _FILE_OFFSET_BITS=64 또는 _LARGEFILE64_SOURCE를 지정할 수 있다.
이번 버전이 모든 부속 코드의 보안 문제를 해소한 것은 아니다. 공식 릴리스 노트는 contrib/iostream2가 압축 데이터 안에 저장된 문자열 길이를 검증하지 않아, 신뢰할 수 없는 입력에서 목적지 버퍼를 넘겨 쓸 수 있다고 명시했다. 프로젝트는 이 코드 대신 contrib/iostream3를 사용하라고 안내했다.
업데이트를 적용하는 개발팀은 사용 중인 zlib 버전뿐 아니라 minizip·miniunz 등 부속 코드의 포함 여부와 Windows 빌드 설정도 함께 살필 필요가 있다. 메모리 오류 수정과 별개로 라이브러리 이름, 자료형, 일부 함수 반환 동작이 바뀌었기 때문에 기존 빌드와 압축파일 처리 경로가 정상적으로 동작하는지 점검해야 한다.
출처: zlib 공식 GitHub 릴리스 노트 ‘zlib 1.4 Release Notes’ https://github.com/madler/zlib/releases/tag/v1.4 ; zlib 1.4 공식 변경 로그 https://raw.githubusercontent.com/madler/zlib/v1.4/ChangeLog









