- 개요
sudo 는 superuser do 의 약자로 일반 사용자가 superuser(root) 사용자의 권한을 빌려 명령어를
실행 시킬 수 있도록 하는 유닉스, 리눅스 시스템의 패키지 입니다. sudo 설정 파일에 등록된 일반 사용자에게
root 권한을 제한했을 때 signed 값 혹은 integer overflow를 이용해 root 권한으로 명령어를 실행 시킬 수 있습니다.
- 취약한 버전
sudo < 1.8.28
- 취약점 설명 및 분석
Runas는 Run as a user의 뜻으로 Runas specification은 사용자로 명령을 실행할 수 있는 사양을 뜻합니다.
즉, sudo -u#uid [command] 와 같이 sudo를 이용해 다른 사용자의 권한을 사용할 때 그 사용자를 Runas user라고 칭합니다.
tester 계정을 sudoers 파일에 root 권한은 제외하고 등록합니다.
tester 사용자는 등록해놓은 대로 다른 사용자의 권한을 사용할 수 있지만 root 권한은 사용할 수 없습니다.
아래와 같이sudo -u 옵션을 이용해 root 권한으로 명령어를 실행시킬 수 있습니다.
setresuid 시스템 콜은 sudo 명령을 실행하기 전 사용자의 uid를 재정의 하기 위해 사용됩니다.
사용자 uid 가 -1 혹은 4294967295(unsigned -1)로 지정했을 때 사용자 uid 값을 변경하지 않습니다.
sudo 자체가 uid 0으로 실행되기 때문에 uid가 재정의 되지 않아 그대로 uid 0의 권한으로 명령어를 실행시킬 수 있습니다.
아래와 같이 auth log에도 uid 0이 아닌 -1 혹은 4294967295인 것을 확인할 수 있습니다.
위와 같은 uid는 root 권한으로 실행되지만 log에 보이듯이 0 값이 아니므로
PAM(Linux Pluggable Authentication Modules)모듈이 동작하지 않습니다.
일반적으로 sudo를 이용해서 명령어를 실행할 때 아래와 같이 PAM 세션 모듈이 작동하며 PAM에 정의된 설정으로 권한 제한을 합니다.
즉, 해당 취약점을 이용해 sudo를 실행시키면 권한 제한에 걸리지 않습니다.
- 위협요소
공격자가 sudo를 사용하는 일반 사용자의 계정으로 서버의 root 권한을 획득할 수 있습니다.
- 대응방안
1) Sudo 최신 버전 업데이트