← 목록으로

취약점 분석 방법론: 코드 리뷰, 패치 Diffing, 퍼징

[HowTo] 방법론 · 작성: 2026-07-19 19:41:12 · 조회 7

새로운 취약점을 발견하는 접근법은 크게 세 가지로 나뉜다 — 소스 코드를 사람이 직접 읽는 코드 리뷰, 패치 전후 바이너리/코드를 비교하는 패치 Diffing, 그리고 자동으로 수많은 입력을 대입해보는 퍼징. 실무에서는 이 셋을 상황에 맞게 섞어서 쓴다.

1. 코드 리뷰 기반 분석

소스 코드가 있을 때(오픈소스, 또는 계약상 코드 접근이 허용된 화이트박스 점검) 가장 정확한 방법이다.

어디부터 봐야 하는가

전체 코드를 처음부터 읽는 건 비효율적이다. 취약점이 몰려있을 확률이 높은 지점부터 우선순위를 둔다.

데이터 흐름 추적

사용자 입력이 어디서 들어와서(source) 어디서 위험하게 쓰이는지(sink)까지, 중간에 검증/이스케이프 없이 그대로 이어지는 경로(taint path)를 손으로 따라간다. semgrep, CodeQL 같은 정적 분석 도구로 흔한 패턴을 자동 스캔한 뒤, 결과를 사람이 다시 검증하는 방식이 실무에서 일반적이다.

2. 패치 Diffing (1-day 취약점 분석)

벤더가 "보안 패치"라고만 하고 구체적인 취약점 내용을 공개하지 않는 경우가 많다. 이때 패치 전 버전과 패치 후 버전의 코드/바이너리를 비교해서, 정확히 뭐가 고쳐졌는지 역으로 알아내는 게 패치 Diffing이다. CVE 분석 글들에서 다룬 사례들처럼, 취약점이 공개된 뒤에도 "패치를 아직 안 한 시스템"을 대상으로 익스플로잇을 만드는 리서치에 이 방법이 흔히 쓰인다.

소스 코드가 있는 경우

git diff v1.2.3 v1.2.4 -- src/

간단히 diff만 봐도 변경된 함수와 조건문을 확인할 수 있다. 특히 길이/경계 검사 조건이 추가되거나(if (len > MAX) 같은 게 새로 생김), 함수 호출 순서가 바뀌는 경우가 취약점 수정의 전형적인 패턴이다.

바이너리만 있는 경우

소스가 공개되지 않은 상용 소프트웨어는 패치 전후 바이너리를 디스어셈블해서 비교한다.

이 방식은 리버싱(정적/동적 분석) 카테고리에서 다룬 기법들을 그대로 실전에 적용하는 과정이기도 하다.

3. 퍼징 (Fuzzing)

사람이 코드를 읽지 않고도, 프로그램에 방대한 양의 변형된 입력을 자동으로 대입해서 크래시(=잠재적 취약점)를 찾아내는 방법이다.

기본 아이디어

정상적인 입력 샘플(시드)을 하나 주고, 그걸 조금씩 무작위로 변형해가며 프로그램에 계속 먹인다. 크래시가 나면 그 입력이 버그의 단서가 된다.

Coverage-guided Fuzzing

무작정 무작위로 변형만 하면 같은 코드 경로만 반복해서 테스트하게 된다. AFL++, libFuzzer 같은 현대적인 퍼저는 코드 커버리지(어떤 분기를 지나갔는지)를 계측해서, "지금까지 안 지나가본 새로운 코드 경로"로 이어지는 입력 변형을 우선적으로 유지하는 방식으로 훨씬 효율적으로 새로운 버그를 찾아낸다.

afl-fuzz -i seeds/ -o findings/ -- ./target @@

퍼징이 잘 통하는 대상

크래시 이후: 삼각측량(Triage)

퍼저가 크래시를 찾아도, 그게 실제로 악용 가능한 취약점인지(메모리 손상 등) 아니면 그냥 프로그램이 assert로 죽은 것뿐인지 구분해야 한다. AddressSanitizer(ASan)를 붙여서 퍼징하면, 크래시 시점에 정확히 어떤 메모리 손상이 일어났는지(버퍼 오버플로우, use-after-free 등) 훨씬 자세한 정보를 얻을 수 있어서 이 과정이 크게 빨라진다.

세 가지 방법을 어떻게 조합하는가

상황 우선 접근
소스 코드 접근 가능, 시간 충분 코드 리뷰 (가장 정확, 논리적 취약점까지 발견 가능)
벤더가 "보안 패치"만 공지, 세부 내용 비공개 패치 Diffing
입력 파싱 로직이 복잡한 대상, 소스 없음 또는 대상이 넓음 퍼징으로 넓게 훑고, 크래시 지점만 코드 리뷰/리버싱으로 정밀 분석

실전에서는 순서를 섞어 쓴다 — 퍼징으로 크래시 지점을 찾은 뒤, 그 지점을 코드 리뷰나 리버싱으로 정밀 분석해서 실제 악용 가능성(exploitability)을 판단하는 흐름이 특히 흔하다. 어느 한 방법만 고집하기보다, 대상의 특성(소스 유무, 코드 복잡도, 시간 여유)에 맞춰 방법을 고르는 게 실제 리서치 속도를 크게 좌우한다.

방법론 카테고리의 글 (2/4)

  1. 버그바운티 시작하기: 정찰부터 리포트까지
  2. 취약점 분석 방법론: 코드 리뷰, 패치 Diffing, 퍼징
  3. 모의해킹·인프라 취약점 진단 컨설팅: 킥오프부터 이행점검까지
  4. Active Directory 침투 방법론: 정찰부터 도메인 관리자까지
← 버그바운티 시작하기: 정찰부터 리포트까지 모의해킹·인프라 취약점 진단 컨설팅: 킥오프부터 이행점검까지 →