CWE
CWE 는 소프트웨어가 뚫리는 원인을 유형별로 갈라 놓고 유형마다 번호를 하나씩 붙입니다. 서로 다른 회사가 만든 검사 도구와 신고서가 같은 결함을 같은 번호로 부르게 하려는 것입니다. 이를테면 사용자가 넣은 값을 데이터베이스 명령문에 그대로 이어 붙이는 실수가 89번입니다. 개발자는 그 번호를 따라가 무엇이 잘못된 코드인지와 어떻게 고치는지를 읽습니다.
쉽고 빠른 이해
CWE 는 코드가 잘못 짜이는 방식마다 이름과 번호를 붙여 둔 목록입니다. 데이터베이스 명령문에 남의 입력을 그대로 이어 붙이는 실수에 붙은 번호가 89번입니다. 글로 적을 때는 CWE-89 처럼 적습니다.
이게 없으면 같은 결함을 도구마다 다른 말로 부릅니다. 한쪽은 「인젝션」이라 적고 다른 쪽은 「입력 검증 누락」이라 적습니다. 그러면 같은 결함을 두 번 고치거나, 둘 다 남의 몫으로 넘기게 됩니다. 이름이 둘이어도 번호가 하나면 고칠 코드도 한 곳으로 모입니다.
flowchart TD
A["검사 도구 A · 「인젝션」"] --> N["CWE-89"]
B["검사 도구 B · 「입력 검증 누락」"] --> N
N --> F["고칠 코드 한 곳"]
쓰는 순서는 이렇습니다.
- 검사 도구나 신고서가 찾아낸 결함에 번호를 답니다
- 그 번호의 항목을 펴서 무엇이 왜 위험한지 읽습니다
- 같은 항목에 적힌 막는 법대로 코드를 고칩니다
방식에 번호를 다는 데까지가 이 목록의 몫입니다. 어느 제품에서 실제로 터진 사건을 가리키는 일은 여기서 안 합니다.
대가는 번호를 고르는 판단이 사람 손에 남는다는 것입니다. 한 사건에 결함이 여럿 겹치면 누구는 넓은 번호를, 누구는 좁은 번호를 매깁니다. 그래서 팀마다 집계가 어긋납니다.
상세
CWE 는 Common Weakness Enumeration 을 줄인 이름입니다. 우리말로 옮기면 공통 약점 목록입니다.
약점은 그 자체로 사고가 아니라, 사고가 날 수 있게 만드는 코드의 성질을 말합니다.
글로 적을 때는 CWE-89 처럼 목록 이름을 번호 앞에 붙입니다.
목록을 펴내고 손보는 곳은 미국의 비영리 연구기관 MITRE 입니다. 같은 곳이 CVE(Common Vulnerabilities and Exposures, 공개된 취약점 목록)도 함께 운영합니다.
이 절은 약점과 취약점을 가르는 데서 시작해 항목 하나의 속과 항목들이 놓인 층, 번호를 만나는 곳까지 봅니다.
약점과 취약점
약점은 코드가 잘못 짜이는 방식입니다. 취약점은 그 방식으로 짜인 어느 제품의 실물입니다. 질의문을 문자열로 이어 붙이는 습관이 약점입니다. 그 습관 때문에 뚫린 어느 게시판 제품이 취약점입니다.
번호를 매기는 목록도 둘로 갈립니다. 방식에 번호를 붙이는 쪽이 CWE 입니다. 사건 하나하나에 번호를 붙이는 쪽이 CVE 입니다.
| 약점 | 취약점 | |
|---|---|---|
| 무엇에 번호를 붙이나 | 코드가 잘못 짜이는 방식 | 어느 제품에 실제로 난 구멍 |
| 번호를 매기는 목록 | CWE | CVE |
| 예 | 입력을 질의문에 이어 붙인다 | 어느 게시판 제품의 검색 화면이 그렇게 짜였다 |
| 고쳐야 하는 사람 | 그 방식으로 짜는 모든 팀 | 그 제품을 만든 팀과 쓰는 팀 |
표의 마지막 줄이 이 목록을 따로 두는 까닭입니다. 취약점 하나를 막는 일은 그 제품을 고치면 끝납니다. 약점 하나를 막는 일은 같은 습관을 가진 모든 코드에 걸립니다.
수는 한쪽으로 쏠립니다. 같은 습관으로 짜인 제품이 여럿이면 약점 하나 아래에 사건이 여럿 매달립니다.
flowchart TD
V1["게시판 제품의 사건"] -->|분류된다| W["CWE-89"]
V2["쇼핑몰 제품의 사건"] -->|분류된다| W
V3["사내 관리 도구의 사건"] -->|분류된다| W
화살표 방향이 실무의 방향입니다. 공개된 취약점 기록에는 「이 사건은 89번 약점이다」 같은 분류가 함께 붙습니다.
항목 하나가 담는 내용
89번 항목을 펴 보면 이렇게 생겼습니다. 89번은 SQL 인젝션을 다루는 항목입니다. 이 목록에서 가장 많이 인용됩니다. SQL(Structured Query Language, 구조화 질의 언어)은 데이터베이스에 보내는 명령을 글자로 적는 언어입니다.
항목 한 벌은 다섯 칸으로 되어 있습니다. 위에서 아래로 이 순서로 놓입니다.
| 칸 | 89번 항목에 적히는 것 |
|---|---|
| 정의 한 문장 | 바깥에서 들어온 입력으로 명령을 만들면서 뜻을 바꾸는 특수 문자를 안 걸러낸다 |
| 원인과 잃는 것 | 질의문을 글자로 이어 붙여 만든다 · 남의 자료가 읽히거나 지워진다 |
| 취약한 코드와 고친 코드 | 언어마다 「이렇게 짜면 뚫린다」와 「이렇게 고친다」를 나란히 싣는다 |
| 막는 법 | 설계 때 할 일과 코드를 짤 때 할 일을 나눠 적는다 |
| 다른 항목과의 연결 | 위의 넓은 갈래 · 아래의 좁은 형태 · 짝이 되는 공격 수법 |
순서에는 뜻이 있습니다. 위의 세 칸은 읽는 사람이 자기 코드에서 같은 꼴을 알아보게 합니다. 아래 두 칸은 알아본 다음에 무엇을 할지 알려 줍니다.
마지막 칸이 다음 절로 이어집니다. 89번 위에 무엇이 있고 아래에 무엇이 붙는지를 번호로 걸어 두기 때문입니다.
넓은 항목과 좁은 항목
항목은 평평하게 나열되어 있지 않습니다. 넓은 갈래 아래에 좁은 갈래가 매달리는 층으로 놓입니다. MITRE 는 이 층에 기둥(Pillar) · 분류(Class) · 기본(Base) · 변종(Variant)이라는 이름을 붙여 두었습니다.
flowchart TD
P["기둥 · 남의 입력을 제대로 안 거른다"]
P --> C1["분류 · 명령문에 남의 입력이 섞인다"]
P --> C2["분류 · 내보내는 값을 안 감싼다"]
C1 --> B1["기본 · SQL 인젝션"]
C1 --> B2["기본 · 운영체제 명령 주입"]
B1 --> V1["변종 · 어느 질의 함수에 매인 SQL 인젝션"]
B1 --> V2["변종 · 어느 데이터베이스 제품에 매인 SQL 인젝션"]
한 층에는 형제가 여럿 섭니다. 기둥 하나 아래에 분류가 여럿 붙고, 분류 하나 아래에 기본이 여럿 붙습니다. SQL 인젝션은 기본 층에 섭니다. 그 옆에는 운영체제에 명령을 넘기는 명령 주입 같은 형제가 있습니다.
아래로 내려갈수록 고칠 거리가 또렷해집니다. 위로 올라갈수록 여러 결함을 한 묶음으로 세기 좋아집니다. 신고서에 기둥 층 번호만 적혀 오면 무엇을 고쳐야 할지 알 수 없습니다. 반대로 변종 층으로만 세면 같은 뿌리를 가진 결함들이 서로 다른 칸에 흩어집니다.
이 번호를 쓰는 곳
첫째는 검사 도구의 보고서입니다. 정적 분석 도구는 코드를 실행하지 않고 읽어서 의심스러운 코드를 찾아냅니다. 찾은 것마다 CWE 번호를 답니다. 도구를 다섯 개 돌려도 번호가 같으면 같은 결함입니다.
둘째는 신고서입니다. 버그 바운티(바깥 사람이 찾아낸 결함을 신고하면 보상하는 제도) 신고나 사내 보안 검토는 「무엇이 위험한가」를 설명하는 대신 번호 하나를 적습니다. 읽는 사람이 그 번호의 항목을 펴면 설명이 이미 적혀 있습니다.
셋째는 상위 목록입니다. OWASP(Open Worldwide Application Security Project, 공개 웹 애플리케이션 보안 프로젝트)가 펴내는 OWASP Top 10 은 웹에서 자주 터지는 위험을 열 칸으로 묶습니다. 칸마다 그 안에 드는 CWE 번호가 달려 있습니다. 큰 칸의 이름만 보고는 무엇을 고칠지 모르니 번호까지 내려가 읽습니다.
넷째는 해마다 나오는 순위표입니다. MITRE 는 실제 신고 자료를 모아 위험이 큰 약점 스물다섯 개를 추려 내놓습니다. 이 순위표를 CWE Top 25 라고 부릅니다. 막을 것은 많고 사람은 모자랄 때 무엇부터 볼지 정하는 잣대로 씁니다.
번호 고르기가 갈리는 대목
한 사건에는 대개 약점이 여럿 겹칩니다. 들어온 입력을 안 걸렀고, 내보내는 값도 안 감쌌고, 권한도 안 봤을 수 있습니다. 어느 것을 대표로 적을지는 적는 사람이 정합니다.
층을 고르는 기준도 사람마다 다릅니다. 같은 결함을 누구는 넓은 분류로 적고 누구는 좁은 변종으로 적습니다. 그러니 번호별 집계는 어느 층에서 셌는지를 같이 보지 않으면 견줄 수 없습니다.
목록이 코드를 고쳐 주지는 않습니다. 막는 법은 방향을 알려 주는 문장입니다. 우리 코드에 맞는 수정은 우리가 만들어야 합니다. 번호를 달았다는 것과 결함이 없어졌다는 것은 다른 일입니다.
관련 항목
CWE 번호가 자주 붙는 약점
SQL 인젝션 · 교차 사이트 스크립팅 · 교차 사이트 요청 위조 · 경로 탐색 · 명령 주입 · 버퍼 오버플로 · 정수 오버플로 · 사용 후 해제 · 안전하지 않은 역직렬화 · 하드코딩된 자격 증명 · 경쟁 상태 · 널 포인터 역참조
CWE 와 짝을 이루는 보안 식별 체계
CVE · NVD · CVSS · CAPEC · MITRE ATT&CK · CPE
이 목록을 펴내거나 인용하는 기관·문서
MITRE · OWASP · OWASP Top 10 · CWE Top 25 · OWASP ASVS · NIST · CISA
약점을 찾아내는 검사 방법
정적 분석 · 동적 분석 · 퍼징 · 소프트웨어 구성 분석 · 코드 리뷰 · 침투 테스트 · 버그 바운티 · 의존성 스캔
약점을 줄이려고 지키는 규칙
시큐어 코딩 · 입력 검증 · 출력 인코딩 · 준비된 문장 · 최소 권한 원칙 · 시크릿 관리 · 위협 모델링 · 보안 엔지니어링
약점이 사고로 번지는 단계
다른 이름: Common Weakness Enumeration · 공통 약점 목록 · 공통 취약점 유형 목록