[하루한줄] Microsoft Azure Functions을 통한 Docker Container Escape

URL

How We Hacked Azure Functions and Escaped Docker

Target

  • Microsoft Azure Functions

Explain

Microsoft Azure Functions에서 권한 상승 및 Azure Functions 도커 컨테이너를 escape 할 수 있는 취약점이 발견되었습니다.

Azure Functions은 AWS의 Lambda 서비스처럼 인프라의 provision이나 관리 없이 유저가 코드를 실행할 수 있는 기능입니다. Azure Functions은 HTTP request를 통해 트리거 할 수 있으며 Azure-managed container에서 코드가 실행됩니다.

Azure Functions의 Mesh 바이너리는 syscall_mount 등의 mount 기능을 사용하므로 권한 없는 사용자가 HTTP 서버를 통해 해당 서비스에 접근하면 권한 상승을 할 수 있습니다. Mesh 바이너리에 존재하는 mount_RunSquash 함수는 squashfuse_II 함수를 호출하여 filePath 경로에 지정된 squashfs 이미지를 targetPath 경로에 마운트 합니다. sudoers 메커니즘을 통해 사용자에게 루트 권한을 주는 파일이 포함된 squashfs 파일 시스템을 생성하여 sudoers.d에 이미지를 마운트 하면 권한 상승을 할 수 있습니다.

하지만 권한 상승이 되더라도 컨테이너 안에 존재하므로 도커를 escape 해야 합니다. Azure Functions의 컨테이너는 --privileged 모드로 실행되어 시스템의 모든 장치에 접근 가능하며 커널의 기능 대부분을 사용할 수 있습니다. 따라서 해당 문서에 존재하는 기법을 통하여 Docker의 host에서 명령어 수행이 가능합니다.