CVE-2021-3156 분석.

발행: (2026년 2월 22일 오후 02:54 GMT+9)
5 분 소요
원문: Dev.to

Source: Dev.to

Background

지난 주에 나는 익스플로잇과 익스플로잇 분석에 대해 더 배우기로 했습니다. 2021년에 발표된 CVE‑2021‑3156 sudo 취약점을 조사하기로 선택했는데, 이 취약점은 이미 패치된 상태입니다. 취약점을 재현하는 과정에서 여러 어려움이 있었습니다:

  • 2021년 이전 버전의 sudo가 포함된 환경을 구축하기.
  • 바이너리가 아직 패치되지 않았는지 확인하기.
  • 힙 오버플로우를 트리거하기 (Docker 환경에서 힙 레이아웃 차이로 인해 전체 코드 실행을 달성하지 못함).

Vulnerability Details

CVE‑2021‑3156은 sudo에 존재하는 힙 기반 버퍼 오버플로우입니다. 이 취약점을 이용하면 할당된 버퍼의 경계를 넘어 데이터를 기록할 수 있어 힙에 인접한 메모리를 손상시킬 수 있습니다.

공격은 glibc의 Name Service Switch (NSS) 시스템에 있는 service_user 구조체를 대상으로 합니다. 이 구조체에는 사용자와 그룹 조회에 사용되는 함수 포인터가 들어 있습니다. 버퍼를 오버플로우하면 공격자는 이 함수 포인터들을 덮어쓰고, 자신이 제어하는 코드로 리다이렉트할 수 있습니다.

sudo가 NSS 함수(예: 사용자 정보를 조회하는 getpwnam_r() )를 호출하면, 손상된 함수 포인터를 따라가 공격자의 코드를 실행합니다. sudo가 루트 권한으로 실행되기 때문에, 삽입된 코드는 그 권한을 그대로 상속받아 루트 쉘을 얻을 수 있습니다.

Exploit Setup

  1. 가상 머신을 이용한 초기 시도 – UTM 가상화 애플리케이션에서 Ubuntu 18.04를 실행해 보았습니다. 오래된 Ubuntu 이미지가 문제를 일으켰습니다: 설치가 반복적으로 크래시가 발생했고, 라이브 이미지조차 실행되지 않았습니다. 그래서 이 방법을 포기했습니다.

  2. Docker 컨테이너 – Ubuntu 18.04 기반 Docker 컨테이너로 전환했으며, 내 머신에서 정상적으로 실행되었습니다. 그러나 익스플로잇을 시도했을 때 sudo가 사용법 오류를 반환했는데, 이는 바이너리가 업데이트되었음을 의미했습니다. 바이너리의 타임스탬프를 확인해 보니 2023년에 컴파일된 것이었으며, 패치가 적용된 지 2년이 지난 것이었습니다.

  3. 취약한 sudo 설치 – Docker 인스턴스 안에서 오래된 sudo 버전을 다운로드하고 설치한 뒤, 해당 위치에서 직접 실행했습니다. 이를 통해 취약한 sudo 바이너리에서 메모리 접근 오류를 유발할 수 있었습니다.

Attempted Exploitation

공개된 익스플로잇 스크립트를 다운로드하고 루트 권한 획득을 시도했습니다. 스크립트는 기본 sudo 바이너리 위치를 가정하고 있었기 때문에 여러 차례 실패했습니다. 새로 설치한 sudo에 대한 심볼릭 링크를 만들면 힙 오버플로우 시도를 실행할 수 있었지만, 루트 권한을 얻지는 못했습니다.

여러 개의 청크 크기를 실험해 보았지만 익스플로잇은 여전히 성공하지 못했습니다. Docker가 힙 메모리를 일반적인 Ubuntu 설치와 크게 다르게 배치하기 때문에, 이 환경에서는 익스플로잇을 구현하기가 더 어려운 것으로 추정됩니다.

0 조회
Back to Blog

관련 글

더 보기 »