|
| 1 | +# 컨테이너 이미지 스캐닝 고급 |
| 2 | + |
| 3 | +## SBOM |
| 4 | + |
| 5 | +**SBOM**은 **S**oftware **B**ill **O**f **M**aterials의 약자입니다. |
| 6 | + |
| 7 | +이것은 소프트웨어 애플리케이션 또는 시스템을 구성하는 모든 구성 요소의 목록입니다. |
| 8 | +여기에는 소프트웨어를 구축하는 데 사용되는 다양한 타사 라이브러리, 프레임워크 및 기타 오픈 소스 또는 독점 구성 요소에 대한 정보가 포함됩니다. |
| 9 | +또한 SBOM에는 이러한 구성 요소의 버전, 라이선스 정보, 알려진 취약점 또는 보안 문제에 대한 세부 정보도 포함될 수 있습니다. |
| 10 | + |
| 11 | +SBOM의 목적은 이러한 구성 요소를 나열하여 소프트웨어 사용자에게 소프트웨어 제품에 포함된 구성 요소에 대한 가시성을 제공하고 보안 또는 법적 이유로 유해할 수 있는 구성 요소를 피할 수 있도록 하는 것입니다. |
| 12 | + |
| 13 | +[올해](https://www.immuniweb.com/blog/5-biggest-supply-chain-attacks-in-2022-so-far.html) 와 [작년](https://cyolo.io/blog/top-5-supply-chain-attacks-of-2021/) 지난 몇 년간 대규모 공급망 공격이 발생한 후 SBOM의 사용이 더욱 보편화되었습니다. |
| 14 | + |
| 15 | + |
| 16 | +컨테이너 이미지의 컨텍스트에서, 컨테이너 이미지에 대한 SBOM에는 다음이 포함됩니다: |
| 17 | + |
| 18 | +- 컨테이너에 설치된 리눅스 패키지 및 라이브러리 |
| 19 | +- 컨테이너에서 실행 중인 애플리케이션을 위해 설치된 언어별 패키지(예: Python 패키지, Go 패키지 등) |
| 20 | + |
| 21 | +컨테이너 이미지에서 SBOM을 추출하는 데 도움이 되는 도구가 있습니다. |
| 22 | + |
| 23 | +그러한 도구 중 하나는 [syft](https://github.com/anchore/syft)입니다. |
| 24 | + |
| 25 | +예를 들어, syft를 사용하여 `ubuntu:latest` 컨테이너 이미지에 대한 SBOM을 생성할 수 있습니다: |
| 26 | + |
| 27 | +```console |
| 28 | +$ syft ubuntu |
| 29 | + ✔ Parsed image |
| 30 | + ✔ Cataloged packages [101 packages] |
| 31 | +NAME VERSION TYPE |
| 32 | +adduser 3.118ubuntu5 deb |
| 33 | +apt 2.4.8 deb |
| 34 | +base-files 12ubuntu4.2 deb |
| 35 | +base-passwd 3.5.52build1 deb |
| 36 | +bash 5.1-6ubuntu1 deb |
| 37 | +bsdutils 1:2.37.2-4ubuntu3 deb |
| 38 | +coreutils 8.32-4.1ubuntu1 deb |
| 39 | +dash 0.5.11+git20210903+057cd650a4ed-3build1 deb |
| 40 | +debconf 1.5.79ubuntu1 deb |
| 41 | +debianutils 5.5-1ubuntu2 deb |
| 42 | +diffutils 1:3.8-0ubuntu2 deb |
| 43 | +dpkg 1.21.1ubuntu2.1 deb |
| 44 | +e2fsprogs 1.46.5-2ubuntu1.1 deb |
| 45 | +findutils 4.8.0-1ubuntu3 deb |
| 46 | +gcc-12-base 12.1.0-2ubuntu1~22.04 deb |
| 47 | +gpgv 2.2.27-3ubuntu2.1 deb |
| 48 | +grep 3.7-1build1 deb |
| 49 | +gzip 1.10-4ubuntu4.1 deb |
| 50 | +hostname 3.23ubuntu2 deb |
| 51 | +init-system-helpers 1.62 deb |
| 52 | +libacl1 2.3.1-1 deb |
| 53 | +libapt-pkg6.0 2.4.8 deb |
| 54 | +libattr1 1:2.5.1-1build1 deb |
| 55 | +libaudit-common 1:3.0.7-1build1 deb |
| 56 | +libaudit1 1:3.0.7-1build1 deb |
| 57 | +libblkid1 2.37.2-4ubuntu3 deb |
| 58 | +libbz2-1.0 1.0.8-5build1 deb |
| 59 | +libc-bin 2.35-0ubuntu3.1 deb |
| 60 | +libc6 2.35-0ubuntu3.1 deb |
| 61 | +libcap-ng0 0.7.9-2.2build3 deb |
| 62 | +libcap2 1:2.44-1build3 deb |
| 63 | +libcom-err2 1.46.5-2ubuntu1.1 deb |
| 64 | +libcrypt1 1:4.4.27-1 deb |
| 65 | +libdb5.3 5.3.28+dfsg1-0.8ubuntu3 deb |
| 66 | +libdebconfclient0 0.261ubuntu1 deb |
| 67 | +libext2fs2 1.46.5-2ubuntu1.1 deb |
| 68 | +libffi8 3.4.2-4 deb |
| 69 | +libgcc-s1 12.1.0-2ubuntu1~22.04 deb |
| 70 | +libgcrypt20 1.9.4-3ubuntu3 deb |
| 71 | +libgmp10 2:6.2.1+dfsg-3ubuntu1 deb |
| 72 | +libgnutls30 3.7.3-4ubuntu1.1 deb |
| 73 | +libgpg-error0 1.43-3 deb |
| 74 | +libgssapi-krb5-2 1.19.2-2 deb |
| 75 | +libhogweed6 3.7.3-1build2 deb |
| 76 | +libidn2-0 2.3.2-2build1 deb |
| 77 | +libk5crypto3 1.19.2-2 deb |
| 78 | +libkeyutils1 1.6.1-2ubuntu3 deb |
| 79 | +libkrb5-3 1.19.2-2 deb |
| 80 | +libkrb5support0 1.19.2-2 deb |
| 81 | +liblz4-1 1.9.3-2build2 deb |
| 82 | +liblzma5 5.2.5-2ubuntu1 deb |
| 83 | +libmount1 2.37.2-4ubuntu3 deb |
| 84 | +libncurses6 6.3-2 deb |
| 85 | +libncursesw6 6.3-2 deb |
| 86 | +libnettle8 3.7.3-1build2 deb |
| 87 | +libnsl2 1.3.0-2build2 deb |
| 88 | +libp11-kit0 0.24.0-6build1 deb |
| 89 | +libpam-modules 1.4.0-11ubuntu2 deb |
| 90 | +libpam-modules-bin 1.4.0-11ubuntu2 deb |
| 91 | +libpam-runtime 1.4.0-11ubuntu2 deb |
| 92 | +libpam0g 1.4.0-11ubuntu2 deb |
| 93 | +libpcre2-8-0 10.39-3ubuntu0.1 deb |
| 94 | +libpcre3 2:8.39-13ubuntu0.22.04.1 deb |
| 95 | +libprocps8 2:3.3.17-6ubuntu2 deb |
| 96 | +libseccomp2 2.5.3-2ubuntu2 deb |
| 97 | +libselinux1 3.3-1build2 deb |
| 98 | +libsemanage-common 3.3-1build2 deb |
| 99 | +libsemanage2 3.3-1build2 deb |
| 100 | +libsepol2 3.3-1build1 deb |
| 101 | +libsmartcols1 2.37.2-4ubuntu3 deb |
| 102 | +libss2 1.46.5-2ubuntu1.1 deb |
| 103 | +libssl3 3.0.2-0ubuntu1.7 deb |
| 104 | +libstdc++6 12.1.0-2ubuntu1~22.04 deb |
| 105 | +libsystemd0 249.11-0ubuntu3.6 deb |
| 106 | +libtasn1-6 4.18.0-4build1 deb |
| 107 | +libtinfo6 6.3-2 deb |
| 108 | +libtirpc-common 1.3.2-2ubuntu0.1 deb |
| 109 | +libtirpc3 1.3.2-2ubuntu0.1 deb |
| 110 | +libudev1 249.11-0ubuntu3.6 deb |
| 111 | +libunistring2 1.0-1 deb |
| 112 | +libuuid1 2.37.2-4ubuntu3 deb |
| 113 | +libxxhash0 0.8.1-1 deb |
| 114 | +libzstd1 1.4.8+dfsg-3build1 deb |
| 115 | +login 1:4.8.1-2ubuntu2 deb |
| 116 | +logsave 1.46.5-2ubuntu1.1 deb |
| 117 | +lsb-base 11.1.0ubuntu4 deb |
| 118 | +mawk 1.3.4.20200120-3 deb |
| 119 | +mount 2.37.2-4ubuntu3 deb |
| 120 | +ncurses-base 6.3-2 deb |
| 121 | +ncurses-bin 6.3-2 deb |
| 122 | +passwd 1:4.8.1-2ubuntu2 deb |
| 123 | +perl-base 5.34.0-3ubuntu1.1 deb |
| 124 | +procps 2:3.3.17-6ubuntu2 deb |
| 125 | +sed 4.8-1ubuntu2 deb |
| 126 | +sensible-utils 0.0.17 deb |
| 127 | +sysvinit-utils 3.01-1ubuntu1 deb |
| 128 | +tar 1.34+dfsg-1build3 deb |
| 129 | +ubuntu-keyring 2021.03.26 deb |
| 130 | +usrmerge 25ubuntu2 deb |
| 131 | +util-linux 2.37.2-4ubuntu3 deb |
| 132 | +zlib1g 1:1.2.11.dfsg-2ubuntu9.2 deb |
| 133 | +``` |
| 134 | + |
| 135 | +SBOM에는 컨테이너 이미지 내부에 설치된 패키지와 라이브러리가 포함되어 있을 뿐만 아니라, |
| 136 | +유형과 버전도 나열되어 있습니다. |
| 137 | +이제 이 목록을 취약점 데이터베이스와 상호 참조하여 컨테이너 내부에 취약점이 있는지 확인할 수 있습니다. |
| 138 | + |
| 139 | +그렇다면 **취약점 데이터베이스(Vulnerability Database)**란 무엇인가요? |
| 140 | + |
| 141 | +## 취약점 데이터베이스 |
| 142 | + |
| 143 | +취약점 데이터베이스는 소프트웨어, 하드웨어 및 기타 시스템의 알려진 취약점에 대한 정보 모음입니다. |
| 144 | +일반적으로 취약점의 유형, 취약점의 심각도, 취약점의 잠재적 영향과 같은 취약점의 특성에 대한 세부 정보가 포함됩니다. |
| 145 | +취약점 데이터베이스에는 취약점이 악용될 수 있는 방법과 해당 취약점에 대해 사용 가능한 패치 또는 수정 사항에 대한 정보도 포함될 수 있습니다. |
| 146 | + |
| 147 | +일부 취약점 데이터베이스는 [vuldb.com](https://vuldb.com/), [NIST](https://nvd.nist.gov/vuln), [cvedetails.com](https://www.cvedetails.com/) 및 [Snyk 취약점 데이터베이스](https://security.snyk.io/) 등이 있습니다. |
| 148 | + |
| 149 | +이들 기관은 사용자가 다운로드할 수 있는 API 또는 원시 데이터를 제공하며, SBOM의 패키지와 취약점 정보를 상호 참조할 수 있습니다. |
| 150 | +이렇게 하면 패키지에 주의해야 할 취약점이 있는지 확인할 수 있습니다. |
| 151 | + |
| 152 | +일반적으로 이 취약점이 도입된 라이브러리 버전과 최신 버전에서 취약점이 수정되었는지 여부에 대한 정보도 찾을 수 있습니다. |
| 153 | +이 정보를 사용하여 취약점을 완화하기 위해 종속성을 업데이트/다운그레이드할지 여부를 결정할 수 있습니다. |
| 154 | +[14일차](./day14.md)에서 이미 설명했듯이, 종속성 업데이트에는 동작 또는 API 변경이 수반되는 경우가 있기 때문에 종속성을 업데이트하는 것이 항상 간단한 것은 아닙니다. |
| 155 | + |
| 156 | +취약점에 대한 또 다른 중요한 정보는 취약점의 **CVSS 점수**입니다. |
| 157 | + |
| 158 | +## CVSS |
| 159 | + |
| 160 | +**CVSS**는 **C**ommon **V**ulnerability **S**coring **S**ystem의 약자입니다. |
| 161 | + |
| 162 | +이 시스템은 취약점의 주요 특성을 파악하고 그 심각성을 반영하는 수치 점수를 생성하는 방법을 제공합니다. |
| 163 | +그런 다음 이 수치 점수를 정성적 표현(낮음, 중간, 높음, 심각 등)으로 변환하여 조직이 취약점 관리 프로세스를 적절히 평가하고 우선순위를 정할 수 있도록 도와줍니다. |
| 164 | + |
| 165 | +기본적으로 하나의 취약점이 다른 취약점보다 더 심각할 수 있습니다. |
| 166 | +익스플로잇이 얼마나 쉬운지, 얼마나 큰 피해를 입힐 수 있는지에 따라 취약점의 순위를 객관적으로 매길 수 있는 시스템이 필요합니다. |
| 167 | + |
| 168 | +이것이 바로 CVSS가 필요한 이유입니다. |
| 169 | + |
| 170 | +CVSS v3는 CVSS 점수를 계산하는 8가지 기준을 정의합니다. |
| 171 | +이러한 기준은 다음과 같습니다: |
| 172 | + |
| 173 | +### 공격 벡터 Attack Vector |
| 174 | + |
| 175 | +취약점 악용이 가능한 컨텍스트를 반영합니다. |
| 176 | + |
| 177 | +가능한 값 : **Network(N)**, **Adjacent(A)**, **Local(L)**, **Physical(P)** |
| 178 | + |
| 179 | +### 공격 복잡성 Attack Complexity |
| 180 | + |
| 181 | +취약점을 익스플로잇하기 위해 공격자가 통제할 수 없는 조건에 대해 설명합니다. |
| 182 | + |
| 183 | +가능한 값 : **Low(L)**, **High(H)** |
| 184 | + |
| 185 | +### 필요한 권한 Priviledges Required |
| 186 | + |
| 187 | +공격자가 취약점을 성공적으로 익스플로잇하기 전에 보유해야 하는 권한 수준을 설명합니다. |
| 188 | + |
| 189 | +가능한 값 : **None(N)**, **Low(L)**, **High(H)** |
| 190 | + |
| 191 | +### 사용자 상호작용 User Interaction |
| 192 | + |
| 193 | +공격자 이외의 사용자가 취약한 구성 요소의 성공적인 침해에 참여하기 위한 요구 사항입니다. |
| 194 | + |
| 195 | +가능한 값 : **None(N)**, **Required(R)** |
| 196 | + |
| 197 | +#### 범위 Scope |
| 198 | + |
| 199 | +한 소프트웨어 구성 요소의 취약점이 리소스 또는 권한에 영향을 미칠 수 있는 능력입니다. |
| 200 | + |
| 201 | +가능한 값 : **Unchanged(U)**, **Changed(C)** |
| 202 | + |
| 203 | +### 기밀성 Confidentiality |
| 204 | + |
| 205 | +성공적으로 익스플로잇된 취약점으로 인해 소프트웨어 구성 요소가 관리하는 정보 리소스의 기밀성에 미치는 영향입니다. |
| 206 | + |
| 207 | +가능한 값 : **None(N)**, **Low(L)**, **High(H)** |
| 208 | + |
| 209 | +### 무결성 Integrity |
| 210 | + |
| 211 | +성공적으로 익스플로잇된 취약점이 무결성에 미치는 영향입니다. |
| 212 | + |
| 213 | +가능한 값 : **None(N)**, **Low(L)**, **High(H)** |
| 214 | + |
| 215 | +### 가용성 Availability |
| 216 | + |
| 217 | +성공적으로 익스플로잇된 취약점으로 인해 영향을 받은 구성 요소의 가용성에 미치는 영향입니다. |
| 218 | + |
| 219 | +가능한 값 : **None(N)**, **Low(L)**, **High(H)** |
| 220 | + |
| 221 | +이 8가지 벡터의 조합에 따라 CVSS 점수가 결정됩니다. |
| 222 | +0에서 10 사이입니다. |
| 223 | +0이 가장 낮고 10이 가장 높습니다.(가장 위험) |
| 224 | +[이 곳](https://www.first.org/cvss/calculator/3.0)에서 각 취약점의 점수를 계산할 수 있는 CVSS 계산기를 찾을 수 있습니다. |
| 225 | + |
| 226 | +## 리소스 |
| 227 | + |
| 228 | +<https://www.nist.gov/itl/executive-order-improving-nations-cybersecurity> |
| 229 | + |
| 230 | +<https://www.aquasec.com/cloud-native-academy/supply-chain-security/sbom/> |
| 231 | + |
| 232 | + |
| 233 | +[16일차](day16.md)에서는 "Fuzzing" 또는 Fuzz Test에 대해 살펴보겠습니다. |
0 commit comments