Projects / sudo 취약점 탐색과 N-day 분석
sudo 취약점 탐색과 N-day 분석
- 유형
- 프로젝트
- 분야
- 시스템
- 상태
- 완료
- 기간
- 2025.12 — 2026.02
- 역할
- 취약점 분석
- 종류
- 프로젝트
두 달 동안 sudo에서 새 취약점을 찾는 팀 프로젝트였습니다. 퍼징과 코드 분석으로 시작했다가, 과거 취약점부터 이해하는 방향으로 바꿔 CVE-2023-22809를 맡아 분석했습니다.
ANALYSIS
왜 시작했나
리버싱을 하다가 시스템 해킹에 관심이 생겼습니다. 실제로 많이 쓰는 프로그램에서 취약점이 어떻게 생기는지 보고 싶어서,
2025년 12월 말부터 두 달 동안 팀원들과 sudo에서 새 취약점을 찾는 프로젝트를 했습니다.
sudo는 일반 사용자가 root 권한으로 명령을 실행하게 해 주는 프로그램이라, 작은 실수도 권한 상승으로 이어집니다.
처음 시도
- 퍼저를 고르고, sudo 소스의 call graph와
sudo.c의 main 흐름부터 정리했습니다. - 팀에서 AFL++로 sudoers 파서(
visudo)를 퍼징했습니다. 기존 테스트 파일과 직접 만든 시드(정수 오버플로, 긴 문자열, 경로 조작 등)를 나눠 돌리고,
크래시가 나면 ASan으로 다시 실행해 디스코드로 알림이 오게 했습니다.
막힌 곳
코드를 처음부터 읽기 시작했지만, 어디가 위험한지 판단할 기준이 없었습니다. 기준이 없으니 모든 함수가 비슷해 보였습니다.
방향 전환: N-day부터
그래서 sudo에서 이미 터졌던 취약점이 어디서, 왜 생겼는지부터 보기로 했습니다.
팀원마다 CVE를 하나씩 맡아 Docker로 취약한 버전을 띄우고, 원인과 패치를 분석했습니다.
팀에서 함께 본 CVE는 CVE-2019-14287, CVE-2019-18634, CVE-2021-23240, CVE-2025-32463, CVE-2023-22809입니다.
제가 맡은 것: CVE-2023-22809
sudoedit는 허용된 파일을 root 권한으로 잠깐 편집하게 해 주는 기능입니다.
편집기는 SUDO_EDITOR, VISUAL, EDITOR 환경 변수로 사용자가 고를 수 있습니다.
- 영향 버전: sudo 1.8.0 ~ 1.9.12
- 원인: 편집기 문자열에서
--뒤에 오는 값을 "편집할 파일"로 해석하는데, 사용자가 넣은--를 걸러내지 않았습니다. - 흐름:
sudoers_policy_main→ 정책 검사(sudoers_lookup) →find_editor→resolve_editor에서--뒤를 파일 이름으로 처리
# /tmp/rootDir/Insight 는 sudoedit로 편집이 허용된 파일
EDITOR="vim -- /etc/passwd" sudoedit /tmp/rootDir/Insight
허용되지 않은 /etc/passwd까지 편집 대상이 되어, 백도어 계정을 추가할 수 있습니다.
공격 시나리오는 sudoers에 등록된 계정 탈취 → 이 취약점으로 /etc/passwd 수정 → 백도어 계정으로 장악 순서로 정리했습니다.
패치는 편집기 문자열에 --가 들어 있으면 거부하는 방식이었습니다.
팀에서 같이 본 것: CVE-2025-32463
sudo -R(chroot 옵션)을 처리할 때 사용자가 만든 디렉터리 안의 nsswitch.conf를 읽어 버리는 문제입니다.
그 파일이 가리키는 공유 라이브러리가 root 권한으로 로드되면서 일반 사용자가 root를 얻습니다. 위 그림이 PoC에서 쓰는 nsswitch.conf입니다.
FINDINGS
배운 것
취약점이 무엇인지보다 왜 생겼는지를 먼저 봐야 다음에 비슷한 걸 알아볼 수 있었습니다.
22809는 "사용자 입력 안의 구분자를 검사하지 않았다"는 문제였습니다.
N-day 분석 뒤에는 팀에서 입력이 들어오는 순서대로 sudo 코드를 다시 읽는 방식으로 분석을 이어갔습니다.