
Google의 Osconfig에서 식별된 권한 상승 취약점에 대한 개념 증명
google_osconfig_agent 프로세스는 GoogleCloudPlatform(https://github.com/GoogleCloudPlatform/osconfig)의 구성 요소로, 각 VM에서 기본적으로 실행되는 도구입니다. 에이전트는 root로 실행되며 사용자가 제어할 수 있는 일부 서비스를 담당하며, OS config(https://cloud.google.com/compute/docs/os-config-management)를 포함합니다. 이는 Google의 폴링 기반 원하는 상태 구성의 일종입니다.
이 저장소는 제가 구현에서 발견한 권한 상승 취약점에 대한 데모를 호스팅합니다(이후 Google에 의해 수정되었습니다).
실행할 작업을 레시피라고 하며, 지원되는 레시피 유형 중 하나는 셸 스크립트를 실행하는 것입니다. 이러한 레시피를 처리하는 동안 전체 기능을 갖춘 root로 실행되는 에이전트는 파일을 임시로 /tmp 디렉터리에 저장한 다음 실행합니다. 에이전트가 생성한 디렉터리는 가로챌 수 있으므로 실행될 스크립트를 교체할 수 있으며, 결과적으로 로컬 권한 상승으로 이어집니다.
gcloud services enable osconfig.googleapis.com
gcloud compute project-info add-metadata --metadata=enable-osconfig=TRUE
# cat /tmp/poc.txt
cat: /tmp/poc.txt: No such file or directory
# pip3 install inotify_simple
# chroot --userspec=nobody:nogroup / /home/radimre83/osconfig-privesc-poc3.py
Running as 65534
calling inotify.read()
...
gcloud beta compute os-config guest-policies create test-policy-poc --file="C:\Projects\gcp-app-engine-experiments\compute-engine\osconfig-policy-poc.yaml"
Event(wd=1, mask=1073742080, cookie=0, name='recipe-runscript')
New recipe: recipe-runscript2, rename: /tmp/osconfig_software_recipes.mali1596821311/xxx-recipe-name -> /tmp/osconfig_software_recipes.mali1596821311/recipe-runscript
New rundir recipe-runscript2, rename: /tmp/osconfig_software_recipes.mali1596821311/recipe-runscript/xxx-rundir -> /tmp/osconfig_software_recipes.mali1596821311/recipe-runscript/run_1596821899000709826
# cat /tmp/poc.txt
uid=0(root) gid=0(root) groups=0(root),1000(google-sudoers)
OS: 기본 Debian 10 이미지를 사용하는 GCE의 f1-micro 인스턴스.
Google은 예측 가능한 임시 디렉터리 대신 무작위 임시 디렉터리를 사용하도록 전환했습니다.
수정된 버전은 2020-09-05에 릴리스되었습니다. OS 패키지를 업그레이드해야 합니다.
이는 로컬 권한 상승 취약점으로, 영향을 받는 GCE VM에서 이미 코드 실행 권한이 있는 사람이 악용할 수 있습니다:
낮은 권한 셸을 가진 사용자
이미 침해된 네트워크 서비스를 통한 공격자
핵심은 "기본 디렉터리"(/tmp/osconfig_software_recipes)를 장악하는 것입니다. 현재 세션에서 아직 레시피가 처리되지 않은 경우에 가능하며, 즉 다음을 의미합니다:
지금까지 레시피가 전혀 실행되지 않은 경우(예: osconfig 기능이 사용되지 않았지만 나중에 어느 시점에 사용될 예정인 경우)
VM이 재부팅되고 모든 레시피가 DB(/var/lib/google/osconfig_recipedb)에 존재하지만, 일부 정책 업데이트는 나중에 어느 시점에 실행되는 경우
이 특수한 조합은 실제로 악용 가능성을 낮추지만, 여기서 /tmp의 작업 디렉터리를 활용하는 것은 안전하지 않다고 생각합니다. (Google도 마찬가지였으며, 이 문제는 이후 수정되었습니다.)
2020-08-07: 문제 발견 및 보고
2020-08-08: Google이 문제 분류, 우선순위 P1로 변경
2020-08-10: Google이 문제 확인("🎉 Nice catch!"), 우선순위 P2로 변경, 심각도 S2로 변경
2020-08-14: VRP 프로세스에 대한 업데이트
2020-09-05: Google이 문제 수정
Imre Rad
https://github.com/GoogleCloudPlatform/osconfig
https://issuetracker.google.com/issues/163147689
https://github.com/GoogleCloudPlatform/osconfig/commit/fa7e4ba5ee85be212ffbac66d96862c792bd270c