Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
sudotimewarp-cve-2026-96512- — CVE-2026-96512(SudoTimeWarp)에 대한 재현 및 PoC 스크립트로, 호출자의 TZ가 sudoers의 NOTBEFORE/NOTAFTER 윈도우를 이동시키는 문제와 완화 조치 확인을 다룹니다. | Kitploit
도구/GitHubGitHub/ermensonx/sudotimewarp-cve-2026-96512-
Defensive ToolsPrivilege EscalationVulnerability AnalysisExploitationConfiguration AuditingPenetration TestingLearning & Education
GitHub

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
ermensonx/sudotimewarp-cve-2026-96512-

sudotimewarp-cve-2026-96512-

CVE-2026-96512(SudoTimeWarp)에 대한 재현 및 PoC 스크립트로, 호출자의 TZ가 sudoers의 NOTBEFORE/NOTAFTER 윈도우를 이동시키는 문제와 완화 조치 확인을 다룹니다.

저장소 보기
22시간 59분 전아직 검토되지 않음

SudoTimeWarp — CVE-2026-96512

sudo: 호출자의 TZ가 NOTBEFORE/NOTAFTER를 결정한다

SudoTimeWarp(CVE-2026-96512)의 재현 자료. Date_Spec 타임스탬프에서 끝의 Z를 생략한 sudoers 규칙은 mktime()에 의해 변환되는데, 이 함수는 호출될 때마다 getenv("TZ")를 다시 읽는다. sudo는 setuid-root이고 호출자의 environ이 execve()를 거쳐 그대로 전달되므로, 비특권 호출자가 자신의 유효 기간이 평가되는 시간대를 선택할 수 있다.

이름SudoTimeWarp
CVECVE-2026-96512
CVSS v3.1AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H — 7.8 High
CWECWE-863 (등록됨); 메커니즘은 CWE-807
영향받는 버전sudo 1.8.20부터 1.9.17p2까지, 그리고 1820a349 이전의 main
수정된 버전1820a349 (2026-08-29)
이동량방향당 최대 24시간 59분 59초; 전체 구간 49시간 59분 58초

이것이 실제로 무엇인가

근본 문제 — TZ가 NOTBEFORE/NOTAFTER에 영향을 준다는 것 — 는 Tencent Xuanwu Lab의 XlabAI Team, Atuin Automated Vulnerability Discovery Engine, 그리고 Guannan Wang, Zhanpeng Liu, Guancheng Li에 의해 비공개로 보고되었으며, 커밋 db669167c (2026-03-14)에 기여자로 명시되었다.

SudoTimeWarp (CVE-2026-96512)는 db669167c가 불완전하다는 발견이다. 이 커밋이 설치한 보호는 glibc의 시간대 캐시 — 그리고 그에 따른 로그 타임스탬프 — 를 커버하지만, 권한 부여가 결정되는 gentime.c:156의 mktime()에는 도달하지 못한다. 해당 커밋이 이미 포함된 트리에서도 윈도우 이동은 완전히 재현된다. 메인테이너는 1820a349의 메시지에서 이 점을 기록한다:

이전 변경은 "mktime() 함수가 호출될 때마다 TZ 환경 변수를 다시 읽기 때문에 효과가 없었다"

전제 조건

다음을 만족하는 sudoers 규칙: (1) 호출자에게 명령을 부여하고, (2) NOTBEFORE= 또는 NOTAFTER=를 포함하며, (3) 타임스탬프를 Z 접미사 없이 그리고 명시적 오프셋 없이 작성한다.

(3)번 항목은 이례적이지 않다: sudoers 매뉴얼은 접미사 없는 형식을 지원되는 확장으로 문서화하고, 네 가지 예시 타임스탬프 중 하나로 20151201235900을 제시하며(docs/sudoers.man.in:1820), 이 형식은 프로젝트 자체의 회귀 테스트 코퍼스(plugins/sudoers/regress/testsudoers/test13.sh)에도 등장한다.

실행하기

항상 일회용 컨테이너나 VM에서. 여기의 모든 스크립트는 /etc/sudoers를 재작성한다. 백업하고 복원하지만, 실수하면 실제 머신에서 잠겨버릴 수 있다 — 스크립트는 --i-know를 전달하지 않으면 컨테이너 외부에서 실행을 거부한다.

root@kitploit:~
docker build -t sudotimewarp .
docker run --rm -it sudotimewarp

또는 이미지를 빌드하지 않고:

root@kitploit:~
docker run --rm -it -v "$PWD:/m" debian:trixie bash -c \
  'apt-get update >/dev/null && apt-get install -y sudo >/dev/null && bash /m/poc.sh'

영향받는 빌드에서의 예상 출력:

root@kitploit:~
=== probes ===
  rule valid,   no TZ      : uid=0(root) gid=0(root) groups=0(root)
  rule expired, no TZ      : sudo: a password is required
  rule expired, TZ=UTC     : sudo: a password is required
  rule expired, TZ=XXX24   : uid=0(root) gid=0(root) groups=0(root)
  expired + 'Z', TZ=XXX24  : sudo: a password is required

XXX는 임의의 세 글자 시간대 약어이고 24는 POSIX 오프셋이다. 어떤 파일도 관여하지 않으며 존재할 필요도 없다 — 악용 가능한 채널은 인라인 POSIX 문자열뿐이다. tzfile 형식(TZ=:/tmp/evil.tz 및 변형)은 setuid 하에서 glibc의 __libc_enable_secure 가드에 의해 거부되며 정확히 0초의 이동만 측정되는데, 이것이 이 문제를 CVE-2014-9680과 구분짓는 점이다.

프로브 읽기

1–3번 줄은 대조군이며, 이는 중요하다: 파싱 오류도 버그와 동일한 ALLOW를 만들어낼 것이기 때문이다.

poc.sh는 영향받으면 0, 그렇지 않으면 1, 대조군이 성립하지 않으면 2로 종료한다.

두 부분으로 나뉜 버전

poc.sh는 비대화식으로 실행되기 위해 NOPASSWD를 사용한다. 그것은 버그의 조건이 아니다. 분리된 스크립트는 권한 경계를 명시적으로 보여준다 — 1부는 관리자가 정당하게 하는 일만 수행하고, 2부는 비특권 사용자로 실행되며 어떤 종류의 권한도 사용하지 않는다:

root@kitploit:~
bash repro-admin.sh escalation        # as root: writes the policy
su - poc -c 'bash /poc/repro-attacker.sh'
bash repro-admin.sh --cleanup

repro-admin.sh는 네 가지 시나리오를 받는다:

비밀번호를 요구하는 규칙의 경우 호출자는 여전히 PAM을 통해 인증하며, 잘못된 비밀번호는 여전히 실패한다. 이것은 인증 우회가 아니다 — 이동하는 것은 권한 부여 결정이다.

범위

  • 인증 우회가 아니다. PAM은 계속 비밀번호를 요구하고 검증한다.
  • 무권한 상태에서의 권한 상승이 아니다. sudoers 규칙이 없는 사용자는 아무것도 얻지 못한다; 이 버그는 이미 존재하던 부여를 복원한다. 따라서 PR:N이 아니라 PR:L이다.
  • 시간적으로 무한하지 않다. 몇 주 전에 만료된 규칙은 도달할 수 없다. 측정 결과: 만료 후 4일이 지나면 두 최대 TZ 값 모두 거부한다.
  • 날짜 지정 규칙이 탈출 불가능한 단일 명령을 부여하는 경우, 영향은 그 부여에 의해 제한된다(대략 C:L/I:N/A:N). 7.8 벡터는 날짜 지정 규칙이 호출자의 영구적 접근보다 광범위한 경우를 평가한다.

약 25시간의 한계는 접근 윈도우에 적용되며, 영향의 지속 시간에는 적용되지 않는다: 그 안에서 한 번의 성공적인 사용이면 윈도우보다 오래 지속되는 지속성을 확립하기에 충분하다.

업그레이드 없이 완화하기

모든 NOTBEFORE/NOTAFTER 타임스탬프에 Z를 추가하라 — 그러면 timegm() 분기가 강제된다.

root@kitploit:~
grep -rE 'NOT(BEFORE|AFTER)=' /etc/sudoers /etc/sudoers.d/

sudo -l로 감사하지 말라. 이는 모든 Date_Spec을 gmtime()을 통해 포맷하고 항상 Z를 덧붙이므로(plugins/sudoers/display.c:229), NOTAFTER=20260827221423으로 작성된 규칙은 NOTAFTER=20260827221423Z로 표시된다. 출력은 결정적인 바로 그 세부 사항을 정규화하여 없애버린다. cvtsudoers와 fmtsudoers도 같은 방식으로 동작한다. /etc/sudoers를 직접 읽어라.

참고 자료

  • Red Hat (CNA): https://access.redhat.com/security/cve/CVE-2026-96512
  • 수정 커밋 1820a349: https://github.com/sudo-project/sudo/commit/1820a349687522f51023d1ae5925125f59679a8c
  • oss-security: http://www.openwall.com/lists/oss-security/2026/09/24/4
  • CVE Program: https://www.cve.org/CVERecord?id=CVE-2026-96512

공개

2026-08-28에 메인테이너에게 보고되었으며, 기한은 없었다. 같은 날 후보 패치가 돌아왔고; 공개 수정은 2026-08-29에 반영되었다. CVE는 CNA-LR 역할을 하는 Red Hat에 의해 할당되었고 2026-09-23에 공개되었다. 엠바고는 없다: 여기의 모든 내용은 수정 커밋 이후 공개되어 왔다.

크레딧

SudoTimeWarp / CVE-2026-96512: Ermenson Junior, 독립 연구, Red Hat에 의해 "Independent security research"로 기록됨. 근본 문제의 원래 보고는 Tencent Xuanwu Lab의 XlabAI Team, Atuin Automated Vulnerability Discovery Engine, 그리고 Guannan Wang, Zhanpeng Liu, Guancheng Li에게 있다.

방어적 목적으로 공개됨: 호스트가 영향을 받는지 확인하고, Z 완화책을 검증하기 위함.

도구 다운로드
줄확인 내용
1규칙이 유효 기간 내에서 작동하는지
24번 줄이 없을 때의 거부가 실제로 NOTAFTER에서 비롯되는지
3TZ 설정 자체가 원인이 아닌지 — TZ=UTC는 TZ가 없을 때와 동일하게 결정한다
4버그: 만료된 규칙이 root로 실행됨
5경계: 문서화된 Z가 있으면 timegm() 분기가 선택되어 실패한다
시나리오정책
expired (기본값)규칙 하나, NOTAFTER가 한 시간 전, 시간대 없음
valid동일한 규칙이 아직 유효 기간 내 — 대조군
expired-z문서화된 Z가 있는 동일한 만료 규칙 — 대조군, 영향받지 않는 형식
escalation좁은 영구 부여와 만료된 광범위 부여 — 유지보수나 비상용(break-glass) 부여가 실제로 취하는 형태