CVSS
고친 사람 github-actions[bot]
CVSS 는 보안 구멍 하나가 얼마나 심각한지를 0점부터 10점 사이의 점수로 매깁니다. 공격이 얼마나 쉬운지와 뚫리면 무엇을 잃는지를 정해진 질문 몇 개로 묻습니다. 그 답으로 점수를 계산합니다. 개발자는 이 점수를 보고 쌓인 보안 경고 가운데 무엇부터 고칠지 정합니다.
쉽고 빠른 이해
CVSS 는 보안 구멍마다 붙이는 심각도 점수입니다. 로그인 없이 인터넷 너머에서 서버의 데이터를 다 읽고, 바꾸고, 서비스를 멈출 수 있는 구멍이면 9.8점을 받습니다.
이게 없으면 「심각하다」의 뜻이 회사마다 달라집니다. 검사 도구가 경고 수십 개를 내놓아도 무엇부터 고칠지 가를 잣대가 없습니다. 점수 하나로 줄 세우면 급한 것부터 손댈 수 있습니다.
점수는 이렇게 나옵니다.
- 공격이 얼마나 쉬운지를 묻습니다. 어디서 공격하나, 로그인이 필요한가 같은 질문입니다
- 뚫리면 무엇을 잃는지를 묻습니다. 데이터를 읽히나, 바뀌나, 서비스가 멈추나입니다
- 답을 정해진 식에 넣어 점수를 냅니다. 점수 구간에 따라 낮음부터 치명까지 등급을 붙입니다
대가는 점수가 구멍 자체의 성질만 본다는 것입니다. 그 구멍이 우리 서비스에서 닿는지, 지금 공격에 쓰이고 있는지는 점수에 안 들어갑니다. 점수가 높다고 늘 가장 급한 일은 아닙니다.
상세
CVSS 는 Common Vulnerability Scoring System 을 줄인 이름입니다. 우리말로는 공통 취약점 점수 체계라고 옮깁니다.
취약점은 공격자가 파고들어 소프트웨어가 원래 하지 않을 일을 하게 만드는 결함입니다. 앞에서 보안 구멍이라고 부른 것이 이것입니다. CVSS 는 그 취약점이 얼마나 심각한지를 누구나 같은 방식으로 재게 해 주는 점수표입니다.
점수표가 하나로 정해져 있지 않으면 한 회사의 「심각」과 다른 회사의 「심각」을 견줄 수 없습니다. 경고가 여러 곳에서 쏟아질 때 무엇이 더 급한지 가를 방법도 없어집니다. CVSS 는 질문과 계산식을 문서로 못박아 이 문제를 풉니다.
점수 매기는 법을 정한 문서는 FIRST(Forum of Incident Response and Security Teams, 침해사고 대응팀 포럼)가 펴냅니다. FIRST 는 보안 사고 대응팀들이 모인 미국의 비영리 단체입니다.
지금 널리 쓰이는 판은 3.1 판과 4.0 판입니다. 4.0 판은 2023년 11월에 나왔습니다. 오래된 기록에는 2.0 판 점수도 남아 있습니다.
이 절은 3.1 판을 기준으로 씁니다. 4.0 판이 바꾼 것은 뒤에서 따로 봅니다.
점수와 등급
점수는 0.0부터 10.0까지 소수점 한 자리로 매깁니다. 사람이 한눈에 읽도록 점수 구간마다 등급 이름도 붙입니다.
| 등급 | 영문 표기 | 점수 |
|---|---|---|
| 없음 | None | 0.0 |
| 낮음 | Low | 0.1 ~ 3.9 |
| 중간 | Medium | 4.0 ~ 6.9 |
| 높음 | High | 7.0 ~ 8.9 |
| 치명 | Critical | 9.0 ~ 10.0 |
검사 도구와 보안 공지는 점수와 등급을 함께 적습니다. 7.8 HIGH 라고 적혀 있으면 높음 등급의 7.8점입니다.
이 구간표는 3.1 판과 4.0 판이 같습니다.
공격 난이도를 재는 지표
점수의 바탕은 기본 지표입니다. 기본 지표는 취약점 자체의 성질을 묻는 질문들이라서, 누가 언제 재도 답이 같아야 합니다. 기본 지표의 답만으로 계산한 점수를 기본 점수라고 부릅니다.
기본 지표는 둘로 나뉩니다. 앞의 넷은 공격이 얼마나 쉬운지를 묻는 악용 가능성 지표(Exploitability)입니다.
| 지표 | 묻는 것 | 답 |
|---|---|---|
| AV(Attack Vector, 공격 경로) | 공격자가 어디서 손을 뻗나 | 네트워크 · 인접 · 로컬 · 물리 |
| AC(Attack Complexity, 공격 복잡도) | 공격자가 어쩔 수 없는 조건이 맞아떨어져야 하나 | 낮음 · 높음 |
| PR(Privileges Required, 필요 권한) | 공격 전에 계정이나 권한을 갖고 있어야 하나 | 없음 · 낮음 · 높음 |
| UI(User Interaction, 사용자 관여) | 피해자가 링크를 누르는 것처럼 무언가 해 줘야 하나 | 없음 · 필요 |
공격 경로는 공격자가 얼마나 멀리서 올 수 있는지를 봅니다. 네트워크면 인터넷 너머 어디서든 옵니다. 인접은 같은 사내망이나 같은 와이파이처럼 가까운 네트워크 안에서만 닿는 경우입니다. 로컬은 그 기계 안에서 코드를 돌릴 수 있어야 닿습니다. 물리는 기계를 손으로 만져야 닿습니다.
공격 복잡도가 높음이면 공격자가 손쓸 수 없는 조건이 맞아야 공격이 통합니다. 이를테면 특정 설정이 켜져 있어야 하거나, 두 요청이 아주 좁은 시간 틈에 겹쳐야 하는 경우입니다.
네 질문 모두 답이 공격자에게 쉬운 쪽일수록 점수가 올라갑니다. 로그인 없이 인터넷 너머에서 아무 조건 없이 통하는 취약점이 이 넷에서 가장 높은 점수를 받습니다.
피해 크기를 재는 지표
나머지 셋은 영향 지표(Impact)입니다. 뚫린 뒤 무엇을 잃는지를 묻습니다. 보안이 지키려는 성질 셋을 하나씩 짚습니다.
| 지표 | 무엇을 잃나 | 답 |
|---|---|---|
| C(Confidentiality, 기밀성) | 남이 보면 안 되는 데이터를 읽힌다 | 높음 · 낮음 · 없음 |
| I(Integrity, 무결성) | 데이터나 동작을 남이 바꾼다 | 높음 · 낮음 · 없음 |
| A(Availability, 가용성) | 서비스를 쓸 수 없게 된다 | 높음 · 낮음 · 없음 |
높음은 그 성질을 전부 잃는 경우입니다. 데이터베이스 전체를 읽히거나 서버를 멈춰 세울 수 있으면 높음입니다. 낮음은 일부만 잃거나, 공격자가 무엇을 가져갈지 고를 수 없는 경우입니다.
피해가 번지는 범위
마지막 질문 S(Scope, 범위)는 피해가 취약점이 있는 부품 밖으로 번지는지를 묻습니다. 답은 유지(Unchanged)와 바뀜(Changed) 둘입니다.
가상 머신 안의 취약점으로 바깥 호스트까지 건드리게 되면 바뀜입니다. 교차 사이트 스크립팅도 대개 바뀜으로 매깁니다. 취약점은 웹 서버의 코드에 있는데 피해는 사용자의 브라우저에서 나기 때문입니다. 범위가 바뀜이면 같은 피해라도 점수가 올라갑니다.
벡터 문자열
여덟 질문의 답을 한 줄로 적은 것을 벡터 문자열이라고 부릅니다. 점수만 보면 왜 그 점수인지 모릅니다. 벡터를 같이 적어 두면 누구든 같은 답으로 점수를 다시 계산할 수 있습니다.
아래는 로그인 없이 인터넷 너머에서 데이터를 다 읽고, 바꾸고, 멈출 수 있는 취약점의 벡터입니다. 한 칸씩 끊어 적었습니다.
CVSS:3.1 // 3.1 판으로 계산했다
AV:N // 네트워크 너머에서
AC:L // 조건 없이 늘 통하고
PR:N // 로그인이 필요 없고
UI:N // 피해자가 할 일도 없다
S:U // 피해는 그 부품 안에 머물고
C:H // 데이터를 다 읽고
I:H // 다 바꾸고
A:H // 멈출 수 있다
적을 때는 칸을 빗금(/)으로 이어 한 줄로 씁니다. 앞머리의 CVSS:3.1 이 어느 판으로 계산했는지를 알려 줍니다.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
이 벡터의 점수는 9.8, 등급은 치명입니다.
답을 바꾸면 점수가 움직이는 폭
점수는 답을 FIRST 가 공개한 식에 넣어 계산합니다. 손으로 계산하는 일은 드뭅니다. FIRST 가 내놓은 계산기나 라이브러리에 벡터를 넣으면 점수가 나옵니다.
아래 표는 앞의 9.8점 벡터에서 답을 조금씩 바꿔 본 것입니다. 어느 답이 점수를 크게 움직이는지 보입니다.
| 바꾼 답 | 달라진 칸 | 점수 | 등급 |
|---|---|---|---|
| 바꾸지 않음 | 없음 | 9.8 | 치명 |
| 피해가 부품 밖으로 번짐 | S:C |
10.0 | 치명 |
| 공격에 좁은 조건이 필요함 | AC:H |
8.1 | 높음 |
| 이미 로그인한 사용자가 그 기계 안에서 공격함 | AV:L PR:L |
7.8 | 높음 |
| 읽기만 되고 바꾸거나 멈추지는 못함 | I:N A:N |
7.5 | 높음 |
| 기계를 손으로 만져야 함 | AV:P |
6.8 | 중간 |
가장 크게 떨어지는 것은 공격 경로를 물리로 바꾼 줄입니다. 칸 하나만 바꿨는데 중간 등급까지 내려갑니다. 반대로 범위를 바뀜으로 바꾸면 점수가 끝인 10.0까지 오릅니다.
넷째 줄과 다섯째 줄은 두 칸을 함께 바꿨습니다. 실제로 흔히 보는 모양 하나를 적으려면 두 답이 같이 바뀌기 때문입니다. 다섯째 줄은 데이터를 읽기만 하는 취약점이라서 바꾸기와 멈추기가 함께 없음이 됩니다.
넷째 줄은 권한 상승 취약점에 흔한 모양입니다. 낮은 권한으로 들어와 있는 사용자가 관리자 권한을 얻는 경우입니다. 인터넷 너머에서 오는 공격보다 점수는 낮지만 여전히 높음 등급에 듭니다.
기본 점수 밖의 지표
기본 지표 말고도 지표 묶음이 둘 더 있습니다. 둘 다 기본 점수를 받아 각자의 사정에 맞게 고쳐 쓰는 데 씁니다.
시간 지표(Temporal)는 시간이 지나며 바뀌는 사정을 봅니다. 공격 코드가 공개됐는지, 고친 판이 나왔는지 같은 것입니다. 이 지표는 점수를 깎기만 합니다. 공격 코드가 아직 없거나 고친 판이 나와 있으면 내려갑니다. 공격 코드가 돌아다니면 기본 점수에 머뭅니다.
환경 지표(Environmental)는 그 취약점이 우리 조직에서 어떤 의미인지를 봅니다. 그 시스템에 담긴 데이터가 얼마나 중요한지, 우리 쪽 설정 때문에 공격 경로가 막혀 있는지 같은 것을 답으로 넣습니다. 이 답은 취약점을 공개하는 쪽이 알 수 없어서 쓰는 쪽이 직접 매깁니다. 점수를 올리기도 하고 내리기도 합니다.
flowchart TD
B["기본 지표 · 취약점 자체의 성질"] --> BS["기본 점수 · 공개하는 쪽이 매긴다"]
BS --> T["시간 지표로 고친다 · 쓰는 쪽이 매긴다"]
T --> E["환경 지표로 고친다 · 쓰는 쪽이 매긴다"]
E --> F["우리가 쓰는 점수"]
그림에서 공개하는 쪽이 채우는 칸은 기본 점수까지입니다. NVD(National Vulnerability Database, 미국 국가 취약점 데이터베이스) 같은 공개 데이터베이스에 적힌 점수도 대개 기본 점수뿐입니다. 나머지 두 단계는 쓰는 쪽이 직접 해야 채워집니다. 두 단계를 다 거친 점수가 그림 끝의 「우리가 쓰는 점수」입니다.
4.0 판에서 달라진 것
4.0 판은 뼈대를 유지한 채 질문과 묶음을 손봤습니다. 벡터 머리가 CVSS:4.0 이라 판을 바로 가를 수 있습니다.
| 3.1 판 | 4.0 판 | |
|---|---|---|
| 지표 묶음 | 기본 · 시간 · 환경 | 기본 · 위협 · 환경 · 보조 |
| 피해가 번지는 범위 | 범위 한 칸으로 번짐 여부를 묻는다 | 범위를 없앴다. 취약한 시스템의 피해와 뒤따르는 시스템의 피해를 따로 묻는다 |
| 공격의 조건 | 공격 복잡도 한 칸 | 공격 복잡도에 공격 전제 조건(Attack Requirements) 칸을 더했다 |
| 등급 구간 | 없음부터 치명까지 다섯 | 같다 |
시간 지표는 4.0 판에서 위협 지표로 이름이 바뀌었습니다. 새로 생긴 보조 지표는 점수에 안 들어가고 참고 정보만 덧붙입니다.
뒤따르는 시스템은 취약한 시스템을 거쳐 피해가 이어지는 곳입니다. 앞의 범위 절에서 본 가상 머신 밖의 호스트와 교차 사이트 스크립팅을 당한 사용자의 브라우저가 그 예입니다.
공격 전제 조건은 3.1 판의 공격 복잡도가 함께 묻던 것 가운데 일부를 떼어 낸 칸입니다. 공격자 손 밖에서 대상 시스템이 갖춰야 하는 조건을 묻습니다. 앞에서 예로 든 특정 설정과 좁은 시간 틈이 여기로 옮겨 왔습니다. 4.0 판의 공격 복잡도에는 공격자가 보안 장치를 피해 가려고 직접 해야 하는 일만 남았습니다.
같은 취약점이라도 판이 다르면 계산식이 달라 점수가 다를 수 있습니다. 두 점수를 나란히 견줄 때는 벡터 머리의 판부터 맞춥니다.
백엔드 개발자가 점수를 만나는 곳
가장 자주 만나는 곳은 의존성 스캔입니다. 빌드 때 도구가 프로젝트가 쓰는 라이브러리와 그 판을 읽습니다. 그 판에 알려진 취약점이 있으면 CVE(Common Vulnerabilities and Exposures, 공개된 취약점마다 붙이는 번호) 번호와 함께 점수와 등급을 보여 줍니다.
점수로 빌드의 기준을 세우기도 합니다. CI(Continuous Integration, 지속적 통합)에서 높음 이상인 취약점이 하나라도 나오면 빌드를 멈추는 식입니다. 기준 점수를 어디에 둘지는 팀이 정합니다.
컨테이너 이미지 검사 결과와 라이브러리의 보안 공지에도 같은 점수가 붙습니다. 점수 옆에 벡터가 적혀 있으면 어느 답 때문에 점수가 높은지 읽어 낼 수 있습니다. 앞의 표처럼 칸을 하나씩 풀어 보면 됩니다.
점수가 알려 주지 않는 것
CVSS 점수는 취약점이 얼마나 심각한지를 잽니다. 우리 서비스가 그 취약점으로 얼마나 위험한지는 따로 따져야 합니다. 둘을 섞으면 급하지 않은 일에 먼저 손이 갑니다.
이를테면 9.8점 취약점이 라이브러리 안에 있어도 우리 코드가 그 기능을 부르지 않으면 공격이 닿지 않습니다. 반대로 중간 등급의 교차 사이트 스크립팅도 로그인 화면에 있으면 먼저 고칠 일이 될 수 있습니다. 로그인 화면은 모든 사용자가 거칩니다. 거기서 공격자의 스크립트가 돌면 사용자가 입력하는 비밀번호를 가로챌 수 있습니다.
환경 지표는 이런 차이를 점수에 넣으려고 있는 묶음입니다.
점수는 지금 이 취약점이 공격에 쓰이고 있는지도 알려 주지 않습니다. 그 질문에는 다른 점수와 목록이 답합니다. EPSS(Exploit Prediction Scoring System, 공격 발생 예측 점수 체계)는 한 취약점이 앞으로 30일 안에 공격에 쓰일 확률을 계산합니다.
CISA(Cybersecurity and Infrastructure Security Agency, 사이버보안·기반시설 보안청)는 미국의 사이버보안 기관입니다. 이 기관은 이미 공격에 쓰인 것으로 확인된 취약점을 CISA KEV(Known Exploited Vulnerabilities, 알려진 악용 취약점 목록)라는 목록으로 모아 관리합니다.
같은 취약점에 매긴 점수가 곳마다 다를 수도 있습니다. 취약점을 공개한 제조사와 NVD 가 질문에 서로 다른 답을 골라 계산하기 때문입니다. 공지마다 점수가 엇갈리면 벡터를 나란히 놓고 어느 칸이 다른지부터 봅니다.
관련 항목
CVSS 점수가 따라붙는 취약점 식별 체계
CVSS 가 피해를 재는 보안 성질
CVSS 점수를 보완하는 위험 지표
EPSS · CISA KEV · SSVC · 위험 평가 · 위협 모델링
CVSS 를 펴내거나 점수를 매기는 기관
FIRST · NIST · MITRE · CISA · CNA
CVSS 점수를 읽어 쓰는 검사 도구와 절차
의존성 스캔 · 소프트웨어 구성 분석 · 컨테이너 이미지 스캔 · 취약점 스캐너 · 취약점 관리 · 패치 관리 · SBOM
CVSS 점수가 매겨지는 대표적인 결함 종류
권한 상승 · 원격 코드 실행 · 교차 사이트 스크립팅 · SQL 인젝션 · 서비스 거부 · 버퍼 오버플로 · 경쟁 상태
취약점을 분류하거나 순위를 매기는 다른 목록
OWASP · OWASP Top 10 · MITRE ATT&CK · CAPEC
다른 이름: Common Vulnerability Scoring System · 공통 취약점 점수 체계