보안정보

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

SetUID를 이용한 권한상승의 위험성

2021.11.03

37,963


 

 

 

 

01. 개요

 

유닉스 계열 운영체제(Unix-like OS, 이하 유닉스)는 멀티 유저(Multi-User)시스템으로, 다중 사용자 환경에서 보다 효율적이고 안전한 시스템 관리를 위해 각 사용자 계정에는 권한이 부여된다. 최고 관리자인 root는 사용자 권한 부여 및 시스템 관리 등의 모든 운영체제 권한을 가지고 있기 때문에 공격자들에게 악용될 경우 시스템에 막대한 영향을 미치게 된다. 따라서 공격자로 인한 피해를 최소화 하기 위해 최소권한원칙(least privilege policy)에 따라 운영할 것을 권고하지만 권한상승과 같이 권한탈취를 위한 공격은 끊임없이 발생되고 있다.

 

권한상승(Privilege Escalation)은 응용프로그램이나 사용자로부터 보호가 필요한 리소스에 대한 접근 권한(Access Privilege)을 높이기 위해서는 운영체제나 응용프로그램의 버그(Bug), 설계결함(Defect), 장애(Failure), 오설정(Misconfiguration)등을 악용하는 행위를 의미한다. 권한상승은 권한 우회를 위한 가장 일반적인 공격 기법으로 SetUID를 이용한 공격이 가장 대표적인 공격 방식 중 하나라고 할 수 있다.

 

유닉스에는 User, Group, Other 권한 이외에 특수권한으로 ‘SetUID’와 ‘SetGID’가 존재한다. 해당 권한이 적용된 파일은 실행 시 일시적으로 파일 소유자 또는 소유 그룹의 권한을 얻을 수 있다. 시스템을 구성하는 여러 파일들은 보안을 위해 root의 접근만 허용되어야 하는 경우가 종종 존재하며 이러한 경우 최소권한으로 설정된 일반 사용자도 해당 실행 파일을 정상적으로 이용하게 만들기 위해 SetUID를 적용한다. 특수 권한의 사용은 일부 상황에서는 매우 유용할 수 있지만 올바르지 않게 사용할 경우 권한 상승 공격에 이용되어 심각한 보안 사고를 야기할 수 있다. 따라서 이번 호에서는 SetUID 설정을 이용한 권한 상승 공격에 대해 알아보고자 한다.

 

 

02. UID(User ID) 개념 및 상세구현 매커니즘

 

1) RUID, EUID 개념

 

유닉스의 커널에서 사용자 식별 시 양의 정수값을 사용하는 UID(User ID)을 사용하게 되며 /etc/passwd에 저장된다. 관리자권한인 root는 UID값이 0으로 부여되고, 그 외의 계정들의 경우 0이외에 값이 부여된다. UID는 로그인한 실제 사용자의 ID인 RUID(Real User ID)와 프로세스가 실행되면서 접근할 파일의 권한을 가지는 사용자 ID를 의미하는 EUID(Effective User ID)로 구분할 수 있다.

  

구분

RUID(Real User ID)

EUID(Effective User ID)

정의

프로세스를 실행시키는 실제 사용자의 ID

프로세스 실행 시 자원에 접근할

적용되는 사용자의 ID

영향

프로세스간 시그널 전송 시 받는

프로세스의 UID 식별

프로세스가 생성한 파일의 소유자를 결정

특징

프로세스 실행 시 변하지 않는 값

프로세스 실행 시 변경될 수 있는 값

 

[표 1] RUID와 EUID의 차이점 

 

 

프로세스 실행 시 일반적으로 EUID는 RUID와 일치하게 설정되지만 EUID가 RUID와 다르게 설정되는 특수한 경우가 존재한다. SetUID가 설정된 파일이 실행되는 경우가 이에 속하는데, SetUID 설정은 권한 상승 공격에 악용되곤 한다. 

 

 

2) SetUID 개념

 

SetUID는 유닉스 환경에서 일시적으로 접근권한이 없는 파일에 접근을 허용하는 특수권한을 부여한다. SetUID가 적용된 대표적인 사례는 계정의 비밀번호를 변경 또는 지정하는 명령어인 ‘passwd’에 사용된다. ‘passwd’명령어를 사용하면 /usr/bin/passwd에서 접근권한이 부여되지 않은 /etc/shadow에 접근하는 구조로 동작하게 된다. /etc/shadow파일은 비인자 사용자의 접근을 차단하기 위해 root계정에 한해서만 접근권한이 부여되는데 SetUID를 이용하면 root권한을 임시적으로 부여받을 수 있게 된다.

 

shadow파일의 접근권한이 없는 일반사용자가 파일접근 시에는 [그림 1]과 같이 ‘passwd : 인증 토근 수정 오류(passwd: Authentication token manipulation error)’가 발생하면서 접근에 실패하게 된다. 이처럼 파일의 접근권한이 없는 사용자가 일시적으로 해당 파일에 접근해야 하는 경우 SetUID를 이용하면 접근할 수 있게 된다.

 

 

 

[그림 1] SetUID가 적용되지 않은 /usr/bin/passwd 파일

 

 

3) SetUID 설정 방법

 

SetUID 설정은 파일의 소유자 혹은 root만 가능하며 실행 파일에 ‘chmod u+s’명령을 이용하거나 ‘chmod 4755’처럼 1000자리에 4를 설정하여 적용할 수 있다. SetUID를 설정하면 [그림 2]와 같이 파일 소유자의 실행 권한 부분이 x 대신 s로 변경된다. 불필요하게 설정된 SetUID를 제거하고 싶다면 ‘chmod u-s’ 명령을 이용하거나 ‘chmod 0755’와 같이 1000자리에 4를 제거하여 적용하면 된다.

 

 

 

[그림 2] ‘chmod u+s’ 명령어를 이용한 SetUID 설정 방법

 

 

4) SetUID가 부여된 파일의 실행 과정

 

SetUID 권한이 부여된 파일의 실행 과정을 이해하기 위해 일반 사용자가  /usr/bin/passwd 파일을 실행하는 과정을 예로 들어 설명하겠다. /usr/bin/passwd 파일의 소유자는 root이며 SetUID 설정이 적용되어 있는 상태이다. 

  

[그림 3] SetUID 설정으로 인한 EUID 값의 변화

 

 

① 현재 로그인한 일반 사용자 계정의 RUID 값은 1000이며 EUID 값은 RUID와 동일하게 설정되어 있고, 사용자는 본인 계정의 비밀번호를 변경하기 위해 /usr/bin/passwd 파일을 실행시킨다. 

② SetUID가 적용된 파일 실행 시 SUID에 현재 EUID 값을 저장하고, EUID 값을 ‘파일 소유자의 RUID’ 값으로 설정한다. 여기서 SUID란, Saved UID를 말하며 EUID 임시 변경 후 이전 값으로 복원을 위해 변경 전의 값을 저장한다. 

③ [그림 5-3]에서 파일 소유자는 root이므로 root의 RUID 값인 ‘0’이 EUID로 설정되는 것이다. 

④ 파일 실행을 마치면 원래의 EUID로 돌아가기 위해 SUID에 저장되어 있는 값(1000)을 가져와 현재 EUID 값으로 저장한다. 

⑤ 사용자는 파일을 실행하기 전과 동일한 EUID 값(1000)으로 돌아간다.

 

결과적으로 사용자가 SetUID 설정이 적용된 파일을 실행하는 동안 일시적으로 파일 소유자의 권한이 부여되며 파일 실행이 종료된 시점에는 본래의 권한으로 재설정된다.

 

 

03. 공격 사례 : CVE-2018-14665

 

1) 취약점 소개

 

최소 권한이 부여된 일반 사용자도 SetUID를 이용하면 언제라도 root가 될 수 있으니 공격자들은 이 점을 노려 권한 상승 공격에 이용하곤 한다. SetUID 기능을 악용한 권한 상승 공격 사례 중 CVE-2018-14665 취약점에 대해 알아보고자 한다.

 

CVE-2018-14665로 등록된 이 취약점은 주요 유닉스 배포판에서 GUI 환경 제공을 위해 설치하는 X.Org 서버 패키지에 존재하며, 제한된 권한을 가진 공격자가 root 권한을 획득할 수 있게 한다. 유닉스 사용자들 중 GUI 환경이 필요한 경우, 운영체제 설치 시 소프트웨어 선택을 통해 자동 설치하거나 운영체제 설치 후 수동 설치를 통해  X.Org 서버를 이용할 수 있다. 

 

X.Org 서버가 설치된 리눅스 환경에는 [그림 4]와 같이 /usr/bin/Xorg 파일이 존재하여 Xorg 명령어를 이용할 수 있는 것을 확인할 수 있다. 해당 파일을 ‘ls –l’ 명령을 통해 조회한 결과 SetUID가 적용된 것을 알 수 있다.

  

 

[그림 4] SetUID가 적용되어 있는 /usr/bin/Xorg 파일

 

 

Xorg 파일의 SetUID 설정은 X.Org 서버가 플랫폼에 의존하지 않고 독립적으로 작동하기 위한 설정으로, 하드웨어와 직접 통신을 위해 root 권한이 필요하여 존재하는 설정이다. 그러나 공격자들은 이 점을 악용하였고, 공격이 가능한 버전 및 OS 정보는 [표 2]와 같다.

  

구분

취약한 버전

영향 받는 OS 종류

CVE-2018-14665

1.19.0 이상 1.20.3 이하

대부분의 Linux/Unix

(RedHat, CentOS, Debian, Ubuntu, Pedora, OpenBSD 포함)

 

[표 2] CVE-2018-14665 영향받는 버전

 

 

2) 취약점 분석

 

/usr/bin/Xorg 파일은 X.Org 서버를 실행하기 위한 명령어로 사용할 수 있으며 ‘Xorg’ 명령어 실행 시  △ 인자확인, △ 권한확인, △명령 수행 순으로 실행되게 된다.

 

‘Xorg’ 명령와 함께 ‘-logfile’을 입력하면 로그 파일의 이름을 지정하여 생성할 수 있다. 전달된 인자 값 중 ‘-logfile’이 확인되면 서버는 LogInit() 함수를 실행하여 fopen()함수를 통해 로그 파일을 생성한다. [그림 5]은 LogInit()함수에서 로그를 생성하는 코드에 해당하는 부분이다.

 

 

[그림 5] X.Org 서버 패키지의 LogInit() 함수

 

 

로그 파일 생성 시 fopen() 함수를 통해 동일한 이름의 파일이 존재하지 않는다면 빈 파일을 생성하고, 존재한다면 새 파일로 덮어 씌워 기존 내용이 모두 지워진다. 생성된 로그 파일에는 “FontPath set to:” 라는 내용과 설정된 ‘FontPath’가 함께 기입된다. FontPath는 ‘fp’ 인자를 통해 변경할 수 있으며 사용자가 지정하여 설정하지 않는다면 기본값인 “catalogue:/etc/X11/fontpath.d”가 기입된다. ‘Xorg :1 –fp “hello” –logfile test.log’ 명령을 통해 글꼴 경로를 “hello”로 변경 시 로그 파일에 “hello” 문자열이 저장된 것을 [그림 6]에서 확인할 수 있다.

 

 

[그림 6] ‘fp’ 인자를 통해 변경된 FontPath

 

 

3) 공격 시연

 

공격자가 대상 서버에 ‘igloo’ 라는 사용자 계정으로 SSH 원격 접속에 성공했다는 상황을 가정하여 이후의 권한 상승 공격을 펼쳐 보이겠다. 공격자는 서버에 직접적인 피해를 가하기 위해 CVE-2018-14665 취약점을 이용하여 root 권한을 획득할 생각이다. 공격 시연 환경은 [표 5-3]과 같다.

  

Attacker Server OS

Kali 2021.1 (192.168.64.133)

Victim Server OS

CentOS 7.5.1804 (192.168.64.138)

Xorg Version

1.19.5

 

[표 3] 공격 시연 환경

 

 

원격 접속에 성공한 공격자는 첫 번째로 ‘find / -type f –perm -4000 –user root’ 명령을 실행한다. SetUID가 적용된 파일 중 소유자가 root인 실행 파일을 찾는 명령으로, X.Org 서버가 설치된 운영체제라면 /usr/bin/Xorg 파일이 검색될 것이다.

 

공격자는 Xorg 파일 실행 시 ‘logfile’ 옵션을 통해 로그 파일명을 지정하여 생성할 수 있다는 사실과 ‘fp’ 옵션을 통해 원하는 문자열을 기입할 수 있다는 사실을 이용하여 /etc/shadow 파일 생성을 시도할 것이다. [표 4]의 공격 코드를 통해 shadow 파일을 로그 파일로 덮어 씌운 후 “root:::0:99999::::” 문자열을 삽입하여 비밀번호 없이 root 계정을 탈취할 계획이다. [그림 7]은 공격 코드를 입력한 결과 모습이며, 비밀번호 입력 없이 root 계정으로 접속하는데 성공한 것을 확인할 수 있다.

  

Attacker Server OS

Kali 2021.1 (192.168.64.133)

Victim Server OS

CentOS 7.5.1804 (192.168.64.138)

Xorg Version

1.19.5

 

[표 4] 관리자 권한 탈취를 위한 공격 코드

 

  

[그림 7] 관리자 권한을 획득한 공격 결과 모습

 

 

4) 취약점 패치

 

CVE-2018-14665 취약점은 ‘logfile’ 인자 전달 시 권한 확인 로직이 미흡하여 발생한 것으로, 해당 부분에 대해 보완한 버전이 배포되었다. Xorg 실행 시 전달받은 인자 값이 ‘-logfile’인 경우에 해당하는 처리 과정에서 권한 확인 함수가 변경되었다. [그림 8]은 보안 패치 적용 시 삭제되는 부분과 추가되는 코드를 보여주고 있다.

 

 

 

[그림 8] 보안 패치 시 삭제 및 추가되는 코드

 

 

logfile 옵션 사용 시 로그 파일을 생성하기 전에 권한 상승 여부를 확인하기 위해 기존에는 xf86CheckPrivs()함수를 이용했지만 패치 이후에는 xf86PrivsElevated()함수를 이용한다. [그림 9]는  ‘-logfile’ 인자값 입력 시 실행되는 권한 확인 과정을 보여주고 있으며 보안 패치 이전에는 ‘상대 경로 사용 여부‘를 확인하였지만 패치 이후에는 이 부분을 제거하여 ‘권한 상승 여부‘에 대해서만 확인하고 있다. ‘권한 상승 여부’에 대한 확인은 사용자의 RUID값과 EUID 값을 비교하여 서로 다를 경우 권한이 상승되었다는 에러 메시지를 출력하며 종료된다.

 

 

 

[그림 9] 보안 패치 전후 비교

 

 

보안 패치가 적용된 X.Org 서버 1.20.4 이후 버전에서는 해당 취약점이 발현되지 않는 상태이므로 X.Org 서버를 사용하고 있다면 현재 버전 확인 후 업데이트할 것을 권장한다. 서버 버전 확인 및 업데이트 방법은 다음과 같다. 

 

 

① 사용 중인 X.Org 서버 버전 확인

 

“Xorg –version” 명령을 통해 현재 시스템에 설치되어 있는 X 서버 버전을 확인한다. 1.19.0 이후 1.20.3 이전 버전을 이용하고 있다면 SetUID 설정을 악용할 수 있으므로 1.20.4 이후 버전으로 업데이트를 한다.

 

   

[그림 10] X.Org 서버 버전 확인

 

 

② X.Org 서버 업데이트

 

사용 중인 X.Org 서버를 업데이트 하는 방법은 다음과 같다. 패키지 저장소(repository) 목록에 1.20.4 이후 버전의 X.Org 서버가 존재하는지 확인 후 [표 5]의 업데이트 명령어를 통해 업데이트를 진행한다.

 

RedHat 계열(CentOS, RHEL, Fedora 등) : yum update xorg-x11-server-Xorg

Debian 계열(Ubuntu, Kali Linux 등) : apt-get update xorg-x11-server-Xorg 

 

[표 5] 운영체제별 업데이트 명령어

 

 

부득이하게 버전 업데이트가 불가능한 상황이라면, 임시방편으로 SetUID 설정을 제거할 것을 권고하고 있다. ‘chmod –s /usr/binXorg” 명령을 통해 SetUID 설정을 제거할 수 있으며 SetUID를 제거할 경우 root가 아닌 일반 사용자의 X.Org 서버 이용이 제한될 수 있으므로 영향도를 충분히 검토한 후 작업을 진행해야 한다.

 

 

04. 대응방안

 

SetUID 또는 SetGID가 적용되어 있는 파일은 공격자의 타겟이 되기 쉬우므로 주기적으로 감사하여 불필요한 권한 상승을 최소화하는 것이 중요하다. SetUID, SetGID 설정이 악용되지 않도록 점검하는 방법은 다음과 같다.

 

1) SetUID, SetGID 권한이 부여된 파일목록 확인방안

 

[표 6]의 명령을 통해 SetUID, SetGID가 설정된 파일의 상세 목록을 조회하고 사용하지 않거나 의심스러운 파일이 존재하는지 확인한다.

 

ㆍfind / -xdev ( -perm -4000 -o -perm -2000 ) -type f -print0 | xargs -0 ls –l

 

[표 6] SetUID, SetGID 파일 조회 명령어

 

 

 

[그림 11] SetUID, SetGID가 설정된 파일 목록 조회

 

 

2) 불필요한 SetUID 및 SetGID 권한 제거방안

 

조회된 목록 중 사용하지 않거나 불필요하게 SetUID 또는 SetGID가 적용된 파일이 존재한다면 [표 7]의 명령을 통해 해당 설정을 제거한다. SetUID 또는 SetGID를 제거할 경우 파일 소유자가 아닌 사용자의 실행이 제한되므로 해당 권한 제거 시 영향도를 충분히 검토한 후 작업을 진행해야 한다.

 

구분

방법

SetUID 설정 제거

chmod u-s <setuid_file_name>

chmod 0755 <setuid_file_name> 와 같이 1000자리에 4를 제거

SetGID 설정 제거

chmod g-s <setgid_file_name>

chmod 0755 <setgid_file_name> 와 같이 1000자리에 2를 제거

 

[표 7] SetUID, SetGID 설정 제거 명령어

 

 

 

3) SetUID 및 SetGID가 필요한 경우 관리 방안

 

반드시 SetUID 또는 SetGID의 사용이 필요하여 제거할 수 없는 경우에는 되도록 일반 사용자의 접근 권한을 제한하고 특정 그룹에 속한 사용자만 실행할 수 있도록 설정하여 관리해야 한다. [표 8]은 그 방법을 설명하고 있다. 일반 사용자의 접근 권한을 제거할 경우 파일 소유자 또는 소유 그룹원이 아닐 경우 파일에 접근할 수 없으므로 해당 조치 시 영향도를 충분히 검토하여 진행한다.

 

구분

방법

그룹 생성

groupadd <group_name>

파일의 소속 그룹 변경

chgrp <group_name> <file_name>

일반 사용자 접근 제한

chmod o-rws <file_name>

 

[표 8] SetUID, SetGID가 필요한 파일의 관리 방안

 

 

4) 일반 사용자의 SetUID 및 SetGID 설정 파일실행 로그 기록

 

일반 사용자의 SetUID, SetGID 이용이 불가피한 파일의 경우 해당 파일의 실행 로그를 기록하여 주기적으로 확인한다. [표 9]는 리눅스에서 제공하는 audit 기능을 이용한 감사 규칙 설정 방법이다. 만약 audit 시스템이 설치되어 있지 않다면 먼저 yum 또는 apt-get 명령을 통해 설치를 진행한다. 설치를 마친 후 일반 사용자의 SetUID 및 SetGID 파일 실행에 대해 로그를 기록할 수 있도록 규칙을 정의한다. 정의된 행위가 발생하면 /var/log/audit/ 디렉토리에 로그가 기록되므로 주기적으로 로그를 확인하여 SetUID, SetGID 파일이 권한 상승 공격에 악용되지 않도록 주의한다.

 

 

구분

방법

설치

RedHat 계열

yum install audit

Debia 계열

apt-get install auditd

규칙 정의

명령어 사용

auditctl –w <파일경로> -p <퍼미션> -k <규칙명>

(예시 : auditctl –w /usr/bin/passwd –p x –k passwd_change)

/etc/audit/audit.rules

파일 수정

 -a always,exit –F path=<파일경로> -F perm=

<퍼미션> –F auid >=1000 –k <규칙명>

설정된 규칙 확인

auditctl -l

저장된 로그 파일 위치

/var/log/audit/

 

[표 9] 일반 사용자의 실행 로그 감사 방법

 

 

05. 결론

 

지금까지 SetUID의 개념과 프로세스 동작 원리 및 취약점(CVE-2018-14668) 사례를 통해 권한상승의 위험성에 대해서 알아봤다. 프로세스 실행 시 다른 사용자의 권한으로 우회할 수 있다는 것은 유용하게 쓰일 수 있지만 CVE-2018-14665와 같이 악용될 경우에는 시스템에 심각한 영향을 미칠 수 있다. 이러한 위험을 방지하는 가장 쉬운 방법은 특수권한을 전혀 사용하지 않는 것이지만 시스템에 설치되는 기본 파일에도 SetUID 및 SetGID는 존재하는 관계로 모든 파일에서 특수권한을 제거하는 것은 현실적으로 불가능할 수 있다. 따라서 인가되지 않은 자의 SetUID 및 SetGID를 이용한 권한상승의 위험을 방지하기 위해 앞서 설명한 대응방안들을 주기적으로 시행할 것을 권장한다.

 

 

06. 참고자료

 

[1] UID 개념

https://ko.wikipedia.org/wiki/사용자_식별자

[2] CVE-2018-14665

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-14665

[3] X.Org 서버 취약점

https://www.dailysecu.com/news/articleView.html?idxno=40338

[4] Rootless Xorg

https://wiki.ubuntu.com/X/Rootless

[5] CVE-2018-14665 POC

https://www.securepatterns.com/2018/10/cve-2018-14665-xorg-x-server.html

[6] xorg-server releases

https://www.x.org/releases/individual/xserver/

[7] Privilege escalation using setuid

https://blog.creekorful.org/2020/09/setuid-privilege-escalation/

[8] Xorg 패치 내용

https://gitlab.freedesktop.org/xorg/xserver/commit/50c0cf885a6e91c0ea71fb49fa8f1b7c86fe330e

[9] X.Org 보안 권고

https://lists.x.org/archives/xorg-announce/2018-October/002927.html