Security trend

We will deliver the up-to-date security information timely.

[보안동향] CVE-2019-18634 Sudo Pwfeedback Buffer Overflow

2020-02-26
  1. 개요

sudo 는 superuser do 의 약자로 일반 사용자가 superuser(root) 사용자의 권한을 빌려 명령어를

실행 시킬 수 있도록 하는 유닉스, 리눅스 시스템의 패키지 입니다. sudo의 pwfeedback 옵션은

user에게 입력한password를 “*”로 masking된 문자로 보여주는 기능으로 masking된 password를

user에게Rendering할 때 Buffer Overflow가 발생합니다.

 

  1. 취약한 버전

sudo < 1.8.31

 

  1. 취약점 설명 및 분석

Sudo의 pwfeedback 기능은 아래와 같이 사용자 입력한 password에 대해 masking 문자로 feedback 해줄 때 사용됩니다.

 

아래 password를 입력하는 로직은 아래와 같습니다. 먼저 read를 통해 stack에 1byte씩 입력을 받고 BSS영역에 복사해줍니다.

그리고 pwfeedback이 on되어있고 입력한 문자가 sudo_term_kill 혹은 sudo_term_erase문자이면 user에게 보여준 “*” 문자를

지우게 되어 있습니다.

위에서 보이듯 EOF를 알리는 \n, \r과 같은 문자는 while 조건인 left를 초기화 시키지 않기 때문에 overflow가 발생하지 않습니다.

하지만 sudo_term_kill 문자를 만나게 되면 left(==buf size)를 다시 초기화 시키기 때문에 overflow가 발생합니다.

 

sudo_term_kill 문자는 “\x00”인 null byte 이며 많은 입력 값과 해당 문자를 password로 넣어주게 되면 범위를 넘은 memory 접근으로

인해 sudo에 crash가 발생하는 것을 확인할 수 있습니다.

(stdin 통신 시 sudo_term_kill == “\x15”, tty 통신 시 sudo_term_kill ==”\x00”)

 

BSS based overflow기 때문에 직접 컨트롤할 수 있는 부분은 아래와 같은 전역 변수 영역 입니다.

해당 영역엔 buf, askpass, signo, user_details 와 같은 변수들이 존재합니다.

 

그 중 user_details은 sudo의 권한을 설정하는 구조체 변수입니다.

 

askpass 변수는 sudo_askpass() 함수에서 execl로 변수의 값을 실행시켜 줍니다.

 

askpass는 SUDO_ASKPASS 환경변수에서 값을 가져오고 flags 변수에 TGP_ASKPASS flag bit가 설정되어 있으면

sudo_askpass() 함수를 호출 합니다.

 

tgetpass() 함수가 호출될때 flags는 tgetpass_flags로부터 설정되는 것을 확인할 수 있습니다.

 

tgetpass_flags는 아래와 같이 정의되어 있습니다.

 

sudo_askpass()에서 execl을 호출하기 전 user_details의 uid, gid 값으로 권한을 설정하게 되므로 BSS overflow를 이용해

root권한으로 임의의 파일을 root 권한으로 실행시킬 수 있습니다.

 

  1. 위협요소

Pwfeedback 옵션이 활성화 되어 있을 때 공격자가 sudo를 사용하는 일반 사용자의 계정으로 비밀번호 없이 서버의 root 권한을 획득할 수 있습니다. 대부분의 Linux OS는 pwfeedback 옵션이 비활성화 되어 있지만 Linux Mint, Elementary OS와 같은 운영체제는 기본적으로 활성화 되어 있습니다.

 

  1. 대응방안

1) Sudo 최신 버전 업데이트 (sudo >= 1.8.31)

2) pwfeedback 옵션 비활성화

 

LIST