퍼즈 테스트(퍼징) 튜토리얼
⚡ 스마트 요약
퍼즈 테스트는 유효하지 않거나 예상치 못한, 또는 임의의 데이터를 프로그램에 입력하고 충돌, 멈춤, 메모리 오류를 감시하여 스크립트 기반 기능 테스트로는 거의 발견할 수 없는 보안 결함을 드러냅니다.
퍼즈 테스트란 무엇입니까?
퍼즈 테스트 또는 퍼징 퍼즈 테스트는 소프트웨어 시스템에 퍼즈라고 불리는 유효하지 않거나 무작위적인 데이터를 삽입하여 코딩 오류 및 보안 취약점을 발견하는 소프트웨어 테스트 기법입니다. 퍼즈 테스트의 목적은 자동화 또는 반자동 기술을 사용하여 데이터를 삽입하고 시스템 충돌이나 내장 코드 오류와 같은 다양한 예외 상황을 테스트하는 것입니다.
퍼즈 테스트는 원래 위스콘신-매디슨 대학교의 바튼 밀러가 개발했는데, 그는 모뎀 링크의 회선 잡음 때문에 사용하던 프로그램이 다운되는 것을 보고 이 용어를 만들었습니다. 그의 학생들은 1989년에 최초의 퍼저를 실행했고, 목표로 삼은 UNIX 유틸리티의 약 3분의 1이 다운되거나 멈추는 것을 발견했습니다. 퍼즈 테스트는 소프트웨어 테스팅 기술이며, 일종의 기술입니다. 보안 테스트.
아래 다이어그램은 퍼징의 기본 루프를 보여줍니다. 이 루프에서는 생성된 데이터가 테스트 대상 애플리케이션에 입력되고 응답이 관찰됩니다.
퍼지 테스트를 수행하는 이유는 무엇입니까?
퍼징은 테스트 계획에서 중요한 위치를 차지하는데, 그 이유는 아무도 테스트 케이스를 작성할 생각을 하지 못했던 입력값을 탐색하기 때문입니다. 팀이 퍼징을 도입하는 주요 이유는 다음과 같습니다.
- 퍼즈 테스트는 일반적으로 가장 심각한 보안 결함과 오류를 찾아냅니다. 왜냐하면 크래시는 처리되지 않은 입력 경로가 있다는 직접적인 증거이기 때문입니다.
- 퍼즈 테스트는 다음과 함께 사용할 때 더 효과적인 결과를 제공합니다. 검정 Box 지원, 베타 테스트 및 기타 디버깅 방법.
- 퍼즈 테스트는 소프트웨어의 취약성을 확인하는 데 사용되며, 입력값을 수동으로 작성하는 대신 생성하기 때문에 매우 비용 효율적인 테스트 기법입니다.
- 퍼즈 테스트는 블랙박스 테스트 기법 중 하나입니다. 또한 해커들이 시스템의 취약점을 찾는 데 사용하는 가장 일반적인 방법 중 하나이므로, 퍼즈 테스트를 먼저 실행하면 공격자가 시스템에 침입할 수 있는 가장 쉬운 경로를 차단할 수 있습니다.
퍼즈 테스트의 종류
퍼저는 일반적으로 공격 대상 프로그램에 대해 알고 있는 정보의 양에 따라 분류됩니다. 퍼저가 알고 있는 정보가 많을수록 코드의 더 깊숙한 곳까지 침투할 수 있습니다.
| 타입 | 퍼저가 아는 것 | 일반적인 사용 |
| 블랙박스 퍼징 | 내부 구조에 대한 정보는 전혀 없고, 입력과 출력만 인식합니다. | Quick Smoke는 바이너리 파일 또는 실제 엔드포인트를 대상으로 실행됩니다. |
| 화이트 박스 퍼징 | 전체 소스 코드는 종종 기호 실행과 결합되어 접근하기 어려운 분기를 해결합니다. | 출처를 알 수 있는 구성 요소에 대한 심층 분석. |
| 회색 상자 퍼징 | 소스 코드 검토는 없지만, 입력값이 어떤 코드 분기점에 도달했는지와 같은 런타임 피드백을 제공합니다. | AFL++ 및 libFuzzer와 같은 최신 엔진의 기본 설정입니다. |
두 번째, 더 오래된 분열은 분리를 초래합니다. 멍청한 퍼징 에 스마트 퍼징단순한 퍼저는 입력 형식을 전혀 고려하지 않고 비트를 뒤집기만 하므로 대부분의 데이터가 처음 만나는 파서에서 거부됩니다. 반면, 똑똑한 퍼저는 체크섬, 길이 필드, 메시지 구조 등을 이해하므로 입력 데이터가 유효성 검사를 통과하여 하위 로직에 도달할 수 있습니다. 커버리지 기반 퍼징 퍼징을 주류로 만든 것은 그레이 박스 기법입니다. 이 기법은 바이너리를 계측하고, 새로운 분기에 도달하는 모든 입력을 저장하며, 살아남은 입력을 변형합니다. 따라서 코퍼스는 무작위 노이즈에서 다시 시작하는 대신 탐색되지 않은 코드 방향으로 꾸준히 진화합니다.
퍼지 테스트를 수행하는 방법
퍼즈 테스트 절차에는 기본적인 테스트 단계가 포함됩니다.
1단계) 대상 시스템 식별 — 공격 대상이 될 바이너리, 라이브러리, 서비스 또는 프로토콜 엔드포인트를 선택하고 테스트 권한이 있는지 확인하십시오.
2단계) 입력 식별 — 대상이 읽어들이는 모든 진입점(파일, 명령줄 인수, 환경 변수, 네트워크 패킷, 폼 필드 및 API 페이로드)을 나열합니다.
3단계) 퍼지 데이터 생성 — 유효한 샘플을 변형하거나, 형식의 모델로부터 생성하거나, 또는 이 둘을 결합하여 형식이 잘못된 입력을 생성합니다.
4단계) 퍼지 데이터를 사용하여 테스트를 실행합니다. — 생성된 입력값에 대해 타겟을 실행하고, 이상적으로는 실패 후 자동으로 프로세스를 재시작하는 루프를 사용하는 것이 좋습니다.
5단계) 시스템 동작 모니터링 — 출력된 내용만 확인하는 대신, 충돌, 멈춤, 어설션 실패, 과도한 메모리 사용량 및 새니타이저 보고서를 주시하십시오.
6단계) 결함 로그 — 각 오류를 발생시킨 정확한 입력값을 저장하고, 이를 재현 가능한 가장 작은 사례로 축소하여 스택 트레이스에 저장합니다. trac첨부파일됨.
퍼저의 예
퍼저는 입력을 구성하는 방식에 따라 분류되기도 하는데, 아래 세 가지 접근 방식이 가장 흔하게 접하게 될 방식입니다.
- 돌연변이 기반 Fuzzer 기존 데이터 샘플을 변형하여 새로운 테스트 데이터를 생성합니다. 이는 매우 간단하고 직관적인 접근 방식입니다. 유효한 프로토콜 샘플에서 시작하여 모든 바이트 또는 파일을 계속해서 변형하는 것입니다.
- 세대 기반 Fuzzer 모델의 입력값을 기반으로 새로운 데이터를 정의합니다. 명세를 바탕으로 처음부터 입력값을 생성하기 시작합니다.
- 프로토콜 기반 퍼저 퍼저(fuzzer)는 테스트 대상 프로토콜 형식에 대한 상세한 지식에 의존하며, 이러한 이해는 명세에서 비롯됩니다. 명세 배열을 도구에 입력한 다음, 모델 기반 테스트 생성 기법을 사용하여 명세를 검토하고 데이터 내용, 순서 등에 불규칙성을 추가하는 방식으로 테스트를 진행합니다. 이는 구문 테스트, 문법 테스트 또는 견고성 테스트라고도 합니다. 퍼저는 기존 테스트 케이스에서 테스트 케이스를 생성하거나, 유효하거나 유효하지 않은 입력을 사용할 수 있습니다.
프로토콜 기반 퍼징에는 두 가지 제한 사항이 있습니다.
- 사양이 성숙될 때까지 테스트를 진행할 수 없습니다.
- 많은 유용한 프로토콜은 공개된 프로토콜의 확장입니다. 퍼지 테스트가 게시된 사양을 기반으로 하는 경우 테스트 커버리지 새로운 프로토콜의 경우 제한됩니다.
퍼징 기법의 가장 간단한 형태는 프로토콜 패킷이나 이벤트 형태로 소프트웨어에 무작위 입력을 보내는 것입니다. 이러한 무작위 입력 전송 기법은 많은 애플리케이션과 서비스에서 버그를 찾는 데 매우 효과적입니다. 이 외에도 다양한 기법들이 있으며, 구현 또한 매우 간단합니다. 기존 입력값을 변경하기만 하면 되는데, 입력값의 비트를 서로 바꾸는 것만으로도 쉽게 변경할 수 있습니다.
Fuzz Testing에서 발견한 버그 유형
퍼징은 프로그램의 예상값이 아닌 동작 방식을 기준으로 실행 결과를 평가하기 때문에, 발견되는 결함은 크게 세 가지 유형으로 분류됩니다.
- 어설션 실패 및 메모리 누수: 이 방법론은 버그가 메모리 안전성에 영향을 미치는 대규모 애플리케이션에 널리 사용되며, 이는 심각한 취약점입니다. Buffer 오버플로, 해제 후 사용, 경계 외 읽기 등의 오류가 모두 여기에 나타납니다.
- 잘못된 입력입니다: 퍼즈 테스트에서 퍼저는 오류 처리 루틴을 테스트하기 위해 유효하지 않은 입력을 생성하는 데 사용되며, 이는 입력값을 제어할 수 없는 소프트웨어에 중요합니다. 간단한 퍼징은 이러한 과정을 자동화하는 한 가지 방법으로 볼 수 있습니다. 부정적인 테스트.
- 정확성 오류: 퍼징은 손상된 데이터베이스나 부정확한 검색 결과와 같은 "정확성" 관련 버그를 탐지하는 데에도 사용될 수 있습니다. 두 구현에 동일한 입력을 제공하고 결과를 비교하는 차분 퍼징이 이러한 버그를 잡아내는 일반적인 방법입니다.
퍼즈 테스트 도구
웹 보안에 사용되는 도구들은 퍼즈 테스트에도 널리 활용될 수 있습니다. 예를 들면 다음과 같습니다. Burp Suite 그리고 피치 퍼저. 아래의 고전적인 이름들 중 일부는 현재 보관되어 있으므로 각 항목 옆에 현재 상태가 명시되어 있습니다.
- 피치 퍼저Peach Fuzzer는 스캐너보다 더 강력한 보안 기능을 제공합니다. 다른 테스트 도구는 알려진 위협만 검색할 수 있는 반면, Peach Fuzzer는 알려진 위협뿐만 아니라 알려지지 않은 위협까지 찾아낼 수 있습니다. Peach Tech는 GitLab에 인수되었으며, Community Edition v3는 더 이상 유지 관리되지 않습니다. 유지 관리되는 후속 버전은 다음과 같습니다. GitLab 프로토콜 퍼저 커뮤니티 에디션.
- 스파이크 프록시SPIKE Proxy는 웹 애플리케이션의 애플리케이션 수준 취약점을 찾는 전문가용 도구입니다. SPIKE Proxy는 다음과 같은 기본 사항을 다룹니다. SQL 완전히 개방된 환경에서의 인젝션 및 크로스 사이트 스크립팅 Python 인프라가 구축되어 있었고, 이용 가능했습니다. Linux Windows오랫동안 관리가 되지 않았지만 역사적 맥락을 제공하기 위해 여기에 포함시켰습니다.
- 웹스카라브WebScarab은 다음으로 작성되었습니다. Java 따라서 다양한 플랫폼에서 사용 가능합니다. WebScarab 프레임워크는 HTTP 및 HTTPS 프로토콜을 사용하여 통신하며, 인터셉팅 프록시 역할을 합니다. 이를 통해 운영자는 서버가 요청을 수신하기 전에 브라우저에서 생성된 요청을 검토하고 수정할 수 있으며, 브라우저가 응답을 수신하기 전에 서버에서 생성된 응답을 검토하고 업데이트할 수 있습니다. WebScarab이 발견한 모든 취약점은 보고된 문제 목록에 추가됩니다. 해당 저장소는 2024년 4월에 보관 처리되었으며 현재는 읽기 전용입니다.
- OWASP WSFuzzerWSFuzzer는 GPL 라이선스가 적용된 프로그램으로, 다음 언어로 작성되었습니다. Python 웹 서비스를 대상으로 했으며, 마지막 버전은 HTTP 기반이었습니다. SOAP 서비스 주요 대상은 웹스카라브(WebScarab)의 일부로 출시되었고, 웹스카라브와 함께 서비스가 종료되었습니다. OWASP ZAP 및 Fuzzer 추가 기능 권장 교체품입니다.
- 유지되는 대안: AFL++ libFuzzer 네이티브 코드용 표준 코드 커버리지 기반 엔진입니다. OSS- 퍼지 오픈소스 프로젝트를 위해 지속적으로 무료로 실행해 줍니다. 부퍼즈 네트워크 프로토콜 퍼징을 다룹니다. Python더 자세한 목록은 가이드에 수록되어 있습니다. 보안 테스트 도구.
퍼즈 테스트 모범 사례
특정 대상을 향해 퍼저를 조준하고 그대로 두면 별다른 성과를 거두지 못합니다. 아래 설명된 방법들은 단순히 CPU 시간만 낭비하는 퍼저 캠페인과 실제 결함을 발견하는 캠페인을 구분하는 기준이 됩니다.
- 좋은 초기 데이터셋에서 시작하세요. 애플리케이션이 이미 허용하는 실제적이고 유효한 입력을 수집하세요. 실제 파일을 변경하면 임의의 바이트를 변경하는 것보다 구문 분석 코드에 훨씬 빨리 도달합니다.
- 작고 빠른 하네스를 만드세요. 진입점은 실행당 하나의 작업만 수행하고, 네트워크 호출 및 디스크 쓰기를 피하며, 신속하게 반환해야 합니다. 처리량은 초당 실행 횟수로 측정되기 때문입니다.
- 살균기를 켜세요. 메모리 손상은 종종 시스템 충돌을 일으키지 않습니다. AddressSanitizer와 UndefinedBehaviorSanitizer는 이러한 손상을 즉각적이고 진단 가능한 오류로 변환합니다.
- 오랫동안, 그리고 끊임없이 실행하세요. 한두 시간 정도의 실행으로는 얕은 버그를 잡아낼 수 있지만, 심층적인 버그를 찾아내려면 보통 몇 시간이 걸립니다. 그렇기 때문에 퍼징은 수동 세션보다는 야간 CI 작업에 포함시키는 것이 더 적합합니다.
- 충돌을 최소화하고 중복을 제거합니다. 오류가 발생하는 입력값을 가장 작은 형태로 축소하고 스택별로 충돌을 그룹화하세요. trac그렇지 않으면 하나의 버그가 수백 건의 티켓으로 이어집니다.
- 회귀 분석용 코퍼스를 유지하세요. 각 재현성 입력값을 모든 빌드에서 실행되는 영구 세트에 추가하여 수정된 결함이 조용히 다시 나타나지 않도록 합니다.
- 합법적으로 목표물을 파악하십시오. 제3자의 실제 서비스를 서면 허가 없이 퍼징하는 것은 공격과 다를 바 없습니다.
퍼즈 테스트의 장점
현실적인 기대치를 가지고 사용한다면, 퍼징은 다른 기술들이 따라잡기 어려운 가치를 더해줍니다.
- 퍼즈 테스트는 소프트웨어 보안 테스트를 향상시킵니다.
- 퍼징 테스트에서 발견되는 버그는 심각한 경우가 많으며, 크래시, 메모리 누수, 처리되지 않은 예외 등 공격자들이 사용하는 것과 동일한 경우가 흔합니다.
- 시간과 자원의 제약으로 인해 테스터가 발견하지 못한 버그는 퍼즈 테스트를 통해 발견될 수 있습니다.
- 입력 데이터는 기계에 의해 생성되므로 추가적인 수동 작업 없이도 데이터 범위가 밤새도록 계속 확장됩니다.
퍼즈 테스트의 단점
퍼징을 저렴하게 만드는 특성은 동시에 퍼징이 증명할 수 있는 범위에도 한계를 부여합니다.
- 퍼즈 테스트만으로는 전반적인 보안 위협이나 버그 집합에 대한 완전한 그림을 제공할 수 없습니다.
- 퍼즈 테스트는 일부 바이러스, 웜, 트로이목마와 같이 프로그램 충돌을 일으키지 않는 보안 위협에 대응하는 데 효과가 떨어집니다.
- 퍼즈 테스트는 비교적 단순한 결함이나 위협만 감지할 수 있으며, 비즈니스 로직에 대해서는 추론할 수 없습니다.
- 효과적으로 작동하려면 상당한 기계 가동 시간이 필요합니다.
- 무작위 입력값을 사용하여 경계값 조건을 설정하는 것은 매우 문제가 많지만, 현재 테스터들은 사용자 입력에 기반한 결정론적 알고리즘을 통해 이러한 문제의 상당 부분을 해결하고 있습니다.
퍼즈 테스트 vs 침투 테스트
두 활동 모두 보안 결함을 찾는 것이지만, 서로 다른 질문을 던지며 거의 상호 대체될 수 없습니다.
| 기준 | 퍼지 테스트 | 침투 테스트 |
| 에 의해 구동 | 잘못된 입력을 생성하는 자동화 엔진 | 숙련된 테스터가 시스템에 대해 추론하는 모습 |
| 찾다 | 충돌, 멈춤 및 메모리 안전 오류 | 논리적 오류 및 구성 결함을 포함한 악용 가능한 취약점 |
| 깊이 | 입력 범위가 매우 넓지만 추론은 피상적입니다. | 좁은 범위, 심층적인 추론 |
| 산출 | 입력 및 스택 재현 traces | 취약점 공격 경로 및 위험 등급을 포함한 조사 결과 보고서 |
| 최고의 순간 | 빌드 파이프라인에서 지속적으로 | 주기적으로, 릴리스 후보에 대해 |
실제로 이 둘은 서로 영향을 주고받습니다. 퍼징은 자동화가 가능한 저렴한 크래시를 제거하여 테스터의 제한된 시간을 오직 사람만이 발견할 수 있는 결함을 찾는 데 집중할 수 있도록 합니다.

