컴퓨터 코드는 완벽하지 않기 때문에 취약점이 존재할 수 있다.
나쁜 의도를 가진 사람이 취약점을 발견하면, 시스템을 공격할 때에 취약점을 쓸 수 있다. 반면 좋은 의도를 가진 사람이 취약점을 발견한다면 그 내용을 세상에 알리고, 이 내용을 알게 된 사람들은 코드를 수정하고, 소프트웨어를 업데이트하여 더욱 안전한 시스템을 만들 수 있다.
CVE는 취약점을 가진 다른 도구, 저장소 및 서비스 간에 데이터를 공유하기 위해 만들어진, "공개적으로 알려진 소프트웨어의 보안 취약점을 가리키는 고유 표기"를 의미한다.
CVE 체계는 미국 비영리 회사인 MITRE사에서 1999년 처음 만들어 운영하기 시작했다. 이후 미국 국립표준기술연구소(NIST)가 국가 취약성 데이터베이스(NVD)를 만들어 협력체계를 구축하면서 체계화되기 시작됐다.
각 CVE에는 CVE-해당년도-취약점번호의 형식으로 이루어진 식별자가 부여되며, 0-10 사이의 숫자 및 NONE, LOW, MEDIUM, HIGH, CRITICAL 중 하나의 등급으로 표시되는 심각도가 부여된다.
심각도에 따라 어떤 취약점을 먼저 조치해야 할 지, 어떤 부분에 더 신경을 쓰고 어떤 부분에는 덜 신경을 써도 될 지 파악할 수 있다.
최근 큰 이슈가 되었던, Log4Shell 취약점(CVE-2021-44228)을 확인해보면, 심각도가 10.0 CRITICAL로 표시되어 있는 것을 볼 수 있다.
https://nvd.nist.gov/vuln/detail/CVE-2021-44228
그렇다면, 컨테이너 내에 어떤 취약점이 있는지는 어떻게 알 수 있을까?
CVE Scanner를 사용하여, 컨테이너 이미지 내에 포함되어 있는 취약점을 진단할 수 있다. 진단 결과를 확인하고, 취약점이 있는 패키지를 업데이트하거나, 불필요한 패키지를 삭제하는 등 조치를 취할 수 있다.
결국 설치되어 있는 패키지가 많으면, 그만큼 취약점이 많이 발생할 수 있는 위험이 있기 때문에 불필요한 패키지를 식별하고 삭제하여 공격할 수 있는 범위를 줄이는 것이 바람직하다.
Trivy는 Aqua Security에서 제작한 취약점 스캐너로, 사용법이 간단하고, CI/CD와 통합해서 사용이 가능하다. 컨테이너 이미지, 파일 시스템 등에 대한 취약점 스캔을 할 수 있다.
Ubuntu 기준으로 다음과 같이 설치가 가능하다.
$ wget https://github.com/aquasecurity/trivy/releases/download/v0.22.0/trivy_0.22.0_Linux-64bit.deb
$ sudo dpkg -i trivy_0.22.0_Linux-64bit.deb
trivy image 또는 trivy i 명령어를 사용해서 이미지를 스캔할 수 있다.
$ trivy i python:3.10.0a4-alpine
2021-12-29T17:03:01.390Z INFO Detected OS: alpine
2021-12-29T17:03:01.390Z INFO Detecting Alpine vulnerabilities...
2021-12-29T17:03:01.392Z INFO Number of language-specific files: 1
2021-12-29T17:03:01.392Z INFO Detecting python-pkg vulnerabilities...
python:3.10.0a4-alpine (alpine 3.12.3)
======================================
Total: 43 (UNKNOWN: 0, LOW: 2, MEDIUM: 8, HIGH: 30, CRITICAL: 3)
+-----------------------+------------------+----------+-------------------+------------------+---------------------------------------+
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE |
+-----------------------+------------------+----------+-------------------+------------------+---------------------------------------+
| apk-tools | CVE-2021-36159 | CRITICAL | 2.10.5-r1 | 2.10.7-r0 | libfetch before 2021-07-26, as |
| | | | | | used in apk-tools, xbps, and |
| | | | | | other products, mishandles... |
| | | | | | -->avd.aquasec.com/nvd/cve-2021-36159 |
+ +------------------+----------+ +------------------+---------------------------------------+
| | CVE-2021-30139 | HIGH | | 2.10.6-r0 | In Alpine Linux apk-tools |
| | | | | | before 2.12.5, the tarball |
| | | | | | parser allows a buffer... |
| | | | | | -->avd.aquasec.com/nvd/cve-2021-30139 |
+-----------------------+------------------+ +-------------------+------------------+---------------------------------------+
| busybox | CVE-2021-28831 | | 1.31.1-r19 | 1.31.1-r20 | busybox: invalid free or segmentation |
| | | | | | fault via malformed gzip data |
...
옵션을 사용하여 특정 심각도에 해당하는 취약점만 출력하거나, 픽스되지 않은 취약점은 제외하고 출력할 수 있다. 출력결과를 파일에 저장할 수도 있다.
$ trivy i --severity CRITICAL,HIGH python:3.10.0a4-alpine
$ trivy i --ignore-unfixed python:3.10.0a4-alpine
$ trivy i --severity HIGH --output /root/python.txt python:3.10.0a4-alpine
docker save 명령어로 이미지를 tar 파일에 저장한 경우에도 스캔이 가능하다.
$ trivy i --input python.tar