[하루한줄] CVE-2025-32463 : sudo의 chroot를 이용한 Local Privilege Escalation
URL
Target
- sudo v1.9.14 ~ v1.9.17
Explain
CVE-2025-32463는 sudo의 chroot 옵션을 이용한 로컬 권한 상승(LPE, Local Privilege Ecalation) 취약점입니다.
취약한 버전의 Sudo에서 -R
(--chroot
) 옵션 사용 시 경로 처리 방식 개선을 위해 추가된 pivot.c
코드가 업데이트 되며 발생했습니다.
// sudoers.c
/* Pivot root. */
if (runchroot != NULL) {
if (!pivot_root(runchroot, &pivot_state))
goto error;
}
ret = resolve_cmnd(ctx, cmnd_in, &cmnd_out, path);
...
/* Restore root. */
if (runchroot != NULL)
(void)unpivot_root(&pivot_state);
debug_return_int(ret);
error:
if (runchroot != NULL)
(void)unpivot_root(&pivot_state);
free(cmnd_out);
debug_return_int(NOT_FOUND_ERROR);
sudoers.c
에서 코드 흐름은 아래와 같습니다.
pivot_root
함수에서 chroot 수행resolve_cmnd
함수에서 명령어 매칭 및 경로 탐색 수행unpivot_root
를 통해 원래 루트 경로로 chroot 복구
취약점은 pivot_root
와 unpivot_root
가 실행되는 사이에 발생합니다. resolve_cmnd
함수에서 NSS API이 호출되며 pivot_root
를 통해 루트 권한으로 로드된 공격자의 임의 파일(/etc/nsswitch.conf
)을 읽고 nss_database 관련 정보가 갱신되게 됩니다. 갱신된 nss_database 정보로 sudoers policy를 평가하기 때문에 로컬 권한 상승이 가능해집니다.
Patched Code
ret = resolve_cmnd(ctx, cmnd_in, &cmnd_out, path, runchroot);
...
debug_return_int(ret);
error:
free(cmnd_out);
debug_return_int(NOT_FOUND_ERROR);
현재 sudo v1.9.17.p1 에서는 취약점과 관련된 pivot.c
, pivot.h
를 제거하고 resolve_cmnd
에서 chroot를 처리하도록 변경되었으며 보안상의 복잡성을 이유로 이후 버전에서는 chroot 기능을 제공하지 않는다고 밝혔습니다.
Reference
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.