[Go 공식문서 한국어 정리] ⑯34. Go 퍼집(Fuzzing)
https://go.dev/doc/security/fuzz/
[Go 공식문서 한국어 정리] ⑯34. Go 퍼집(Fuzzing)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. 서론
퍼집은 입력을 지속적으로 변형시켜 버그를 찾는 자동화된 테스팅입니다. Go 1.18부터 퍼집이 표준 도구연에서 지원됩니다.
2. 핵심 개념
• 퍼집은 코드 커버리지를 활용해 지능적으로 코드를 탐색합니다.
• 보안 취약점이나 취약성을 찾는데 특히 유용합니다.
• OSS-Fuzz를 통해 지속적인 퍼집이 가능합니다.
3. 주요 내용 상세
3.1 퍼집 테스트 작성 규칙
• 함수 이름은 FuzzXxx로 시작해야 합니다.
• 매개변수는 *testing.F를 받습니다.
• *_test.go 파일에 작성해야 합니다.
• 퍼집 타겟은 (*testing.F).Fuzz를 호출하며 첫 번째 인자는 *testing.T, 그 뒤 퍼집 인자들입니다.
• 퍼집 인자는 string, []byte, int, float, bool 등의 정해진 타입을 사용합니다.
3.2 퍼집 테스트 실행
• 기본 단위테스트: go test를 실행하면 시드 코퍼스를 실행합니다.
• 퍼집 모드: go test -fuzz=FuzzTestName을 실행합니다.
• 퍼집은 오류를 발견하거나 사용자가 취소할 때까지 지속됩니다.
• 커버리지 악시를 위해 AMD64와 ARM64에서 실행해야 합니다.
3.3 입력 최소화
• 오류가 발생하면 퍼집 엔진이 입력을 최소화합니다.
• 실패한 입력은 testdata/fuzz/에 저장되며 레그레션 테스트로 사용됩니다.
• 저장된 입력을 go test를 통해 재실행할 수 있습니다.
3.4 커스텀 설정
• -fuzztime: 퍼집 실행 시간이나 반복 횟수를 설정. 기본값은 무한대.
• -fuzzminimizetime: 최소화 시간. 기본값은 60초. 0으로 설정하면 최소화를 비활성화.
• -parallel: 동시 실행 프로세스 수. 기본값은 $GOMAXPROCS.
3.5 코퍼스(Corpus)
• 시드 코퍼스(seed corpus): f.Add를 호출하거나 testdata/fuzz/에 파일을 두어서 제공.
• 생성 코퍼스(generated corpus): 퍼집 엔진이 지속적으로 업데이트. $GOCACHE/fuzz에 저장.
• 코퍼스 파일 형식: 첫 줄은 인코딩 버전(go test fuzz v1), 그 뒤는 각 인자의 값.
• file2fuzz: 이진파일을 코퍼스 파일로 변환하는 도구.
4. 실전 활용
• 퍼집 타겟은 빠르고 결정적이어야 합니다.
• 퍼집 타겟은 전역 상태에 의존하지 않아야 합니다.
• go test -fuzz=FuzzXxx를 실행하여 퍼집을 시작합니다.
• 발견된 오류는 testdata에 저장하여 레그레션 테스트로 활용합니다.
5. 정리
• Go 1.18부터 퍼집이 표준 도구연에서 지원됩니다.
• FuzzXxx의 형태로 퍼집 테스트를 작성하고 go test -fuzz를 실행합니다.
• 시드 코퍼스를 제공하면 퍼집 엔진이 더 효율적으로 작동합니다.
• 발견된 오류는 입력을 최소화하여 저장하고, 이를 레그레션 테스트로 사용할 수 있습니다.
#Go #Golang #Fuzzing #퍼집 #보안 #테스트 #공식문서

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30