[하루한줄] Ubuntu 크래시 핸들러 Apport의 Local Privilege Escalation 취약점

URL

Exploiting crash handlers: LPE on Ubuntu

Target

Ubuntu 20.10 - 2.20.11-0ubuntu50.5 이전

Ubuntu 20.04 - 2.20.11-0ubuntu27.16 이전

Ubuntu 18.04 - 2.20.9-0ubuntu7.23 이전

Ubuntu 16.04 - 2.20.1-0ubuntu2.30 이전

Explain

Ubuntu의 크래시 핸들러인 Apport에서 로컬 권한 상승 취약점이 발견되었습니다. Apport는 실행 중인 프로세스의 크래시 발생 정보를 수집하고 크래시 리포트를 만드는 서비스입니다.

Apport는 표준 입력에서 코어 덤프를 읽어 프로세스의 현재 디렉터리에 있는 코어 덤프에 새로 쓰는 write_user_coredump() 함수를 사용합니다. write_user_coredump() 를 호출하기 전 drop_privileges() 함수를 호출해 기존 Apport의 루트 권한을 크래시가 발생한 프로세스의 uid와 gid로 변경해 해당 프로세스 권한으로 코어 덤프를 작성합니다.

이때 get_pid_info() 함수는 /proc/pid/status 파일에서 uid와 gid를 각각 Uid:Gid:로 시작하는 행에서 파싱 합니다. 이를 이용해 프로세스 이름을 a\rUid: 0\rGid: 0 로 생성한 뒤 크래시를 발생시키면 uid 및 gid가 0으로 설정되므로 drop_privileges() 함수 호출을 우회하여 루트 권한을 유지할 수 있습니다.

위 취약점은 CVE-2021-25682를 할당받았으며 Apport의 크래시 발생 이후 프로세스의 교체 검사 우회 취약점(CVE-2021-25683) 및 서비스 거부 취약점(CVE-2021-25684)과 같이 악용되면 코어 덤프에 리버스 쉘 페이로드를 작성할 수 있어 root 권한으로 임의 코드 실행이 가능합니다.