[하루한줄] 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 에서 코드 흐름은 아래와 같습니다.

  1. pivot_root 함수에서 chroot 수행
  2. resolve_cmnd 함수에서 명령어 매칭 및 경로 탐색 수행
  3. unpivot_root를 통해 원래 루트 경로로 chroot 복구

취약점은 pivot_rootunpivot_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