Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2019-11933 — WhatsApp의 미디어 선택기에서 발생하는 힙 손상 | Kitploit
도구/GitHubGitHub/natleoj/cve-2019-11933
Android SecurityMemory ForensicsVulnerability AnalysisExploitationMobile SecurityBinary Exploitation
GitHubnatleoj/cve-2019-11933

CVE-2019-11933

WhatsApp의 미디어 선택기에서 발생하는 힙 손상

저장소 보기
76년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2019-11933

WhatsApp의 미디어 선택기에서 발생하는 힙 손상으로, Android용 WhatsApp 2.19.291 이전 버전에 영향을 미칩니다.

배경

GIF 파일은 특정 바이트로 표시된 세그먼트로 나뉩니다:

  • 이미지(0x2C)
    • 이미지 섹션은 GIF 파일의 단일 프레임을 설명하며, 높이, 너비 및 압축된 이미지 자체와 같은 정보를 포함합니다. GIF는 여러 프레임을 가질 수 있으므로 여러 이미지 섹션을 가질 수 있습니다.
  • 확장(0x21)
    • 확장 섹션은 이미지를 수정하는 데 사용되는 데이터를 포함합니다.
  • 종료(0x3B)
    • GIF 파일의 끝을 표시합니다.

소스 코드에 따르면, renderFrame은 GIF를 파싱하기 위해 DDGifSlurp를 호출하고, GIF를 표시하기 위해 getBitmap을 호출합니다. rasterBits 버퍼는 해당 함수에 의해 할당되며, 그 크기는 현재 처리 중인 이미지의 너비와 높이를 곱하여 계산됩니다. 아마도 메모리 공간과 시간을 절약하기 위해, 동일한 rasterBits 버퍼가 GIF의 모든 프레임/이미지에 사용됩니다. 따라서 버퍼는 파일에 설명된 가장 큰 이미지를 담을 수 있어야 합니다. 그렇기 때문에 같은 GIF 내의 다른 이미지 섹션이 더 큰 이미지를 설명하는 경우(더 많은 공간이 필요한 경우) 버퍼가 그에 따라 재할당됩니다.

취약점

DDGifSlurp는 GIF 파일을 루프에서 파싱하여 파일의 각 이미지/프레임을 처리하고 종료 레코드를 만나면 종료됩니다. DGifGetImageDesc가 GIF_ERROR를 반환하면(a), 조기 종료(switch 케이스에서)가 발생하여 rasterBits 버퍼를 재할당하는 코드가 건너뛰어집니다. DDGifSlurp의 일부는 아래와 같습니다:

root@kitploit:~
void DDGifSlurp(GifInfo *info, bool decode, bool exitAfterFrame) {
    ...
    do {
        ...
        switch (RecordType) {
            case IMAGE_DESC_RECORD_TYPE:
             
                if (DGifGetImageDesc(gifFilePtr, isInitialPass) == GIF_ERROR) {   <-- [a]
                    break;
                }
                ...
                if (decode) {
                    ...
                    const uint_fast32_t newRasterSize = gifFilePtr->Image.Width * gifFilePtr->Image.Height;
                    if (newRasterSize > info->rasterSize || widthOverflow > 0 || heightOverflow > 0) {
                        void *tmpRasterBits = reallocarray(info->rasterBits, newRasterSize, sizeof(GifPixelType));
                        ...
                    }
    }while (RecordType != TERMINATE_RECORD_TYPE);
}

다음 형식을 가진 GIF 이미지는 충돌을 일으킵니다:

  • 유효한 이미지(10 x 10)
  • 잘못된 이미지 설명자가 있는 더 큰 이미지(10000 x 10000)

충돌로 이어지는 단계

  1. 파싱 단계
    1. 첫 번째 이미지(작은) 파싱
    2. (작은 높이 * 작은 너비) 크기의 rasterBits 버퍼 할당
    3. 두 번째 이미지(큰) 파싱
    4. DGifSetupDecompress/DGifGetImageDesc가 GIF_ERROR 반환
    5. 재할당 건너뛰기
  2. 렌더링 단계
    1. 첫 번째 이미지 렌더링(성공)
    2. 두 번째 이미지 렌더링(OOB)
도구 다운로드