CSS Tutor Study Hub 메인으로

Computersystemsicherheit 2025/26

24. Fuzzing 완전 초보 강의

비유, 단계별 예시, 자체 흐름도, 강의 스크립트 원본, 시험 답안까지 한 페이지에서 연결합니다.

CSS 1타 강사 · CONCEPT 24/25

Fuzzer는 수많은 이상한 입력 중 의미 있는 실패를 어떻게 찾아갈까요?

Fuzzer는 seed input을 반복해서 변형하고 program에 넣어 crash, sanitizer finding, timeout, 새로운 coverage를 관찰합니다. 실패 입력은 재현하고 최소화해 원인을 분석합니다.

전문 용어를 보기 전에 이 장면부터 잡으세요

문 손잡이를 정상적으로만 돌리지 않고 빠르게, 반대로, 동시에 누르는 수천 가지 행동을 자동 시험하는 로봇입니다.

많은 이상한 입력을 자동으로 던져 실패를 찾는 동적 분석

00

한 장면으로 문제를 시작해 봅시다

이번 페이지에서 끝까지 따라갈 예시

정상 이미지 파일 몇 개를 seed corpus로 주고 image parser의 crash를 찾는 coverage-guided fuzzing을 따라갑니다.

비유와 실제 시스템을 정확히 연결하기

  • 정상 열쇠 몇 개seed corpus
  • 열쇠의 홈을 조금씩 바꾸는 로봇mutation/generation engine
  • 문이 부서졌는지 알려 주는 센서crash·sanitizer·output mismatch 같은 oracle

이 예시에서 사람·장치·데이터·화살표를 먼저 찾습니다. 아직 용어를 완벽히 몰라도 “누가 무엇을 가지고, 어떤 처리를 거쳐, 무엇이 달라지는가”를 말할 수 있으면 출발점은 충분합니다.

01

긴 이름을 작은 용어로 분리하기

한 제목에 여러 단어가 들어 있어도 같은 기능을 뜻하지 않습니다. 아래 카드를 하나씩 읽고 각 용어의 대상과 역할을 따로 잡으세요.

Fuzzing: 이상한 입력을 자동으로 계속 넣어 보는 시험

Fuzzing은 프로그램에 매우 많은 비정상·경계·무작위 입력을 자동 생성해 넣고 crash, hang, sanitizer error, assertion failure 같은 이상 동작을 찾는 dynamic testing 기법이다. Seed corpus는 시작 입력 모음이고 mutation은 입력을 변형하는 과정이다. Coverage-guided fuzzer는 새 code path를 실행한 입력을 보존해 더 깊은 상태를 탐색한다.

TERMS FROM ZERO

Fuzzing: 이상한 입력을 자동으로 계속 넣어 보는 시험 핵심 용어

아래 단어는 이미 안다고 가정하지 않습니다. 먼저 쉬운 뜻을 읽고, 본문에서 같은 단어가 나오면 이 정의로 다시 바꾸어 읽으세요.

Fuzzer

많은 test input을 자동 생성·변형하고 target program에 실행하는 도구입니다.

Seed corpus

Fuzzing을 시작할 때 기본 구조를 제공하는 초기 입력 모음입니다.

Mutation

기존 입력의 byte·길이·구조를 변경해 새 test case를 만드는 과정입니다.

Oracle

Crash, sanitizer report, output mismatch 등 실패 여부를 판정하는 관찰 기준입니다.

Coverage

특정 입력이 program code의 어느 부분을 실행했는지 나타내는 정보입니다.

02

실제 시스템에서는 이 순서로 움직입니다

모바일에서는 그림 안을 좌우로 움직이며 번호 순서대로 읽으세요.

예시를 단계별로 해체하기

  1. 1단계정상 또는 최소 구조를 가진 seed input을 준비합니다.
  2. 2단계Fuzzer가 byte를 바꾸거나 삽입·삭제하여 새 input을 생성합니다.
  3. 3단계Instrumented program에 input을 넣어 실행합니다.
  4. 4단계Crash·sanitizer finding·timeout·새 code coverage를 oracle로 관찰합니다.
  5. 5단계새로운 path를 연 input은 corpus에 보존해 다시 변형합니다.
  6. 6단계실패 input을 재현하고 최소화한 뒤 root cause와 exploitability를 분석합니다.

이 단계들은 시험 답안에서 원인과 결과가 빠지지 않도록 만든 설명 순서입니다.

손으로 따라가는 초보 예제

정상 PNG 한 장에서 crash를 재현하는 12바이트 입력까지

이미지 parser를 시험한다고 합시다. 정상 PNG 3개를 seed corpus로 주고, fuzzer가 파일의 길이 필드와 byte를 자동으로 바꿉니다.

  1. 1단계Fuzzer는 정상 PNG를 그대로 한 번 실행해 기준 behavior와 coverage를 얻습니다.
  2. 2단계그다음 길이 byte를 10에서 255로 바꾸거나 chunk를 삭제하는 등 수많은 변형 입력을 만듭니다.
  3. 3단계어떤 입력이 새로운 error-handling branch를 실행하면 coverage feedback을 보고 그 입력을 corpus에 남깁니다.
  4. 4단계그 입력을 다시 변형한 결과 parser가 buffer 밖을 읽고 AddressSanitizer report와 함께 crash합니다. 이 report가 bug oracle 역할을 합니다.
  5. 5단계Fuzzer 또는 분석가는 crash를 유지하면서 불필요한 byte를 지워 2KB 파일을 12바이트 reproducer로 최소화합니다.
  6. 6단계개발자는 root cause를 수정하고 이 12바이트 파일을 regression test에 넣어 같은 bug가 다시 생기지 않는지 확인합니다.

그래서 무엇을 배웠나? Fuzzing의 완성은 ‘무작위 입력을 던짐’이 아니라 seed → 변형 → 실행 → feedback/oracle → 보존 → crash 최소화 → 수정과 회귀 테스트의 반복입니다.

03

관련 개념도 하나씩 따로 이해하기

Fuzzing: 이상한 입력을 자동으로 계속 넣어 보는 시험

비유에서 실제 시스템으로 옮겨 보기

먼저 떠올릴 장면 · 문 손잡이를 정상적으로 한 번 돌리는 대신 아주 빠르게, 반대로, 반쯤, 여러 번 돌려 어떤 조작에서 문이 망가지는지 자동 실험하는 것과 같다.

정확한 뜻 · Fuzzing은 프로그램에 매우 많은 비정상·경계·무작위 입력을 자동 생성해 넣고 crash, hang, sanitizer error, assertion failure 같은 이상 동작을 찾는 dynamic testing 기법이다. Seed corpus는 시작 입력 모음이고 mutation은 입력을 변형하는 과정이다. Coverage-guided fuzzer는 새 code path를 실행한 입력을 보존해 더 깊은 상태를 탐색한다.

  1. 1단계정상적인 seed input을 준비한다.
  2. 2단계입력을 반복해서 mutate하거나 grammar에 맞게 생성한다.
  3. 3단계Program을 실행하고 crash, timeout, coverage를 관찰한다.
  4. 4단계실패 입력을 재현하고 가장 작은 testcase로 줄인다.
  5. 5단계원인을 수정한 뒤 그 testcase를 regression test로 남긴다.

04

강의 스크립트 원본과 연결하기

Fuzzing loop·oracle·장단점를 보여 주는 대표 슬라이드입니다. 먼저 위의 초보 설명을 읽고, 원본에서는 같은 개념이 어떤 기호와 독일어·영어 용어로 표현되는지 확인하세요.

Fuzzing 관련 강의 스크립트 대표 슬라이드
원본 Vorlesung/11_software-security 10.pdf · p.51, p.52, p.53 · Fuzzing loop·oracle·장단점
  • 11_software-security 10.pdf · p.51, p.52, p.53

05

시험 함정과 답안에 적용하기

  • Fuzzing: 이상한 입력을 자동으로 계속 넣어 보는 시험 · Fuzzing이 모든 입력을 증명하거나 취약점이 없음을 보장하지는 않는다. 좋은 oracle, instrumentation, corpus가 필요하다.

서술형 답안 골격

seed → mutate/generate → execute → oracle/observe → reproduce/minimize의 feedback loop를 씁니다.

정의 → 등장 주체 또는 입력 → 작동 순서 → 보안 효과 → 조건과 한계 순서로 쓰고, 위 단계별 예시에서 필요한 문장을 골라 붙이세요.

30초 자가 확인

책을 덮고 “Fuzzer는 수많은 이상한 입력 중 의미 있는 실패를 어떻게 찾아갈까요?”에 대해 핵심 용어 두 개, 작동 단계 세 개, 대표 함정 하나를 말해 보세요.

다음 개념으로 넘어가기 전 확인

  1. coverage feedback과 bug oracle이 서로 어떤 다른 질문에 답하는지 말할 수 있나요?
  2. crashing input을 최소화하면 root cause 분석이 쉬워지는 이유는 무엇인가요?
  3. 오랫동안 crash가 없었다고 프로그램이 안전하다고 증명할 수 없는 이유는 무엇인가요?