본문 바로가기
성공지식백과 로고성공지식백과
GLOSSARY

퍼징 (Fuzzing)

중급바이브 코딩

이 페이지는 바이브 코딩 문맥에서 자주 쓰이는 퍼징 (Fuzzing)의 뜻과 쓰임을 중급 난이도 기준으로 정리한 AI 용어사전 항목입니다. 정의와 맥락, 관련 용어 5개 순서로 묶었으니, 아래 설명을 먼저 읽고 연결된 개념과 글까지 이어서 보면 이해가 빨라집니다.

퍼징(Fuzzing)은 입력을 자동으로 만들거나 변형해 프로그램에 반복적으로 넣으면서 예상하지 못한 오류를 찾는 테스트 기법입니다. 사람이 미리 고른 몇 가지 사례 외에 비어 있거나 형식이 깨진 데이터 등 다양한 입력을 탐색합니다. 실행이 중단되거나 오류 검사 도구가 문제를 보고하면 그 입력을 보존해 원인을 조사하고 수정 결과를 확인합니다.

입력을 바꾸며 탐색하는 테스트

이미지 파일을 읽는 프로그램은 정상 사진만 받을 때 문제없이 보일 수 있습니다. 하지만 길이가 잘린 파일이나 예상과 다른 값이 들어간 파일을 읽을 때는 다른 코드 경로를 거칩니다. 퍼징은 이런 입력을 계속 만들고 실행 결과를 관찰하는 방법입니다. 입력 형식이 잘못됐다는 이유로 프로그램이 오류를 반환하는 정상 처리와, 프로그램 자체가 충돌하는 결함은 구분해서 봅니다.

OSS-Fuzz의 공식 소개는 퍼징을 소프트웨어의 프로그래밍 오류를 찾아내는 기법으로 설명합니다. 발견 대상에는 안정성 문제와 보안에 영향을 줄 수 있는 오류가 함께 있습니다. 예를 들어 메모리 버퍼의 경계를 넘는 문제는 보안상 중요할 수 있지만, 모든 실패가 바로 악용 가능한 취약점인 것은 아닙니다. 실패한 입력이 어떤 동작을 일으켰는지와 실제 영향 범위를 추가로 조사합니다.

퍼징에서 반복 실행을 담당하는 도구를 퍼저라고 부릅니다. 입력을 만드는 방식은 도구마다 다르며, 무작위 값을 처음부터 뿌리는 방법만 있는 것은 아닙니다. 기존 입력을 조금씩 바꾸거나 실행 중 얻은 정보를 다음 입력 선택에 반영할 수 있습니다. 따라서 어떤 입력을 시도했고 어느 코드가 실행됐는지 함께 확인하면 탐색이 실제 검사 대상에 도달하는지 살필 수 있습니다.

실행 경로와 코퍼스의 역할

LLVM의 libFuzzer 문서는 실행된 코드 영역을 추적하면서 입력을 변형하는 커버리지 기반 방식을 설명합니다. 커버리지는 테스트가 코드의 어느 부분까지 실행했는지를 나타내는 정보입니다. libFuzzer는 기존 입력에서 변형한 데이터가 새 경로를 실행하게 하면 이를 이후 변형에 쓸 입력 모음에 저장합니다. 이 입력 모음을 코퍼스(corpus)라고 합니다.

시작 코퍼스에는 정상 입력과 잘못된 입력을 함께 넣을 수 있습니다. 같은 문서는 그래픽 라이브러리라면 서로 다른 작은 이미지 파일들을 예로 듭니다. 초기 입력 없이도 libFuzzer가 동작하지만, 복잡한 구조를 받는 프로그램에서는 효율이 떨어질 수 있다고 설명합니다. 입력이 초반 형식 검사에서 계속 거부되면 더 안쪽의 처리에 도달하기 어려우므로, 코퍼스는 검사할 기능에 맞게 구성합니다.

입력을 실제 검사 코드에 전달하는 연결 코드도 필요합니다. 테스트 하네스라고 부르는 이런 연결 부분에는 입력을 받아 대상 기능을 호출하는 작업이 들어갑니다. libFuzzer에서는 바이트 배열을 받아 검사할 API를 사용하는 타깃 함수를 작성합니다. 이 함수는 같은 프로세스에서 여러 입력으로 반복 실행되므로 빈 입력이나 깨진 입력을 받아도 테스트를 계속할 수 있도록 구성하며, 이전 실행의 상태가 다음 검사에 미치는 영향도 살핍니다.

오류 탐지와 재현 입력의 보존

LLVM의 실행 안내는 충돌이나 새니타이저 오류가 발생하면 문제를 일으킨 입력을 파일로 남기는 동작을 설명합니다. 새니타이저는 실행 중 메모리 오류 같은 문제를 탐지하는 도구이며, 퍼저가 다양한 입력을 제공하는 역할과 구분됩니다. 입력 탐색과 오류 탐지 수단을 함께 사용하면, 겉으로 정상 종료하는 것만 봐서는 놓칠 수 있는 문제도 검사 대상으로 삼을 수 있습니다.

저장한 입력을 다시 실행하면 어떤 조건에서 문제가 발생했는지 확인할 수 있습니다. 코드와 실행 환경이 달라지면 결과도 달라질 수 있어, 재현 입력과 함께 검사한 버전과 설정이 조사 단서가 됩니다. libFuzzer는 저장된 파일들을 입력으로 다시 실행하는 방식도 제공합니다. 수정 뒤 같은 입력을 넣어 보고, 이전에 정상 처리한 코퍼스도 확인하면 해당 결함과 주변 동작이 어떻게 달라졌는지 비교할 수 있습니다.

오류가 발견되지 않았다는 결과는 주어진 대상과 입력, 실행 시간, 탐지 수단에서 보고된 문제가 없었다는 범위로 해석합니다. 탐색하지 못한 코드나 검사하지 않은 동작까지 안전하다고 확장하지 않습니다. 테스트가 입력을 만드는 데 시간을 쓰지만 대상 함수의 중요한 부분에는 도달하지 못하는 경우도 있습니다. 시도한 입력 수와 함께 실행 경로의 변화, 연결 코드의 범위, 실제로 켜 둔 오류 검사 기능을 확인합니다.

RELATED TERMS

관련 용어

퍼징 (Fuzzing)와 함께 자주 언급되는 개념들입니다. 비슷한 말처럼 보여도 역할과 쓰임은 다를 수 있습니다.