악성 도커 이미지 피하는 3가지 방법
오늘날 데브옵스(Devops) 및 클라우드 환경이 증가하면서, 도커(Docker)는 없어서는 안될 필수요소로 자리잡았다. 도커는 관리 비용/운영 비용이 적고 사용이 편리해 개발자뿐만 아니라 관리자들도 점점 더 널리 사용하고 있다.
하지만 사용이 증가한다는 것은 곧 해커들의 표적이 될 수 있음을 의미한다. 실제로, 도커를 타겟으로 한 위협은 계속해서 늘어나는 추세이다. 이번 글에서는 도커 이미지의 개념과 악성 도커 이미지를 활용한 공격 방법 및 대응책에 대해 살펴본다.

개발자 입장에서 도커 이미지를 활용하면 개발 환경을 세팅하는 비용과 시간이 많이 소요되지 않아 인프라를 쉽게 구성할 수 있다. 관리자 입장에서는 ‘도커 컨테이너(Docker Container)’ 환경을 ‘도커 이미지(Docker Image)’로 변환시켜 정확한 테스트와 빠른 배포가 가능하며, 관리 툴과 연계해 CI/CD(Continuous Integration/Continuous Deployment) 같은 애플리케이션 라이프사이클을 자동화할 수 있다.

다시 말해, 프로그램 설치, 복잡한 설정 작업 없이도 누구나 손쉽게 도커 컨테이너로 개발 및 테스트 환경(Ex. 웹 서버, DB 서버 등)을 구축할 수 있다.
[그림 2] 도커 컨테이너로 개발 및 테스트 환경 구축
도커 이미지란?
도커라는 기술로 도커 컨테이너 환경을 구축하기 위해서는 도커 이미지가 필요하다. 도커 이미지란 도커 컨테이너 환경에서 동작되는 프로그램, 라이브러리 등을 묶은 형태를 말한다. 도커 이미지는 [그림 3]과 같이 여러 계층(Layer)으로 구성되어 있다. 일반적으로 도커 이미지는 ‘우분투(Ubuntu)’, ‘센트OS(centos)’, ‘비지박스(busybox)’와 같은 OS 이미지가 ‘베이스 이미지(base Image)’로 시작된다. 그리고, 그 위는 애플리케이션, 라이브러리, 기타 명령어 등의 계층들로 이루어져 있다.
[그림 3] 여러 계층으로 나뉘어 있는 도커 이미지
도커 이미지가 계층 단위로 나뉘어져 있는 이유는 이미지를 수정하거나 다운로드할 때 속도 측면에서 효율적이기 때문이다. 도커 이미지의 내용을 일부 변경시킬 때 특정 계층만 변경시키면 되기 때문에 수정이 빠르고, 새로운 이미지들을 다운받을 때 기존 존재하는 계층이 있다면 캐싱(caching)해서 재사용하기 때문에 다운로드 할 때도 효율적이다.
이러한 도커 이미지들은 기본적으로 ‘도커 허브(Docker hub)’라는 공개 저장소(Public Repository)에서 다운로드(pull)할 수 있다.
[그림 4] 도커 허브 사이트
도커 허브에서 보이는 이미지 명은 일반적으로 ‘[Docker hub 계정명]/[REPOSITORY(Docker Image 명)]:[Tag(버전)] (Ex. scanon/shanetest:latest)’으로 구성되어 있다.
[그림 5] 도커 허브에 업로드(push)된 ‘shantest’ 이미지
도커 허브에 업로드된 도커 이미지들은 크게 2가지 방식으로 제작된다. 첫 번째 방법은 ‘도커파일(dockerfile)’을 빌드(build)하여 도커 이미지를 생성하는 방법이다. 여기서 말하는 도커파일이란 [그림 6]과 같이 ‘DSL 언어(Domain-Specific Language)’를 이용해 이미지 생성 과정을 기술하는 파일을 말한다.
[그림 6] DSL 언어로 작성된 ‘dockerfile’
도커파일 작성 후, [그림 7]과 같이 빌드 과정을 거치면 도커 이미지를 만들어 바로 사용할 수 있다.


두 번째 방법은 기존 도커 이미지에 컨테이너에서 작업한 내역을 추가하여 새로운 도커 이미지를 생성하는 것이다. [그림 9]와 같이 ‘commit’ 명령어로 실행된 컨테이너의 작업을 계층으로 변환시켜 최종적으로 도커 이미지로 제작할 수 있다
[그림 9] commit 명령어로 도커 이미지 생성
[그림 10] 추가된 도커 계층(Layer)
즉, ‘commit’을 통한 도커 이미지 제작은 기존 도커 이미지의 계층에 컨테이너 상에서 작업한 것을 계층 단위로 추가하는 방법이다.
[그림 11] 도커 컨테이너에서 작업한 내역을 계층으로 추가하는 방법
사용자들을 위협하는 악성 도커 이미지
공격자들은 악성 도커 이미지를 만들어 도커 허브에 배포하고 있다. 여기서 악성 도커 이미지란 악성코드, 해킹 관련 도구, 취약한 소프트웨어 등 악의적으로 사용될 만한 요소들이 포함된 도커 이미지를 말한다. 공격자들은 위에서 설명한 2가지 방식을 이용하여 악성 도커 이미지들을 만들어내고 있다.
도커 허브에 배포된 악성 도커 이미지들을 개발자 및 관리자가 사용한다면 인프라 망에서 암호화폐 채굴, 디도스, 악성코드 배포 등 악의적인 행위들이 일어날 수 있다.
[그림 12] 공격자들이 업로드한 악성 도커 이미지가 인프라망에서 사용되는 상황
다음은 도커 허브에 배포된 악성 도커 이미지들의 3가지 배포 방식을 정리한 것이다.
1. 정상 도커 이미지 위장 배포
공격자들은 악성 도커 이미지를 배포할 때 도커 이미지 명을 정상 소프트웨어(Ex. Java, Ubuntu, centos 등)로 위장하여 배포했다. 사용자들은 정상으로 위장한 악성 도커 이미지들을 사용하면서 자신도 모르게 악성 행위들로부터 피해를 입게 된다. 이러한 방식으로 공격자들은 암호화폐 채굴 또는 디도스에 사용에 사용되는 컴퓨팅 자원을 보다 빠르고 쉽게 얻을 수 있다.
실제로 도커 허브에 있는 위장 악성 도커 이미지들을 보면 특정 버전명까지 기입했고 몇몇 사용자들은 다운로드까지 한 것으로 나타났다.

2. 정당한 목적으로 도커 이미지 배포
도커 허브에는 위장 악성 도커 이미지가 있는 반면, 이미지 명에 악의적인 요소를 명시하되, 보안 교육, 테스트 등 정당한 목적으로 배포되는 악성 도커 이미지들도 있다.
실제로 해당 도커 이미지들의 다운로드 회수는 2020년 4분기에는 100,000만회 이상이었지만 2021년도 3분기에는 1,000,000회를 상회할만큼 급속도로 증가하고 있다.
[그림 14] 다운로드 회수 증가
이러한 도커 이미지는 정당한 목적으로 사용될 수 있지만, 공격자가 도커 서버를 침해한 후 악성 도커 이미지들을 배포할 때 악용할 수도 있다.
3. 정상 도커 허브 계정을 이용한 공급망형 배포
본 배포 방식은 공격자가 기존 도커 허브 계정을 탈취한 뒤, 계정을 이용해 악성 도커 이미지를 올리는 방식이다.
실제 사례로 도커 허브의 ‘megawebmaster’라는 계정으로 악성 도커 이미지가 업로드된 사건이 발생했다. ‘megawebmaster’라는 계정은 [그림 15]와 같이 기존 ‘cypress’라는 정상 도커 이미지를 꾸준히 배포했던 계정이다.
[그림 15] 도커 허브 계정: megawebmaster
2021년 5월에는 해당 계정으로 ‘dockgeddon’라는 악성 도커 이미지가 업로드되었고, 다운로드 회수 약 2700회를 기록했다.

해당 이미지에는 스캐닝 스크립트와 IRC 기반 악성코드가 포함되어 있었다.
다음으로, 악성 도커 이미지 유형에 대해 살펴보자. 도커 허브에 배포된 악성 도커 이미지 유형은 크게 3가지로 나뉜다.
1. 암호화폐 채굴 유형
최근 가상화폐 가격이 상승함에 따라 암호화폐 채굴 유형의 악성 도커 이미지 증가하고 있다. 암호화폐 채굴에 가장 많이 사용되는 마이너(Miner)는 ‘XMRig’이다. 해당 마이너는 CPU로도 채굴할 수 있으며, 애플리케이션 구조가 간단하고 사용하기 쉽기 때문에 가장 많이 사용된다. 또한 윈도우(Windows)뿐만 아니라 리눅스(Linux) 계열에서도 동작하기 때문에 도커 타겟으로 많이 사용된다.
일반적으로 공격자는 XMRig로 채굴할 때, 기부 비율(donate-level)을 0으로 설정하여 채굴한다. 그리고 XMRig로 실행 시 코인이 입금될 지갑주소를 입력하게 되는데, 명령어 인자 혹은 XMRig 설정 파일(config.json)에 입력시킨다.

2. 도스 유형
악성 도커 이미지의 두 번째 유형은 도스(Denial of Service: DoS)다. 해당 유형은 주로 ‘AESDOS’, ‘KaijiDDoS’ 같은 종류의 악성코드가 도커 이미지 내에 포함되어 공격자로부터 명령어를 받아 TCP, UDP, HTTP 등 도스 공격을 유발한다.
[그림 18] 악성 도커 이미지에 포함된 도스 관련 악성코드(AESDOS, KaijiDDoS)
3. 취약한 소프트웨어 유형
악성 도커 이미지의 세 번째 유형은 취약한 소프트웨어다. 해당 유형은 도커 이미지에 취약점이 존재하는 소프트웨어가 포함되는 것을 말한다. 컨테이너 보안 업체 프리바시오(Prevasio)에 따르면, 도커 허브에 존재하는 400만개 도커 이미지들 중 약 절반이 취약점을 가진 오래된 소프트웨어가 포함되어 있다고 한다. 만약 사용자가 도커 허브에 있는 젠킨스(Jenkins), 아파치 톰캣(Apache Tomcat), 워드프레스(WordPress) 관련 도커 이미지들의 버전을 고려하지 않고 사용하면 취약점 공격 노출될 수 있다.
도커에는 자체적으로 도커 이미지 내에 취약점이 포함되어 있는지 확인할 수 있는 scan 명령어가 있다. 해당 명령어는 도커 이미지 내에 사용된 OS 패키지, 라이브러리 등 애플리케이션에서 CVE(Common Vulnerabilities and Exposures) 취약점이 존재하는지 검사해 피해를 예방할 수 있도록 한다.

진화하는 악성 도커 이미지
공격자들은 도커 허브에 악성 도커 이미지를 배포할 때, 의심받지 않기 위해 악성코드 배포 방법들을 계속 바꾸고 있다. 공격자들이 공격 방법을 어떻게 변화시키는지 간략히 알아본다.
초기에 공격자들이 도커 허브에 배포한 악성 도커 이미지를 보면 [그림 20]과 같이 대부분 도커 계층에 악성코드 파일명과 명령어들이 포함되어 있다. 따라서, 도커 계층을 확인하면 이미지에 악의적인 요소 및 명령어가 포함되어 있는지 확인할 수 있었다.
[그림 20] 도커 계층에 노출된 악의적인 요소 및 명령어
하지만 악성 도커 이미지 공격에 관한 이슈가 알려지면서 공격자들은 도커 계층에서 보이는 악성코드 파일명 및 명령어를 숨기기 위해 악성 스크립트를 만들고 이를 실행시키는 악성 도커 이미지들을 제작하기 시작했다. 이렇게 제작된 이미지는 [그림 21]과 같이 도커 계층에서 악성코드 파일명 및 명령어가 노출되지 않는다.
[그림 21] 도커 계층을 보고 악성 도커 이미지임을 판단할 수 없는 상황
이 때 도커 이미지 내에 포함된 바이너리 파일들을 추출 후, 안티바이러스를 통해 악의적인 요소가 포함되어 있는지 확인해보면 악성 도커 이미지인지 여부를 알 수 있다.

다만 최근에는 공격자들이 앞서 설명했던 도커 계층 검사와 바이러스 검사 두 가지 방법을 우회하기 위해 [그림 23]과 같이 외부 서버로부터 마이너, 실행 스크립트 등 악의적인 파일을 다운로드 받고 실행하도록 도커 이미지를 제작한다.

결론
지금까지 도커 이미지에 대한 개념과 최신 공격 트렌드를 알아보았다. 이제 많은 기업들이 도커를 활발하게 도입하고 있어, 관리자는 도커 이미지에 대한 위협을 사전에 파악해 대응할 수 있어야한다.
다음과 같이 악성 도커 이미지를 피할 수 있는 3가지 방법을 잘 지키면 기존 알려진 도커 이미지 관련 위협들로 인한 피해를 예방하는데 도움이 될 것이다.
1. 신뢰성 있는 도커 이미지 사용
개발자나 관리자 입장에서 도커 이미지에 있는 악성 요소들이 존재하는지 하나 하나 분석하는 것은 현실적으로 많은 제약이 따른다. 따라서, 기본적으로 신뢰성 있는 도커 이미지를 사용하는 것이 중요하다. 신뢰성 있는 도커 이미지란 [그림 24]와 같이 ‘검증된 퍼블리셔(Verified Publisher)와 ‘공식 이미지(Official Images)로 분류된 도커 이미지를 말한다. 이처럼 신뢰성 있는 도커 이미지들을 사용하면 기존 알려진 위협으로 인한 피해를 최소화할 수 있다.

2. 악의적인 요소 검사: 도커 스캔
앞서 설명한 ‘도커 스캔’을 활용하면 도커 이미지 내 존재하는 취약한 요소를 탐지할 수 있다. 도커 스캔은 도커 이미지 내 사용된 소프트웨어에 존재하는 취약점을 스캐닝할 때 보안 업체 ‘snyk’의 취약점 데이터 베이스를 참고한다. 도커 스캔을 통해 취약한 소프트웨어를 발견하면 [그림 25], [그림 26]과 같이 취약한 소프트웨어 이름, 취약점 설명, 취약한 버전, 취약점이 패치된 안전한 버전 등이 출력된다.


또한 취약점 분석 결과를 다양한 방법으로 가공할 수 있도록 ‘--json’ 옵션을 통해 json 형태로도 출력할 수 있다.
도커 스캔 명령어는 윈도우용 도커 소프트웨어에는 기본적으로 포함되어 있지만 리눅스용 도커 소프트웨어는 포함되어 있지 않다. 따라서, 리눅스용의 경우 깃허브(Github)의 도커 저장소(Docker Repository)에서 추가적으로 스캔 플러그인을 설치해야 한다. (도커 저장소: https://github.com/docker/scan-cli-plugin)
3. 악의적인 요소 검사: 동적 분석 프레임워크
최근에는 도커 이미지를 동적 분석할 수 있는 프레임워크 및 서비스들이 출시되고 있다. ‘osquery’는 동적 분석 프레임워크 중 하나로 도커 컨테이너 상에서 일어나는 이벤트를 데이터베이스에 실시간으로 수집할 수 있다.
데이터베이스 내 osquery로 수집된 행위(Ex. xmr 실행, init.d 항목 제거)를 통해 Docker Image 내에 악성코드와 같은 악의적인 요소가 포함되어 있는지 확인할 수 있다.
지금까지 도커 이미지에 대한 개념과 최신 공격 트렌드를 알아보았다. 이제 많은 기업들이 도커를 활발하게 도입하고 있어, 관리자는 도커 이미지에 대한 위협을 사전에 파악해 대응할 수 있어야한다.
위에 설명한 악성 도커 이미지를 피하는 있는 3가지 방법을 잘 지키면 기존 알려진 도커 이미지 관련 위협들로 인한 피해를 예방하는데 도움이 될 것이다.
- AhnLabTI개발팀 이영훈 주임