- 커버리지 기반 퍼즈 테스트 프로세스
- 지원되는 퍼징 엔진 및 언어
- 커버리지 기반 퍼지 테스트 상태 확인
- 커버리지 기반 퍼지 테스트 활성화
- 출력
- 코퍼스 레지스트리
- 커버리지 기반 퍼징 테스트 보고서
- 커버리지 기반 퍼즈 테스트의 지속 기간
- FIPS 지원 이진 파일
- 오프라인 환경
- 취약점과의 상호작용
- 문제 해결
커버리지 기반 퍼즈 테스트
커버리지 기반 퍼즈 테스트는 예상치 못한 동작을 유발하기 위해 어플리케이션의 계측된 버전에 무작위 입력을 전송합니다.
이러한 동작은 해결해야 할 버그를 나타냅니다.
GitLab은 파이프라인에 커버리지 기반 퍼즈 테스트를 추가할 수 있도록 합니다.
이것은 다른 QA 프로세스가 놓칠 수 있는 버그와 잠재적인 보안 문제를 발견하는 데 도움을 줍니다.
보안 스캐너와 GitLab Secure 및 귀하의 테스트 프로세스에서 퍼즈 테스트를 사용하는 것을 권장합니다.
GitLab CI/CD를 사용하는 경우 커버리지 기반 퍼즈 테스트를 CI/CD 워크플로의 일부로 실행할 수 있습니다.
개요를 보려면 Coverage Fuzzing을 참조하세요.
커버리지 기반 퍼즈 테스트 프로세스
퍼즈 테스트 프로세스:
- 대상 어플리케이션을 컴파일합니다.
-
gitlab-cov-fuzz
도구를 사용하여 계측된 어플리케이션을 실행합니다. - 퍼저가 출력한 예외 정보 결과를 구문 분석하고 분석합니다.
- 다음에서 corpus를 다운로드합니다:
- 이전 파이프라인.
-
COVFUZZ_USE_REGISTRY
가true
로 설정된 경우, corpus registry.
- 이전 파이프라인에서 충돌 이벤트를 다운로드합니다.
- 구문 분석된 충돌 이벤트와 데이터를
gl-coverage-fuzzing-report.json
파일에 출력합니다. - corpus를 업데이트합니다, 다음 중 하나를 선택합니다:
- 작업의 파이프라인에서.
-
COVFUZZ_USE_REGISTRY
가true
로 설정된 경우, corpus registry에서.
커버리지 기반 퍼즈 테스트 결과는 CI/CD 파이프라인에서 확인할 수 있습니다.
지원되는 퍼징 엔진 및 언어
다음 퍼징 엔진을 사용하여 지정된 언어를 테스트할 수 있습니다.
언어 | 퍼징 엔진 | 예제 |
---|---|---|
C/C++ | libFuzzer | c-cpp-example |
Go | go-fuzz (libFuzzer support) | go-fuzzing-example |
Swift | libFuzzer | swift-fuzzing-example |
Rust | cargo-fuzz (libFuzzer support) | rust-fuzzing-example |
Java (Maven only)1 | Javafuzz (추천) | javafuzz-fuzzing-example |
Java | JQF (선호되지 않음) | jqf-fuzzing-example |
JavaScript | jsfuzz |
jsfuzz-fuzzing-example |
Python | pythonfuzz |
pythonfuzz-fuzzing-example |
AFL (AFL 위에서 작동하는 모든 언어) | AFL | afl-fuzzing-example |
- Gradle에 대한 지원은 이슈 409764에서 계획되고 있습니다.
커버리지 기반 퍼지 테스트 상태 확인
커버리지 기반 퍼지 테스트의 상태를 확인하려면:
- 왼쪽 사이드바에서 Search or go to를 선택하고 프로젝트를 찾습니다.
- Secure > Security configuration을 선택합니다.
-
Coverage Fuzzing 섹션에서 상태는 다음과 같습니다:
- Not configured
- Enabled
- GitLab Ultimate로 업그레이드하라는 메시지.
커버리지 기반 퍼지 테스트 활성화
커버리지 기반 퍼지 테스트를 활성화하려면 .gitlab-ci.yml
을 편집합니다:
-
fuzz
단계를 단계 목록에 추가합니다. -
애플리케이션이 Go로 작성되지 않은 경우, 일치하는 퍼징 엔진을 사용하는 Docker 이미지를 제공합니다. 예를 들어:
image: python:latest
-
GitLab 설치의 일환으로 제공되는
Coverage-Fuzzing.gitlab-ci.yml
템플릿을 포함합니다. -
요구 사항에 맞게
my_fuzz_target
작업을 사용자 정의합니다.
커버리지 기반 퍼징 구성의 예 추출
stages:
- fuzz
include:
- template: Coverage-Fuzzing.gitlab-ci.yml
my_fuzz_target:
extends: .fuzz_base
script:
# 이러한 단계에서 퍼즈 타겟 바이너리를 빌드한 다음 gitlab-cov-fuzz로 실행하세요
# 지원되는 언어 중에서 어떻게 할 수 있는지에 대한 예제 저장소를 참조하세요
- ./gitlab-cov-fuzz run --regression=$REGRESSION -- <your fuzz target>
Coverage-Fuzzing
템플릿에는 숨겨진 작업 .fuzz_base
가 포함되어 있으며, 각 퍼징 타겟에 대해 확장해야 합니다. 각 퍼징 타겟 must는 별도의 작업을 가져야 합니다. 예를 들어, go-fuzzing-example 프로젝트는 단일 퍼징 타겟에 대한 .fuzz_base
를 확장하는 하나의 작업을 포함합니다.
숨겨진 작업 .fuzz_base
는 자신의 작업에서 재정의하지 말아야 할 여러 YAML 키를 사용합니다. 자신의 작업에 이러한 키를 포함하는 경우 원래 내용을 복사해야 합니다:
before_script
artifacts
rules
사용 가능한 CI/CD 변수
CI/CD 파이프라인에서 커버리지 기반 퍼지 테스트를 구성하려면 다음 변수를 사용하세요.
경고: GitLab 보안 스캐닝 도구의 모든 사용자 지정은 이러한 변경 사항을 기본 브랜치에 병합하기 전에 병합 요청에서 테스트해야 합니다. 그렇지 않으면 많은 수의 거짓 긍정 결과를 초래할 수 있습니다.
CI/CD 변수 | 설명 |
---|---|
COVFUZZ_ADDITIONAL_ARGS |
gitlab-cov-fuzz 에 전달되는 인수입니다. 기본 퍼징 엔진의 동작을 사용자 정의하는 데 사용됩니다. 인수의 전체 목록은 퍼징 엔진의 문서를 참조하세요. |
COVFUZZ_BRANCH |
장기 실행 퍼징 작업을 실행할 브랜치입니다. 다른 모든 브랜치에서는 퍼징 회귀 테스트만 실행됩니다. 기본값: 리포지토리의 기본 브랜치. |
COVFUZZ_SEED_CORPUS |
시드 코퍼스 디렉토리에 대한 경로입니다. 기본값: 비어 있음. |
COVFUZZ_URL_PREFIX |
오프라인 환경에서 사용할 수 있도록 클론된 gitlab-cov-fuzz 리포지토리에 대한 경로입니다. 오프라인 환경을 사용할 때만 이 값을 변경해야 합니다. 기본값: https://gitlab.com/gitlab-org/security-products/analyzers/gitlab-cov-fuzz/-/raw . |
COVFUZZ_USE_REGISTRY |
코퍼스를 GitLab 코퍼스 레지스트리에 저장하려면 true 로 설정합니다. 이 변수가 true 로 설정되면 COVFUZZ_CORPUS_NAME 및 COVFUZZ_GITLAB_TOKEN 변수가 필요합니다. 기본값: false . |
COVFUZZ_CORPUS_NAME |
작업에서 사용할 코퍼스의 이름입니다. |
COVFUZZ_GITLAB_TOKEN |
API 읽기/쓰기 권한이 있는 개인 액세스 토큰 또는 프로젝트 액세스 토큰으로 구성된 환경 변수입니다. |
시드 코퍼스
시드 코퍼스의 파일은 수동으로 업데이트해야 합니다.
이 파일은 coverage-guide fuzz testing 작업에 의해 업데이트되거나 덮어쓰여지지 않습니다.
출력
각 퍼징 단계는 다음과 같은 아티팩트를 출력합니다:
-
gl-coverage-fuzzing-report.json
: 커버리지 기반 퍼징 테스트 및 그 결과에 대한 세부 정보를 포함하는 보고서입니다. -
artifacts.zip
: 이 파일에는 두 개의 디렉토리가 포함됩니다:-
corpus
: 현재 및 이전 작업에서 생성된 모든 테스트 케이스를 포함합니다. -
crashes
: 현재 작업에서 발견한 모든 충돌 이벤트와 이전 작업에서 수정되지 않은 이벤트를 포함합니다.
-
CI/CD 파이프라인 페이지에서 JSON 보고서 파일을 다운로드할 수 있습니다.
자세한 내용은 아티팩트 다운로드를 참조하세요.
코퍼스 레지스트리
코퍼스 레지스트리는 코퍼스의 라이브러리입니다. 프로젝트의 레지스트리에 있는 코퍼스는 해당 프로젝트의 모든 작업에서 사용할 수 있습니다.
프로젝트 전체 레지스트리는 하나의 작업당 하나의 코퍼스를 사용하는 기본 옵션보다 코퍼스를 더 효율적으로 관리하는 방법입니다.
코퍼스 레지스트리는 패키지 레지스트리를 사용하여 프로젝트의 코퍼스를 저장합니다.
레지스트리에 저장된 코퍼스는 데이터 무결성을 보장하기 위해 숨겨져 있습니다.
코퍼스를 다운로드하면 파일 이름은 초기 업로드 시 사용된 파일 이름과 관계없이 artifacts.zip
으로 지정됩니다.
이 파일은 CI/CD 파이프라인에서 다운로드할 수 있는 아티팩트 파일과는 다르게 오직 코퍼스만 포함됩니다.
또한, Reporter 이상의 권한을 가진 프로젝트 구성원은 직접 다운로드 링크를 사용하여 코퍼스를 다운로드할 수 있습니다.
코퍼스 레지스트리 세부정보 보기
코퍼스 레지스트리의 세부정보를 보려면:
-
왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
-
Secure > 보안 구성을 선택합니다.
-
Coverage Fuzzing 섹션에서 Manage corpus를 선택합니다.
코퍼스를 코퍼스 레지스트리에 생성하기
코퍼스를 코퍼스 레지스트리에 생성하려면 다음 중 하나를 선택합니다:
- 파이프라인에서 코퍼스 생성
- 기존 코퍼스 파일 업로드
파이프라인에서 코퍼스 생성하기
파이프라인에서 코퍼스를 생성하려면:
-
.gitlab-ci.yml
파일에서my_fuzz_target
작업을 편집합니다. -
다음 변수를 설정합니다:
-
COVFUZZ_USE_REGISTRY
를true
로 설정합니다. -
COVFUZZ_CORPUS_NAME
을 설정하여 코퍼스 이름을 정합니다. -
COVFUZZ_GITLAB_TOKEN
을 개인 액세스 토큰의 값으로 설정합니다.
-
my_fuzz_target
작업이 실행된 후, 코퍼스는 COVFUZZ_CORPUS_NAME
변수에서 제공된 이름으로 코퍼스 레지스트리에 저장됩니다.
코퍼스는 모든 파이프라인 실행 시 업데이트됩니다.
코퍼스 파일 업로드하기
기존 코퍼스 파일을 업로드하려면:
-
왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
-
Secure > 보안 구성을 선택합니다.
-
Coverage Fuzzing 섹션에서 Manage corpus를 선택합니다.
-
New corpus를 선택합니다.
-
필드를 완료합니다.
-
Upload file을 선택합니다.
-
Add를 선택합니다.
이제 .gitlab-ci.yml
파일에서 코퍼스를 참조할 수 있습니다.
COVFUZZ_CORPUS_NAME
변수에 사용된 값이 업로드된 코퍼스 파일과 정확히 일치하는지 확인하십시오.
코퍼스 레지스트리에 저장된 코퍼스 사용하기
코퍼스 레지스트리에 저장된 코퍼스를 사용하려면 이름으로 참조해야 합니다. 관련 코퍼스의 이름을 확인하려면 코퍼스 레지스트리의 세부정보를 봅니다.
전제조건:
- 프로젝트에서 커버리지 기반 퍼징 테스트 활성화.
-
.gitlab-ci.yml
파일에서 다음 변수를 설정합니다:-
COVFUZZ_USE_REGISTRY
를true
로 설정합니다. -
COVFUZZ_CORPUS_NAME
을 코퍼스의 이름으로 설정합니다. -
COVFUZZ_GITLAB_TOKEN
을 개인 액세스 토큰의 값으로 설정합니다.
-
커버리지 기반 퍼징 테스트 보고서
gl-coverage-fuzzing-report.json
파일 형식에 대한 자세한 정보는
스키마를 읽으세요.
예시 커버리지 기반 퍼징 보고서:
{
"version": "v1.0.8",
"regression": false,
"exit_code": -1,
"vulnerabilities": [
{
"category": "coverage_fuzzing",
"message": "힙 버퍼 오버플로우\n읽기 1",
"description": "힙 버퍼 오버플로우\n읽기 1",
"severity": "치명적",
"stacktrace_snippet": "INFO: 시드: 3415817494\nINFO: 1 모듈 로드됨 (7 인라인 8비트 카운터): 7 [0x10eee2470, 0x10eee2477), \nINFO: 1 PC 테이블 로드됨 (7 PCs): 7 [0x10eee2478,0x10eee24e8), \nINFO: 5 파일이 말뭉치에서 발견됨\nINFO: -max_len이 제공되지 않음; libFuzzer는 4096 바이트보다 큰 입력을 생성하지 않음\nINFO: 시드 말뭉치: 파일: 5 최솟값: 1b 최대값: 4b 총: 14b rss: 26Mb\n#6\t초기화 된 커버리지: 7 ft: 7 corp: 5/14b exec/s: 0 rss: 26Mb\n=================================================================\n==43405==오류: AddressSanitizer: 힙 버퍼 오버플로우 주소 0x602000001573에서 pc 0x00010eea205a bp 0x7ffee0d5e090 sp 0x7ffee0d5e088\n크기 1의 읽기 0x602000001573 스레드 T0\n #0 0x10eea2059에서 FuzzMe(unsigned char const*, unsigned long) fuzz_me.cc:9\n #1 0x10eea20ba에서 LLVMFuzzerTestOneInput fuzz_me.cc:13\n #2 0x10eebe020에서 fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, unsigned long) FuzzerLoop.cpp:556\n #3 0x10eebd765에서 fuzzer::Fuzzer::RunOne(unsigned char const*, unsigned long, bool, fuzzer::InputInfo*, bool*) FuzzerLoop.cpp:470\n #4 0x10eebf966에서 fuzzer::Fuzzer::MutateAndTestOne() FuzzerLoop.cpp:698\n #5 0x10eec0665에서 fuzzer::Fuzzer::Loop(std::__1::vector\u003cfuzzer::SizedFile, fuzzer::fuzzer_allocator\u003cfuzzer::SizedFile\u003e \u003e\u0026) FuzzerLoop.cpp:830\n #6 0x10eead0cd에서 fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char const*, unsigned long)) FuzzerDriver.cpp:829\n #7 0x10eedaf82에서 main FuzzerMain.cpp:19\n #8 0x7fff684fecc8에서 시작+0x0 (libdyld.dylib:x86_64+0x1acc8)\n\n0x602000001573은 3바이트 영역 [0x602000001570,0x602000001573) 오른쪽에 0바이트 존재\n스레드 T0에서 다음 위치에 할당됨:\n #0 0x10ef92cfd에서 wrap__Znam+0x7d (libclang_rt.asan_osx_dynamic.dylib:x86_64+0x50cfd)\n #1 0x10eebdf31에서 fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, unsigned long) FuzzerLoop.cpp:541\n #2 0x10eebd765에서 fuzzer::Fuzzer::RunOne(unsigned char const*, unsigned long, bool, fuzzer::InputInfo*, bool*) FuzzerLoop.cpp:470\n #3 0x10eebf966에서 fuzzer::Fuzzer::MutateAndTestOne() FuzzerLoop.cpp:698\n #4 0x10eec0665에서 fuzzer::Fuzzer::Loop(std::__1::vector\u003cfuzzer::SizedFile, fuzzer::fuzzer_allocator\u003cfuzzer::SizedFile\u003e \u003e\u0026) FuzzerLoop.cpp:830\n #5 0x10eead0cd에서 fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char const*, unsigned long)) FuzzerDriver.cpp:829\n #6 0x10eedaf82에서 main FuzzerMain.cpp:19\n #7 0x7fff684fecc8에서 시작+0x0 (libdyld.dylib:x86_64+0x1acc8)\n\n요약: AddressSanitizer: 힙 버퍼 오버플로우 fuzz_me.cc:9에서 FuzzMe(unsigned char const*, unsigned long)\n버그가 있는 주소 주변의 섀도우 바이트:\n 0x1c0400000250: fa fa fd fa fa fa fd fa fa fa fd fa fa fa fd fa\n 0x1c0400000260: fa fa fd fa fa fa fd fa fa fa fd fa fa fa fd fa\n 0x1c0400000270: fa fa fd fa fa fa fd fa fa fa fd fa fa fa fd fa\n 0x1c0400000280: fa fa fd fa fa fa fd fa fa fa fd fa fa fa fd fa\n 0x1c0400000290: fa fa fd fa fa fa fd fa fa fa fd fa fa fa fd fa\n=\u003e0x1c04000002a0: fa fa fd fa fa fa fd fa fa fa fd fa fa fa[03]fa\n 0x1c04000002b0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa\n 0x1c04000002c0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa\n 0x1c04000002d0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa\n 0x1c04000002e0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa\n 0x1c04000002f0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa\n섀도우 바이트 전설 (하나의 섀도우 바이트는 8개의 응용 프로그램 바이트를 나타냄):\n 주소 가능: 00\n 부분적으로 주소 가능: 01 02 03 04 05 06 07 \n 힙 왼쪽 빨간존: fa\n 해제된 힙 영역: fd\n 스택 왼쪽 빨간존: f1\n 스택 중간 빨간존: f2\n 스택 오른쪽 빨간존: f3\n 반환 후 스택: f5\n 범위 후 스택 사용: f8\n 전역 빨간존: f9\n 전역 초기화 순서: f6\n 사용자에 의해 중독됨: f7\n 컨테이너 오버플로우: fc\n 배열 쿠키: ac\n 객체 내 빨간존: bb\n ASan 내부: fe\n 왼쪽 할당된 빨간존: ca\n 오른쪽 할당된 빨간존: cb\n 섀도우 갭: cc\n==43405==중단 중\nMS: 1 EraseBytes-; 기본 단위: de3a753d4f1def197604865d76dba888d6aefc71\n0x46,0x55,0x5a,\nFUZ\nartifact_prefix='./crashes/'; 테스트 단위가 ./crashes/crash-0eb8e4ed029b774d80f2b66408203801cb982a60에 기록됨\nBase64: RlVa\nstat::number_of_executed_units: 122\nstat::average_exec_per_sec: 0\nstat::new_units_added: 0\nstat::slowest_unit_time_sec: 0\nstat::peak_rss_mb: 28",
"scanner": {
"id": "libFuzzer",
"name": "libFuzzer"
},
"location": {
"crash_address": "0x602000001573",
"crash_state": "FuzzMe\nstart\nstart+0x0\n\n",
"crash_type": "힙 버퍼 오버플로우\n읽기 1"
},
"tool": "libFuzzer"
}
]
}
커버리지 기반 퍼즈 테스트의 지속 기간
커버리지 기반 퍼즈 테스트의 이용 가능한 지속 기간은 다음과 같습니다:
- 10분 지속 시간(기본값): 기본 브랜치에 권장됩니다.
- 60분 지속 시간: 개발 브랜치 및 병합 요청에 권장됩니다. 더 긴 지속 시간이 더 많은 커버리지를 제공합니다.
COVFUZZ_ADDITIONAL_ARGS
변수에서 값--regression=true
를 설정하세요.
전체 예제를 보려면 Go 커버리지 기반 퍼즈 테스트 예제를 읽어보세요.
지속적인 커버리지 기반 퍼즈 테스트
주요 파이프라인을 차단하지 않고 커버리지 기반 퍼즈 작업을 더 길게 실행하는 것도 가능합니다. 이 구성은 GitLab의 parent-child pipelines를 사용합니다.
이 시나리오에서 제안하는 워크플로는 주요 또는 개발 브랜치에서 긴 비동기 퍼즈 작업을 수행하고, 모든 다른 브랜치 및 MRs에서 짧은 동기 퍼즈 작업을 수행하는 것입니다. 이것은 커밋별 파이프라인을 신속하게 완료하는 요구와 퍼저가 애플리케이션을 완전히 탐색하고 테스트하는 데 충분한 시간을 제공하는 것을 균형 있게 합니다. 커버리지 기반 퍼저가 코드베이스에서 더 깊은 버그를 찾으려면 장기간 실행되는 퍼즈 작업이 일반적으로 필요합니다.
다음은 이 워크플로에 대한 .gitlab-ci.yml
파일의 일부입니다. 전체 예제는 Go 퍼즈 테스트 예제의 리포지토리를 참조하세요:
sync_fuzzing:
variables:
COVFUZZ_ADDITIONAL_ARGS: '-max_total_time=300'
trigger:
include: .covfuzz-ci.yml
strategy: depend
rules:
- if: $CI_COMMIT_BRANCH != 'continuous_fuzzing' && $CI_PIPELINE_SOURCE != 'merge_request_event'
async_fuzzing:
variables:
COVFUZZ_ADDITIONAL_ARGS: '-max_total_time=3600'
trigger:
include: .covfuzz-ci.yml
rules:
- if: $CI_COMMIT_BRANCH == 'continuous_fuzzing' && $CI_PIPELINE_SOURCE != 'merge_request_event'
이렇게 두 개의 작업이 생성됩니다:
-
sync_fuzzing
: 블로킹 구성에서 짧은 시간 동안 모든 퍼즈 대상을 실행합니다. 이는 간단한 버그를 찾고 MRs에서 새로운 버그가 발생하거나 이전 버그가 재발하지 않도록 확신할 수 있게 합니다. -
async_fuzzing
: 당신의 브랜치에서 실행되며 개발 주기와 MRs를 차단하지 않고 코드에서 깊은 버그를 찾습니다.
covfuzz-ci.yml
은 원래 동기 예제와 동일합니다.
FIPS 지원 이진 파일
GitLab 15.0부터 커버리지 퍼즈 테스트 이진 파일은 Linux x86에서 golang-fips
로 컴파일되며 OpenSSL을 암호화 백엔드로 사용합니다. 더 많은 세부정보는 Go를 사용한 GitLab의 FIPS 준수를 참조하세요.
오프라인 환경
오프라인 환경에서 커버리지 퍼즈 테스트를 사용하려면:
-
gitlab-cov-fuzz
를 오프라인 GitLab 인스턴스가 접근할 수 있는 개인 리포지토리에 클론합니다. -
각 퍼즈 단계에 대해
COVFUZZ_URL_PREFIX
를${NEW_URL_GITLAB_COV_FUZ}/-/raw
로 설정합니다. 여기서NEW_URL_GITLAB_COV_FUZ
는 첫 번째 단계에서 설정한 개인gitlab-cov-fuzz
클론의 URL입니다.
취약점과의 상호작용
취약점이 발견된 후, 취약점을 처리할 수 있습니다.
Merge request 위젯은 취약점을 나열하고 퍼징 아티팩트를 다운로드하는 버튼을 포함합니다. 탐지된 취약점 중 하나를 선택하면 세부 정보를 확인할 수 있습니다.
또한 보안 대시보드에서 취약점을 볼 수 있으며, 이는 그룹, 프로젝트 및 파이프라인의 모든 보안 취약점에 대한 개요를 보여줍니다.
취약점을 선택하면 추가 정보를 제공하는 모달이 열립니다:
-
상태: 취약점의 상태. 모든 유형의 취약점과 마찬가지로, 커버리지 퍼징 취약점은 감지됨, 확인됨, 기각됨 또는 해결됨일 수 있습니다.
-
프로젝트: 취약점이 존재하는 프로젝트.
-
크래시 유형: 코드의 크래시 또는 약점 유형. 이는 일반적으로 CWE에 매핑됩니다.
-
크래시 상태: 스택 트레이스의 정규화된 버전으로, 크래시의 마지막 세 함수(무작위 주소 제외)를 포함합니다.
-
스택 트레이스 스니펫: 크래시에 대한 세부정보를 표시하는 스택 트레이스의 마지막 몇 줄.
-
심각도: 취약점의 심각도. 이는 Critical, High, Medium, Low, Info 또는 Unknown일 수 있습니다.
-
스캐너: 취약점을 탐지한 스캐너(예: Coverage Fuzzing).
-
스캐너 제공자: 스캔을 수행한 엔진. Coverage Fuzzing의 경우, 이는 Supported fuzzing engines and languages에서 나열된 엔진 중 하나일 수 있습니다.
문제 해결
오류 Unable to extract corpus folder from artifacts zip file
이 오류 메시지가 표시되고 COVFUZZ_USE_REGISTRY
가 true
로 설정되어 있는 경우, 업로드된 corpus 파일이 corpus
라는 이름의 폴더로 추출되는지 확인하세요.
오류 400 Bad request - Duplicate package is not allowed
COVFUZZ_USE_REGISTRY
가 true
로 설정된 상태에서 퍼징 작업을 실행할 때 이 오류 메시지가 표시되면, 중복이 허용되는지 확인하세요. 자세한 내용은 중복 Generic 패키지를 참조하십시오.