[하루한줄] CVE-2021-30465: Docker, Kubernetes의 runc Container Escape 취약점

URL

CVE-2021-30465: runc <1.0.0-rc95 vulnerable to symlink-exchange attack

Target

  • runc ≤ 1.0.0-rc94

Explain

Docker, Kubernetes 등 대부분의 컨테이너 기반 가상화 서비스에서 사용되는 runc에서 취약점이 발견되어 세부 보고서가 공개되었습니다.

runc는 OCI(Open Container Initiative) 표준을 기반으로 컨테이너 생성과 실행을 위해 설계된 CLI 도구입니다. 지난 2019년 Container escape 취약점(CVE-2019-5736)이 공개된 데 이어 이번에 공개된 취약은 symlink exchange attack으로 호스트 파일 시스템이 컨테이너에 마운트 되도록 할 수 있는 escape 취약점입니다.

컨테이너가 시작되고 runc가 컨테이너 공유 볼륨 내부에 마운트 되는 경우 runc는 마운트 되는 대상을 검사합니다. 이때 마운트 대상을 컨테이너 rootfs 외부의 호스트 파일 시스템의 심볼릭 링크로 교체하면 컨테이너를 escape 해 컨테이너에서 호스트 파일 시스템에 접근할 수 있습니다. 일반적인 경우 MS_SLAVE 전파 타입이 적용된 마운트 네임스페이스 내에서는 호스트에 접근할 수 없지만 Kubernetes와 같이 볼륨 관리 인프라가 존재하는 경우 다음과 같이 컨테이너에서 호스트 파일 시스템을 마운트 할 수 있습니다.

  1. 해커는 잘 알려진 호스트의 볼륨 관리에 사용되는 경로로 접근
  2. 마운트 소스 디렉토리에 호스트의 / 에 대한 심볼릭 링크를 생성하는 악성코드 실행
  3. 컨테이너의 후속 마운트에서 toctou를 트리거해 / 를 마운트