튜토리얼: GitLab에서 퍼즈 테스트 수행하기
커버리지 가이드 퍼즈 테스트는 예상치 못한, 변형된 또는 무작위 데이터를 응용 프로그램에 전송한 후, 응용 프로그램을 모니터링하여 불안정한 동작과 충돌을 감지합니다.
이를 통해 QA 프로세스에서 놓칠 수 있는 버그와 잠재적 보안 문제를 발견할 수 있습니다.
퍼즈 테스트는 다른 보안 스캐너 및 자체 테스트 프로세스와 함께 사용해야 합니다. GitLab CI/CD를 사용 중이라면 퍼즈 테스트를 CI/CD 워크플로우의 일부로 실행할 수 있습니다.
이 튜토리얼에서는 JavaScript를 사용하여 커버리지 가이드 퍼즈 테스트를 설정, 구성 및 수행하는 방법을 설명합니다. 다음과 같이 진행해보세요:
- 프로젝트 템플릿을 포크하여 퍼즈 테스트를 실행할 프로젝트를 생성합니다.
- 퍼즈 대상을 생성합니다.
- 포크한 프로젝트에서 커버리지 가이드 퍼즈 테스팅을 활성화합니다.
- 퍼즈 테스트를 실행하여 보안 취약점을 식별합니다.
- 퍼즈 테스트에서 식별된 취약점을 수정합니다.
프로젝트 템플릿을 포크
먼저, 퍼즈 테스트를 진행할 프로젝트를 생성하려면 fuzz-testing
프로젝트 템플릿을 포크해야 합니다.
-
fuzz-testing
프로젝트 템플릿을 엽니다. - 프로젝트 템플릿을 포크합니다.
- 프로젝트 템플릿을 포크할 때:
fuzz-testing
프로젝트 템플릿을 성공적으로 포크했습니다. 퍼즈 테스트를 시작하기 전에 프로젝트 템플릿과 포크 간의 연결을 제거해야 합니다:
- 왼쪽 사이드바에서 설정 > 일반을 선택합니다.
- 고급을 확장합니다.
- 포크 관계 제거 섹션에서 포크 관계 제거를 선택합니다. 요청 시 프로젝트 이름을 입력합니다.
프로젝트가 준비되었고 이제 퍼즈 테스트를 생성할 수 있습니다. 다음으로 퍼즈 대상을 생성하겠습니다.
퍼즈 대상 생성
이제 퍼즈 테스트용 프로젝트가 준비되었으므로 퍼즈 대상을 생성합니다. 퍼즈 대상은 테스트 중인 응용 프로그램에 대한 호출을 수행하는 입력을 받는 함수 또는 프로그램입니다.
이 튜토리얼에서는 퍼즈 대상이 my-tools.js
파일의 함수를 호출하고 무작위 버퍼를 매개변수로 사용합니다.
두 개의 퍼즈 대상 파일을 생성하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고
fuzz-testing-demo
프로젝트를 찾습니다. - 프로젝트의 루트 디렉터리에 파일을 만듭니다.
-
파일의 이름을
fuzz-sayhello.js
로 지정하고 다음 코드를 추가합니다:let tools = require('./my-tools') function fuzz(buf) { const text = buf.toString() tools.sayHello(text) } module.exports = { fuzz }
또는
fuzz-testing-demo/fuzzers/fuzz-sayhello.js
프로젝트 파일에서 이 코드를 복사할 수 있습니다. -
대상 브랜치를
add-fuzz-test
로 지정하고 설명적인 커밋 메시지를 작성합니다.- 이 변경 사항으로 새로운 Merge Request 시작 확인란은 선택하지 않습니다.
- 변경 사항 커밋을 선택합니다.
- 프로젝트의 루트 디렉터리로 돌아갑니다.
-
add-fuzz-test
브랜치에 있는지 확인합니다. -
두 번째 파일의 이름을
fuzz-readme.js
로 지정하고 다음 코드를 추가합니다:let tools = require('./my-tools') function fuzz(buf) { const text = buf.toString() tools.readmeContent(text) } module.exports = { fuzz }
또는
fuzz-testing-demo/fuzzers/fuzz-readme.js
프로젝트 파일에서 이 코드를 복사할 수 있습니다. - 설명적인 커밋 메시지를 작성합니다.
-
대상 브랜치가
add-fuzz-test
인지 확인합니다. - 변경 사항 커밋을 선택합니다.
이제 테스트 중인 응용 프로그램에 대한 호출을 수행할 두 개의 퍼즈 대상이 준비되었습니다. 다음으로 퍼즈 테스트를 활성화하겠습니다.
커버리지 가이드 퍼즈 테스팅 활성화
커버리지 가이드 퍼즈 테스팅을 활성화하려면 gitlab-cov-fuzz
CLI를 실행하여 두 개의 퍼즈 대상에서 퍼즈 테스트를 실행하는 CI/CD 파이프라인을 생성합니다.
파이프라인 파일을 생성하려면:
-
add-fuzz-test
브랜치에 있는지 확인합니다. -
fuzz-testing-demo
프로젝트의 루트 디렉터리에서 새 파일을 만듭니다. -
파일의 이름을
.gitlab-ci.yml
로 지정하고 다음 코드를 추가합니다:image: node:18 stages: - fuzz include: - template: Coverage-Fuzzing.gitlab-ci.yml readme_fuzz_target: extends: .fuzz_base tags: [saas-linux-large-amd64] # Optional variables: COVFUZZ_ADDITIONAL_ARGS: '--fuzzTime=60' script: - npm config set @gitlab-org:registry https://gitlab.com/api/v4/packages/npm/ && npm i -g @gitlab-org/jsfuzz - ./gitlab-cov-fuzz run --engine jsfuzz -- fuzz-readme.js hello_fuzzing_target: extends: .fuzz_base tags: [saas-linux-large-amd64] # Optional variables: COVFUZZ_ADDITIONAL_ARGS: '--fuzzTime=60' script: - npm config set @gitlab-org:registry https://gitlab.com/api/v4/packages/npm/ && npm i -g @gitlab-org/jsfuzz - ./gitlab-cov-fuzz run --engine jsfuzz -- fuzz-sayhello.js
이 단계는 다음을 파이프라인에 추가합니다: - 퍼즈 단계를 사용하여 템플릿을 적용합니다. -
readme_fuzz_target
및hello_fuzzing_target
두 작업을 추가합니다. 각 작업은jsfuzz
엔진을 사용하여 실행되며, 이 엔진은 처리되지 않은 예외를 충돌로 보고합니다.또는
fuzz-testing-demo/fuzzers/fuzzers.yml
프로젝트 파일에서 이 코드를 복사할 수 있습니다. - 설명적인 커밋 메시지를 작성합니다.
-
대상 브랜치가
add-fuzz-test
인지 확인합니다. - 변경 사항 커밋을 선택합니다.
커버리지 가이드 퍼즈 테스팅을 성공적으로 활성화했습니다. 이제 생성한 파이프라인을 사용하여 퍼즈 테스트를 실행하겠습니다.
퍼즈 테스트 실행
퍼즈 테스트를 실행하려면:
- 왼쪽 사이드바에서 코드 > Merge Request를 선택합니다.
- 새 Merge Request를 선택합니다.
-
소스 브랜치 섹션에서
add-fuzz-test
브랜치를 선택합니다. -
대상 브랜치 섹션에서 네임스페이스 및
main
브랜치가 선택되었는지 확인합니다. - 브랜치 비교 및 계속을 선택합니다.
- Merge Request를 생성합니다.
Merge Request를 생성하면 새 퍼즈 테스트를 실행하는 새 파이프라인이 트리거됩니다. 파이프라인 실행이 완료되면 Merge Request 페이지에서 보안 취약성 알림이 표시됩니다.
각 취약성에 대한 자세한 정보를 확인하려면 각 Unhandled-exception 링크를 선택하세요.
퍼즈 테스트를 성공적으로 실행하고 식별된 취약점을 확인했습니다. 다음으로 식별된 취약점을 수정하겠습니다.
취약점 수정
퍼즈 테스트에서 두 개의 보안 취약점이 식별되었습니다. 해당 취약점을 수정하기 위해 my-tools.js
라이브러리를 사용합니다.
my-tools.js
파일을 생성하려면:
- 프로젝트의
add-fuzz-test
브랜치에 있는지 확인합니다. - 프로젝트의 루트 디렉터리로 이동하고
my-tools.js
파일을 엽니다. -
이 파일의 내용을 다음 코드로 대체합니다:
const fs = require('fs') function sayHello(name) { if(name.includes("z")) { //throw new Error("😡 error name: " + name) console.log("😡 error name: " + name) } else { return "😀 hello " + name } } function readmeContent(name) { let fileName = name => { if(name.includes("w")) { return "./README.txt" } else { return "./README.md" } } //const data = fs.readFileSync(fileName(name), 'utf8') try { const data = fs.readFileSync(fileName(name), 'utf8') return data } catch (err) { console.error(err.message) return "" } } module.exports = { sayHello, readmeContent }
또는
fuzz-testing-demo/javascript/my-tools.js
프로젝트 파일에서 이 코드를 복사할 수 있습니다. - 변경 사항 커밋을 선택합니다. 이렇게 하면 다른 퍼즈 테스트가 실행됩니다.
- 파이프라인 실행이 완료되면 Merge Request의 개요 페이지에서 새로운 잠재적 취약성이 감지되지 않았음을 확인할 수 있습니다.
- 변경 사항을 머지합니다.
축하합니다! 퍼즈 테스트를 성공적으로 실행하고 식별된 보안 취약점을 수정했습니다!
더 많은 정보를 보려면 커버리지 가이드 퍼즈 테스트를 참조하세요.