권한 상승
주어진 것보다 높은 권한을 손에 넣는 일입니다. 시스템은 누가 무엇까지 할 수 있는지 미리 선을 그어 둡니다. 그 선을 넘으면 원래 못 하던 일이 가능해집니다. 이 이름은 대개 공격 쪽에서 쓰입니다.
상세
공연장 2층 좌석은 계단 입구에서 표를 확인합니다. 창구에서 차액을 내고 자리를 바꾼 사람은 그 앞을 지나 올라갑니다. 확인하는 사람이 없는 뒤편 통로로 올라가도 앉는 자리는 같습니다.
권한 상승은 지금 가진 것보다 높은 등급의 권한을 얻는 일입니다. 성립하려면 권한 경계가 먼저 있어야 합니다. 등급이 하나뿐인 시스템에는 넘을 선 자체가 없습니다.
MITRE ATT&CK(Adversarial Tactics, Techniques, and Common Knowledge, 대립적 전술·기법·공통 지식)는 이것을 전술 하나로 세워 두었습니다. 공격자가 시스템이나 네트워크에서 더 높은 등급의 권한을 얻으려고 쓰는 기법들이라고 적습니다. 공격자가 비특권 접근만으로 네트워크에 들어와 돌아다니는 일은 잦습니다. 다만 목적을 끝까지 이루려면 상승된 권한이 필요합니다. 흔한 접근은 시스템의 약점, 설정 오류, 취약점을 이용하는 것입니다.
올라가는 경로가 전부 결함인 것은 아닙니다. 현대 시스템은 인가를 받아 지나가는 상승 통제 장치를 따로 갖추고 있습니다. 권한 상승 기법은 그 장치를 우회하거나 그 아래의 결함을 밟습니다.
flowchart TD
A[비특권 주체] --> B{권한 경계}
B -->|인가를 받아 상승 통제 장치를 거친다| C[높은 권한]
B -->|장치를 우회하거나 결함을 밟는다| C
두 갈래 모두 도착지는 같습니다. 위쪽이 설계된 경로입니다. 아래쪽이 권한 상승이라고 불리는 자리입니다.
이 기법들은 지속성 기법과 겹치는 일이 잦습니다. 공격자를 시스템에 남게 해 주는 운영체제 기능이 상승된 컨텍스트에서 실행되기 때문입니다.
배경
권한을 쪼개 두지 않으면 사고나 오류 하나가 시스템 전체에 닿습니다. Saltzer 와 Schroeder 는 1975년에 정보 보호의 기본 원칙을 정리했습니다. 최소 권한이 그중 하나입니다. 모든 프로그램과 모든 시스템 사용자는 일을 끝내는 데 필요한 최소한의 권한 집합으로 동작해야 한다는 것입니다. 이 원칙은 주로 사고나 오류에서 생길 수 있는 피해를 제한합니다. 특권 프로그램들 사이의 잠재적 상호작용 수도 올바른 동작에 필요한 최소로 줄어듭니다. 그 덕에 의도치 않은, 원치 않는, 부적절한 특권 사용이 일어날 가능성이 낮아집니다.
권한을 나누는 순간 경계가 생깁니다. 그 경계를 넘는 일에도 부를 이름이 필요해집니다.
이름이 굳은 자리는 위협을 범주로 세는 쪽입니다. Microsoft 의 위협 모델링 문서는 elevation of privilege 를 범주 하나로 둡니다. 비특권 사용자가 특권 접근을 얻어 시스템 전체를 훼손하거나 파괴할 만큼의 접근을 갖는 상황이라고 적습니다. 공격자가 사실상 모든 시스템 방어를 뚫고 신뢰받는 시스템의 일부가 되어 버린 상황까지 이 범주가 받습니다.
예시
MITRE ATT&CK 는 상승된 접근의 예로 넷을 듭니다. SYSTEM 또는 root 등급, 로컬 관리자, 관리자에 준하는 접근을 가진 사용자 계정, 특정 시스템에 접근하거나 특정 기능을 수행하는 사용자 계정입니다. 아래는 그 등급이 실제로 어디에 박혀 있는지 보이는 자리입니다.
setuid(2) 와 capabilities(7)
전통적인 유닉스 구현은 권한 검사를 위해 프로세스를 두 부류로 가릅니다. 유효 사용자 ID 가 0 인 특권 프로세스와 0 이 아닌 비특권 프로세스입니다. 앞쪽은 superuser 또는 root 라고 부릅니다. 특권 프로세스는 커널의 권한 검사를 전부 건너뜁니다. 비특권 프로세스는 자기 자격 증명에 근거한 전체 권한 검사를 받습니다. 여기서 자격 증명은 대개 유효 UID(User ID, 사용자 ID), 유효 GID(Group ID, 그룹 ID), 보조 그룹 목록입니다.
리눅스 2.2 부터는 superuser 에 묶여 있던 특권을 capability 라는 단위로 쪼갰습니다. 각각을 따로 켜고 끌 수 있습니다. capability 는 스레드마다 붙는 속성입니다.
CAP_SETUID 한 줄이 권한 상승이 겨냥하는 값을 그대로 보여 줍니다. 이 capability 는 setuid(2),
setreuid(2), setresuid(2), setfsuid(2) 로 프로세스 UID 를 임의로 조작하게 해 줍니다. UNIX 도메인
소켓으로 소켓 자격 증명을 넘길 때 UID 를 위조하는 것도 여기에 들어갑니다. user namespace 에 사용자 ID
매핑을 쓰는 것도 마찬가지입니다.
setuid() 자체는 호출한 프로세스의 유효 사용자 ID 를 바꿉니다. 호출한 프로세스에 권한이 있으면, 더
정확히는 자기 user namespace 에서 CAP_SETUID 를 갖고 있으면, 실제 UID 와 저장된 set-user-ID 도 같이
바뀝니다.
내려놓는 방향도 같은 호출입니다. 리눅스의 setuid() 는 _POSIX_SAVED_IDS 기능을 갖춘
POSIX(Portable Operating System Interface, 이식 가능 운영체제 인터페이스) 판처럼 구현돼 있습니다.
root 가 아닌 set-user-ID 프로그램은 사용자 권한을 전부 내려놓고 비특권 작업을 한 뒤
원래 유효 사용자 ID 를 안전한 방식으로 다시 잡을 수 있습니다. 반대로 호출자의 유효 사용자 ID 가
superuser 이면 프로세스에 딸린 사용자 ID 가 전부 인자 값으로 바뀝니다. 그렇게 되고 나면 그 프로그램이
root 권한을 되찾는 것은 불가능합니다.
CVE-2021-3156
CVE(Common Vulnerabilities and Exposures, 공통 취약점 식별자) 번호가 붙은 실제 결함 하나입니다.
sudo 1.9.5p2 이전 판에는 off-by-one 오류가 있습니다. 그 오류가 힙 기반 버퍼 오버플로로 이어집니다.
sudoedit -s 와 백슬래시 한 글자로 끝나는 명령줄 인자를 주면 root 로 권한 상승이 됩니다.
NVD 가 이 항목에 매긴 CVSS(Common Vulnerability Scoring System, 공통 취약점 등급 체계) 3.x 기본 점수는 7.8 HIGH 입니다. 벡터는 아래와 같습니다.
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
OWASP Top 10 A01
웹 애플리케이션 쪽에서는 같은 일이 다른 모습으로 나타납니다. OWASP(Open Worldwide Application Security Project, 개방형 애플리케이션 보안 프로젝트)는 접근 제어를 사용자가 의도된 권한 밖에서 행동하지 못하게 정책을 강제하는 것이라고 적습니다. 접근 제어가 무너지면 인가 없는 정보 노출, 변경, 파기로 이어지는 것이 보통입니다. 사용자의 한도 밖에 있는 업무 기능을 수행하는 것도 여기에 들어갑니다.
첫째 공격 시나리오는 계정 정보를 조회하는 SQL(Structured Query Language, 구조화 질의 언어) 호출에 검증하지 않은 데이터를 쓰는 경우입니다.
pstmt.setString(1, request.getParameter("acct"));
ResultSet results = pstmt.executeQuery( );
공격자는 브라우저의 acct 파라미터를 원하는 계정 번호로 바꿔 보내기만 하면 됩니다.
https://example.com/app/accountInfo?acct=notmyacct
제대로 검증하지 않으면 공격자가 아무 사용자의 계정에나 접근합니다.
둘째 시나리오는 강제 브라우징입니다. 관리자 권한이 있어야 열리는 페이지의 주소를 그대로 부릅니다.
https://example.com/app/getappInfo
https://example.com/app/admin_getappInfo
인증되지 않은 사용자가 둘 중 어느 쪽이든 열면 결함입니다. 관리자가 아닌 사용자가 관리자 페이지를 열어도 결함입니다.
갈래
축은 권한 경계를 무슨 수로 넘느냐입니다. MITRE ATT&CK 는 이 전술 아래에 기법을 두고 수마다 다른 이름을 붙였습니다.
상승 통제 장치 악용
현대 시스템은 대부분 사용자가 기계에서 수행할 수 있는 권한을 제한하려는 자체 상승 통제 장치를 갖고 있습니다. 위험도가 높다고 볼 만한 작업을 하려면 특정 사용자에게 인가가 주어져야 합니다. 이 갈래는 그 장치를 우회해 더 높은 등급의 권한을 얻습니다.
취약점 이용
프로그램, 서비스, 운영체제 소프트웨어, 커널 자체의 프로그래밍 오류를 이용합니다. 그 오류를 밟아 공격자가 통제하는 코드를 실행합니다. 앞의 CVE-2021-3156 이 이 자리에 놓입니다.
접근 토큰 조작
윈도우는 실행 중인 프로세스의 소유권을 판정하는 데 접근 토큰을 씁니다. 이 갈래는 접근 토큰을 고쳐 다른 사용자나 시스템 보안 컨텍스트로 동작합니다. 그렇게 접근 통제를 우회합니다.
호스트로 탈출
컨테이너나 가상화 환경 밖으로 빠져나옵니다. 그 아래에 깔린 호스트에 접근합니다. 호스트 등급에서 다른 컨테이너와 가상화 자원에 닿습니다. 호스트 자체에 닿는 경우도 있습니다.
웹 애플리케이션 쪽에서는 같은 이름이 다른 축으로 잘립니다. OWASP 는 접근 제어 취약점 목록에 elevation of privilege 를 넣습니다. 로그인하지 않은 채 사용자로 행동하는 것, 사용자로 로그인한 채 관리자로 행동하는 것이 그 자리에 적혀 있습니다. 고유 식별자를 주면 남의 계정을 보거나 고치게 두는 것은 안전하지 않은 직접 객체 참조라는 별도 이름으로 적혀 있습니다.
관련 항목
권한 경계를 세우고 지키는 개념
권한 · 권한 경계 · 최소 권한 · 인가 · 접근 제어
권한 검사가 실제로 걸려 있는 운영체제 메커니즘
setuid · capabilities · sudo · user namespace · 유효 사용자 ID · 접근 토큰 · 사용자 계정 컨트롤
격리를 뚫고 호스트로 나가는 경로
결함을 세는 이름
CVE · CVSS · 버퍼 오버플로 · off-by-one
위협을 정리하는 체계
위협 모델링 · MITRE ATT&CK · OWASP Top 10
권한 상승과 겹치거나 헷갈리는 이름
안전하지 않은 직접 객체 참조 · 강제 브라우징 · 지속성
다른 이름: privilege escalation · elevation of privilege