보안정보

전문화된 보안 관련 자료, 보안 트렌드를 엿볼 수 있는
차세대 통합보안관리 기업 이글루코퍼레이션 보안정보입니다.

Sudo 취약점 분석 및 대응방안 part.1

2021.05.04

23,375


 

 

 

 

01. 개요

 

2020년 한해, 코로나19라는 전세계적인 감염병의 확산으로 인한 산업 패러다임의 변화는 사이버 공격에도 많은 영향을 미쳤다. 국가기관 사칭 및 코로나19 관련 이슈를 이용한 피싱공격을 시작으로 이랜드 랜섬웨어 사건, 공급망(Supply Chain)공격을 유발한 솔라윈즈(SolarWinds)사태까지, 공격의 범위와 방식의 종횡적 확장이 이루어진 한 해 라고 볼 수 있다.

 

비대면 환경의 증가로 인한 공격면(Attack Surface)의 증가는 이메일이나 홈페이지 등을 이용해 내부망에 침투하여 2차적인 피해를 야기하는 공격을 만들어 냈다. 때문에 공격자의 공격행위, 특성, 기법 등에 대한 분석을 통해 공격을 인지하고 대응하는 체계적인 프로세스의 중요성이 날로 높아지고 있다. 이러한 흐름은 공격자들의 특성을 분석하여 제작된 '사이버 공격 라이프 사이클(Cyber Attack LifeCycle)'을 대응전략에 이용하는 연구를 활발하게 만들었다.

 

 

 

[그림 1]  Cyber Attack LifeCycle (출처 : MITRE)

 

 

사이버 공격 라이프사이클 중에서도 권한상승(Privilege Escalation)공격은 2차 피해를 유발시키는 전환점이 되는 공격이다. 일반적으로 중요 자산은 네트워크 구성 환경에서도 내부망 환경에서 운용된다. 이러한 중요 자산 접근이 공격의 범위를 좌우 할 수 있기 때문에 외부망에서의 접근 권한을 획득한 공격자는 공격 효과를 극대화 하기 위해서 내부망으로의 접근이 요구된다. 결국 Critical한 피해를 입히기 위해서는 더 많은 권한이 필요하게 되어, 공격자는 중요 권한 사용자 및 타깃을 확보하는 측면이동(Lateral Movement)과 권한상승 공격을 통해 주요 권한을 획득을 시도하게 된다.

 

 

공격자의 공격 매커니즘을 정리한 기준으로 'MITRE ATT&CK Matrix'가 활용되고 있다.

MITRE ATT&CK에서는 공격의 라이프 사이클의 각 부분을 전술(Tactics)로 나누고 각 전술별로 자주 이용되는  공격 Technique을 Matrix로 정의했다. 이 중 권한 상승 전술에는 다음과 같이 12가지 Technique을 포함하고 있다.

 

 

No

Technique

Description

1

Abuse Elevation Control Mechanism

권한을 제어하는 메커니즘을 우회하여 상위 권한을 획득

2

Access Token Manipulation

Windows에서 실행중인 프로세스의 소유권을 확인하는 액세스 토큰을 조작하여 상위 권한을 획득

3

Boot or logon Autostart Execution

부팅/로그인 시 특정 프로그램을 자동으로 실행하도록 시스템 설정을 조작하여 상위 권한을 획득

4

Boot or logon Initialization Scripts

부팅/로그인 초기화 시 자동으로 실행되는 초기화 스크립트를 이용한 상위 권한을 획득

5

Create or Modify System Process

시스템 프로세스가 주로 관리자 권한으로 생성되지만 root/SYSTEM 권한으로 실행되는 점을 이용한 권한 획득 기법

6

Domain Policy Modification

도메인 구성 설정을 수집하여 정책을 우회하여 도메인 환경에서 상위 권한을 획득

7

Event Triggered Execution

더 높은 권한이 요구되는 특정 이벤트의 실행을 유발하는 메커니즘을 이용하여 상위 권한을 획득

8

Exploitation for Privilege Escalation

기존 프로그램의 취약점 혹은 시스템 권한을 상승시키는 악성 프로그램을 이용하여 상위 권한을 획득

9

Hijack Executor Flow

운영체제가 프로그램을 실행하는 흐름을 가로채 악성 페이로드를 실행 및 삽입하여 상위 권한을 획득

10

Process Injection

정상 프로세스의 주소 공간에 임의의 코드를 주입 및 실행하여 보안 탐지를 우회해 상위 권한을 획득

11

Scheduled Task/Job

작업 스케줄링 기능을 악용하여 악성 프로세스 실행을 예약시켜 상위 권한을 획득

12

Valid Accounts

유효한 계정의 자격 증명을 얻어 초기 액세스를 유지하고 이를 이용해 지속적으로 데이터를 수집하여 상위 권한을 획득

 

[표 1]  권한 상승(Privilege Escalation) 전술에 이용되는 Techniques 목록 (출처 : MITRE ATT&CK for Enterprise)

 

 

시스템 매커니즘의 취약점을 이용해 상위 권한을 획득하는 ‘Control Mechanism Technique’은 4개의 Sub-Technique; △SetUID/SetGID 조작, △UAC(User Access Control) 우회, △자격증명 API AuthorizationExecuteWithPrivileges 활용, △sudo 유틸리티로 분류된다. 이 4가지 Sub-Technique 중 sudo 유틸리티를 이용한 권한 상승 취약점은 성공 시 영향도가 높아 이에 대해 심층적으로 분석해보고자 한다.

 

 

sudo는 관리자가 sudoers 파일에 나열된 일반 사용자에게 제한된 슈퍼유저로서의 권한을 부여하여 시스템을 이용할 수 있게 해주는 유닉스/리눅스 기반 운영체제의 시스템 유틸리티이다. 관리자 권한에 접근을 제공하는 유틸리티이기 때문에 sudo 유틸리티는 지속적으로 공격자들의 권한 상승 수단으로서 이용되었고 여러 취약점들이 발견되어왔다.

 

2021년 1월에 발표된 CVE-2021-3156은 약 10년 전 버전의 sudo 유틸리티에서부터 존재해온 취약점으로, 패치 이전 모든 버전의 sudo에 존재한다고 확인됐다. 기본적으로 sudo는 사용자 암호 및 root 암호에 대한 검증이 존재하는데 해당 취약점에서는 버퍼 오버플로우를 이용해 이를 우회할 수 있어 CVSS 점수 7.8에 달하는 위험 취약점으로 분류되었다. 2019년 발견된 CVE-2019-14287은 UID 값을 변경하여 sudo 사용자 제한을 우회할 수 있어 CVSS 점수 8.8로 분류되었다.

 

이와 같이 최근 5년간 sudo와 관련된 CVE가 53건이 발표됐으며 이 중 위험 등급 High 이상을 받은 CVE는 46건이다. 이와 같은 위험 등급 sudo 관련 취약점의 보안패치 미비 및 대응 부재시에 시스템에 미칠 영향이 얼마나 높은지 알 수 있는 지표라고 할 수 있다.

 

 

[그림 2] sudo 관련 CVE 통계 (출처 : CVE List)

 

 

02. 취약점 분석 (1) : CVE-2019-14287

 

1) 취약점 소개

 

CVE-2019-14287은 2019년 10월 Apple Information Security Team의 Joe Vennix가 발견했으며, 이 취약점은 일반 사용자에게 sudo를 허용하지 않는 정책이 적용된 시스템에서 이를 우회하여 루트 권한을 획득할 수 있다. sudo 유틸리티를 사용하는 거의 모든 리눅스/유닉스 환경에서 exploit이 가능하다.

 

 

No

CVE

Description

1

CVE-2015-5602

sudoeit에 입력하는 파일 경로에 와일드카드 문자(*)를 사용하여 상위 권한의 파일 수정

2

CVE-2016-7076

wordexp 함수에 특정 인자를 사용하는 응용 프로그램을 실행하여 noexec 제한 옵션이 존재하는 sudo를 우회하여 상위 권한 획득

3

CVE-2017-1000367

SELinux 모듈이 활성화된 시스템에서 유효성 검증 미흡으로 제한된 권한의 sudoer가 완전한 root 권한 취득

4

CVE-2019-14287

-u 옵션의 입력값 검증이 미흡한 취약점을 이용하여 명령어를 실행해 상위 권한 획득

5

CVE-2019-18634

pwfeedback 옵션이 활성화된 sudo 프로세스에서 비밀번호 입력값에 오버 플로우를 일으켜 상위 권한 획득

6

CVE-2021-3156

sudo에 백슬래시 문자에 대한 버퍼 오버플로우가 존재하여 이를 이용해 root 권한 획득

 

[표 3] CVE-2019-14287 소개

 

 

2) 취약점 상세 분석

 

시스템 관리자는 sudo 유틸리티에 대한 보안 정책으로 /etc/sudoers 파일을 수정하여 허용된 사용자만 명령어를 사용하도록 할 수 있다. sudoers 설정은 유저/그룹명(%group name), 호스트, 명령어로 구성되어 있으며, 특정 유저(그룹)이 sudo를 이용해 사용할 수 있는 명령어, 또는 어떠한 유저(그룹)의 권한 등을 명시하여 제한할 수 있다. 아래의 예시같은 경우에는 ALL 호스트에서 접속한 igloo라는 계정이 sudo명령어를 사용했을때 root를 제외한 모든 계정의 이름으로  vi 프로그램을 패스워드 없이 이용할 수 있다고 해석될 수 있다.

 

 

 

[그림 3] /etc/sudoers 정책 설정 예

 

 

/etc/sudoers에 설정된 특정 사용자로 sudo 명령어를 사용할 때 –­u 옵션은 사용자 명 또는 UID 값을 인자로 사용하게 된다. 1.8.28 버전 이하의 sudo 유틸리티에는 UID를 인자값으로 음수 혹은 정수의 최대값을 입력받을때 검증이 미흡하여 CVE-2019-14287 취약점 익스플로잇이 가능하다. 

 

strace 명령어를 이용하여 sudo –u 옵션에 -1 인자값을 주었을 때 발생하는 반응을 살펴보면 아래와 같이 setreuid() 함수가 사용된 것이 확인됐다. setreuid 함수는 3가지 UID(ruid, euid, suid)를 인자값으로 받아 변경하는 함수이다.

 

 

 

[그림 4] sudo 반응 추적

 

 

해당 취약점에서 발생한 setresuid(4294967295, 4294967295, 4294967295) 테스트 결과 아래와 같이 UID가 0(root)으로 변경된 것을 확인할 수 있다.

 

 

[그림 5] setreuid 테스트 코드

 

 

이 취약점에 대해 sudo 개발팀은 보안 패치 버전을 배포하였다. 패치내용은 크게 다를 것 없이 [sudo 경로]/lib/stroid.h의 코드만이 수정되었다. /lib/stroid.h에서 stroll 함수를 통해 입력된 문자열(p)를 long long 정수형으로 변환한다.

 

삭제된 2.56:2.61 라인을 살펴보면 입력 문자열(p)과 ep(end pointer)가 같지 않을 경우에만 유효한 값으로 인정되어 에러가 일어나지 않게된다. p와 ep가 같은 경우(인자값에 아무것도 입력되지 않음)에는 2.68라인의 if문에 적용되어 2.78:2.81라인의 에러를 출력하거 종료된다.

 

즉, 어디에도 음수값과 정수 최대값이 입력됐을 경우에 대한 에러 처리는 존재하지 않았고 것을 확인해. 이에 2.77라인이 추가되어 음수와 정수 최대값 입력 시 유효하지 않은 값으로 인식하여 에러가 발생하도록 패치되었다.

 

 

[그림 6] 보안 패치 내용 (출처 : sudo.ws)

 

 

3) 공격 시연

 

공격자 A는 계정 igloo로 서버 접속에 성공했다. 하지만 시스템 관리자가 sudo에 대한 보안 정책으로 igloo 계정에게 sudo 권한을 제한적 허용하도록 설정하여 A가 획득한 igloo 권한으로는 서버에 직접적인 피해를 입힐 수 있는 방법이 존재하지 않는다. 때문에 A는 CVE-2019-14287 취약점을 이용하여 root 권한을 획득하려 한다.

 

 

구분

환경 별 버전

Server OS

RHEL 7.2 (192.168.0.138)

Sudo Version

1.8.6p7

접속 계정

igloo

 

[표 4] 공격 시연 환경

 

 

 

 

[그림 7] 시스템에 설정된 sudoers 정책

 

 

(1) 상위 권한을 이용하기 위해 /bin/bash로 접속을 시도하지만 sudoers 정책에 의해 /bin/bash 실행 권한이 없는 igloo 계정은 에러 문구와 함께 쉘로의 접근이 불가능하다.

 

 

 

[그림 8] 시스템에 설정된 sudoers 정책

 

 

(2) sudo –V 명령어를 입력한 결과, 공격자 A는 침투한 시스템이 CVE-2019-14287 취약점이 존재하는 버전의 sudo를 사용하고 있다는 것을 확인했다.

 

 

 

[그림 9] 시스템에서 사용 중인 sudo 버전 확인

 

 

(3) sudo –u 옵션 인자값에 -1(or 4294967295)을 입력하여 예외를 발생 시켜 /bin/bash 를 실행하면 root 권한으로 쉘이 실행된 것을 확인할 수 있다. root 권한을 획득한 A는 시스템 설정을 임의로 변경/삭제, 2차 공격을 위한 악성 코드 삽입 및 실행이 가능하게 된다.

 

  

 

[그림 10] root로의 권한 상승 성공

 

 

02. 취약점 분석 (2) : CVE-2019-18634

 

1) 취약점 소개

 

이번에 소개할 CVE-2019-18634 취약점 또한 Apple Security Team의 Joe Vennix가 발견했으며, sudo에 pwfeedback 옵션이 활성화된 환경에서 sudo 명령어 입력시 비밀번호 입력 프롬 프트에 버퍼 오버플로우를 발생시켜 권한 상승을 일으킨다.

 

 

구분

취약한 버전

위험도

CVE-2019-18634

1.7.1 ~ 1.8.25p1 버전의 sudo 유틸리티를 사용하는 Linux/Unix

High (CVSS 7.8)

 

[표 5] CVE-2019-18634 소개

 

 

2) 취약점 상세 분석

 

sudo 명령어를 사용 시 시스템에서는 사용자의 비밀번호가 요구된다. sudo는 사용자가 접근한 터미널 내에서 비밀번호를 우선적으로 탐색하고, 해당 값이 터미널 내에 존재하지 않을 경우에 SUDO_ASKPASS 변수에 저장되어 있는 경로의 프로그램을 호출하여 사용자가 비밀번호를 입력할 수 있는 프롬프트를 제공한다.

 

 

[그림 11] sudo 실행 과정 Flow Chart

 

 

pwfeedback 옵션은 호출된 프롬프트에 시각적인 효과 (***)를 주는 옵션이다. 해당 옵션은 default로 비활성화가 되어 있지만 관리자가 편의를 위해 활성화 시킨 경우에 비밀번호 입력값에 버퍼 오버플로우가 가능해져 이 취약점에 노출된다.

 

  

 

[그림 12] pwfeedback 옵션이 적용된 sudoers 정책

 

 

3) PoC 분석

 

CVE-2019-18634 취약점은 다양한 언어로 작성된 10여 가지의 PoC가 존재한다. 그 중 Shell 스크립트로 작성된 PoC를 분석해봤다. 흐름을 살펴보면 socat을 통해 심볼릭 링크(/tmp/pty)를 생성해 slave 프로세스(sudo)와 양방향 통신을 연결한 후. 페이로드(/tmp/pty)를 실행시켜 버퍼 오버 플로우를 발생시킨다. 그 후 프로세스 디스크립터의 소유자 및 권한을 바꾸는 프로그램 (/tmp/pipe)을 구동하여 sudo 프로세스의 디스크립터를 root로 변환해 암호 입력 프롬프트를 우회한다.

 

 

 

[그림 13] PoC Exploit 과정 Flow Chart

 

 

버퍼 오버 플로우를 일으키는 페이로드(xpl.pl)는 perl 언어로 프로그래밍되어 있는데, 이를 살펴보면 수 많은 데이터를 출력하도록 되어 있어 perl 명령어로 이를 실행할 경우 버퍼 오버 플로우를 일으키게 된다.

 

 

[그림 14] 페이로드 소스 (xpl.pl)

 

 

프롬프트에 버퍼 오버 플로우가 일어나면 그 사이에 프로세스 디스크럽터를 수정하는 소스코드 (exec.c)가 실행된다. 이 과정에서 sudo 프로세스의 디스크럽터의 권한이 root로 바뀌어서 비밀번호 입력을 우회할 수 있게 된다.

 

  

[그림 15] 파일 디스크럽터 변경 소스 코드 (exec.c)

 

 

4) 공격 시연

 

공격자 A는 계정 igloo로 서버 접속에 성공했다. 하지만 시스템 관리자가 sudo에 대한 보안 정책으로 igloo 계정에게 sudo 권한을 제한적으로 설정하여 A가 갖고 있는 igloo 계정으로는 서버에 직접적인 피해를 입힐 수 있는 방법이 존재하지 않는다. 그러던 도중 A는 침투한 시스템의 sudo 유틸리티에 pwfeedback 옵션이 적용되어 있는 것을 확인했다. 이에 A는 CVE-2019-18634 취약점을 이용하여 비밀번호 입력값을 우회하여 root로 접근하려 한다.

 

 

구분

Details

Server OS

Ubuntu 16.04.2 (192.168.0.75)

Sudo Version

1.8.16

접속 계정

igloo

 

[표 6] 공격 시연 환경

 

 

(1) igloo 계정에 접근한 공격자 A는 root로의 권한 상승을 위해 시스템을 정찰하던 도중 sudo 명령어 시도시 비밀번호 입력값에 “*”이 찍히는 것으로 해당 시스템에 pwfeedback 옵션이 활성화 되어 있다는 것을 확인했다.

 

 

 

[그림 16] pwfeedback 옵션 활성화 확인

 

 

(2) sudo –V 명령어를 입력하여 시스템이 CVE-2019-18634 취약점이 존재하는 버전을 사용하고 있고, perl 명령어를 통해 비밀번호 입력값에 오버플로우가 발생하는 것을 확인했다.

 

 

 

[그림 17] CVE-2019-18634 취약점 존재 확인

 

 

(3) 공격자가 PoC 코드를 exploit 하면 wget을 통해 socat 명령어를 다운받아 sudo와 가상 터미널 간에 연결을 시도하고 페이로드를 실행해 오버플로우를 발생 시켜 root 권한 획득에 성공한다.

 

 

 

[그림 18] root로의 권한 상승 성공

 

 

03. 대응방안

 

1) Sudo 보안 패치 적용

 

이번 호에 소개한 취약점은 모두 보안 패치가 배포된 상태이다. [표 6]은 각 취약점이 존재하는 sudo의 버전과 패치의 릴리즈 날짜이다.

 

 

CVE

취약한 버전

패치일자

CVE-2019-14287

1.8.27 미만의 모든 버전

2019. 10. 10

CVE-2019-18634

1.7.1 ~ 1.8.30 버전

2020. 01. 29

 

[표 7] sudo 버전 정보

 

 

최신 버전의 sudo 설치하는 방법은 아래와 같다.

(1) sudo –V 명령어로 현재 시스템에 설치되어 있는 sudo 유틸리티의 버전을 확인할 수 있다

 

 

 

[그림 19] sudo -V실행 결과

 

 

(2) 패키지 저장소(repository) 목록에 원하는 버전의 sudo가 존재하는지 확인하여 설치

    - RedHat 계열(CentOS, RHEL, Fedora 등) : sudo yum install [패키지명]-[version]

    - Debian 계열(Ubuntu, Kali Linux 등) : sudo apt-get install [패키지명]=[version]

 

 

[그림 20] 패키지 저장소를 이용한 sudo 업데이트

 

 

2) pwfeedback 비활성화 (CVE-2019-18634)

 

CVE-2019-18634의 경우에는 sudo 유틸리티에 pwfeedback 옵션이 활성화된 경우에만 발생하는 취약점이기 때문에 sudoers 설정에서 해당 옵션을 비활성화 시켜도 충분히 예방이 가능하다

 

 

 

[그림 21] pwfeedback 옵션 비활성화

 

 

04. 참고자료

 

[1] MITRE ATT&CK MATRIX 

 - https://attack.mitre.org/matrices/enterprise/linux/

[2] Sudo 유틸리티 관련 취약점 통계

 - https://cve.mitre.org/

[3] CVE-2019-14287 (Linux sudo vulnerability) analysis

 - https://programmer.ink/think/cve-2019-14287-linux-sudo-vulnerability-analysis.html

[4] sudo patch (1) – CVE-2019-14287

 - https://www.sudo.ws/repos/sudo/rev/83db8dba09e7

[5] socat 명령어 관련

 - http://www.dest-unreach.org/socat/doc/socat.html

[6] 유닉스/리눅스 계열 운영체제 Sudo 명령어 취약점 보안 업데이트 권고 (KrCert)

 - https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=35469

[7] sudo patch (2) – CVE-2019-18634

 -https://github.com/sudo-project/sudo/commit/fa8ffeb17523494f0e8bb49a25e53635f4509078

[8] Analysis of CVE-2019-18634

 - https://dylankatz.com/Analysis-of-CVE-2019-18634/