InfoGrab Docs

튜토리얼: GitLab에서 퍼즈 테스트 수행 (사용 중단)

요약

커버리지 기반 퍼즈 테스트가 GitLab 18.0에서 사용 중단되었으며 19.0에서 제거될 예정입니다. 커버리지 기반 퍼즈 테스트는 예상치 못한, 잘못된 형식의, 또는 랜덤 데이터를 애플리케이션에 전송한 다음 불안정한 동작과 크래시를 모니터링합니다.

Warning

커버리지 기반 퍼즈 테스트가 GitLab 18.0에서 사용 중단되었으며 19.0에서 제거될 예정입니다. 이는 브레이킹 체인지입니다.

커버리지 기반 퍼즈 테스트는 예상치 못한, 잘못된 형식의, 또는 랜덤 데이터를 애플리케이션에 전송한 다음 불안정한 동작과 크래시를 모니터링합니다.

이를 통해 다른 QA 프로세스에서 놓칠 수 있는 버그와 잠재적인 보안 문제를 발견할 수 있습니다.

퍼즈 테스트는 다른 보안 스캐너와 자체 테스트 프로세스에 더하여 사용해야 합니다. GitLab CI/CD를 사용하는 경우 CI/CD 워크플로우의 일부로 퍼즈 테스트를 실행할 수 있습니다.

이 튜토리얼에서 JavaScript를 사용하여 커버리지 기반 퍼즈 테스트를 설정, 구성 및 수행하려면 다음을 수행합니다:

  1. 프로젝트 템플릿 포크하여 퍼즈 테스트를 실행할 프로젝트를 만듭니다.
  2. 퍼즈 대상 만들기.
  3. 포크된 프로젝트에서 커버리지 기반 퍼즈 테스트 활성화.
  4. 보안 취약점을 식별하기 위해 퍼즈 테스트 실행.
  5. 퍼즈 테스트에서 식별된 취약점 수정.

프로젝트 템플릿 포크#

먼저 퍼즈 테스트를 사용해볼 프로젝트를 만들려면 fuzz-testing 프로젝트 템플릿을 포크해야 합니다:

  1. fuzz-testing 프로젝트 템플릿을 엽니다.
  2. 프로젝트 템플릿을 포크합니다.
  3. 프로젝트 템플릿을 포크할 때:

fuzz-testing 프로젝트 템플릿을 성공적으로 포크했습니다. 퍼즈 테스트를 시작하기 전에 프로젝트 템플릿과 포크 간의 관계를 제거합니다:

  1. 왼쪽 사이드바에서 Settings > General을 선택합니다.
  2. Advanced를 펼칩니다.
  3. Remove fork relationship 섹션에서 Remove fork relationship을 선택합니다. 메시지가 표시되면 프로젝트 이름을 입력합니다.

프로젝트가 준비되었고 이제 퍼즈 테스트를 만들 수 있습니다. 다음으로 퍼즈 대상을 만듭니다.

퍼즈 대상 만들기#

이제 퍼즈 테스트용 프로젝트가 있으니 퍼즈 대상을 만듭니다. 퍼즈 대상은 입력이 주어지면 테스트 중인 애플리케이션을 호출하는 함수 또는 프로그램입니다.

이 튜토리얼에서 퍼즈 대상은 랜덤 버퍼를 매개변수로 사용하여 my-tools.js 파일의 함수를 호출합니다.

두 개의 퍼즈 대상 파일을 만들려면:

  1. 상단 바에서 Search or go to를 선택하고 fuzz-testing-demo 프로젝트를 찾습니다.

  2. 프로젝트의 루트 디렉토리에 파일을 만듭니다.

  3. 파일 이름을 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 프로젝트 파일에서 이 코드를 복사할 수도 있습니다.

  4. Target Branchadd-fuzz-test로 이름을 지정하고 설명적인 커밋 메시지를 작성합니다.

    • 아직 Start a new merge request with these changes 체크박스를 선택하지 마세요.
  5. Commit changes를 선택합니다.

  6. 프로젝트의 루트 디렉토리로 돌아갑니다.

  7. add-fuzz-test 브랜치에 있는지 확인합니다.

  8. 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 프로젝트 파일에서 이 코드를 복사할 수도 있습니다.

  9. 설명적인 커밋 메시지를 작성합니다.

  10. Target Branchadd-fuzz-test인지 확인합니다.

  11. Commit changes를 선택합니다.

이제 테스트 중인 애플리케이션을 호출할 수 있는 두 개의 퍼즈 대상이 있습니다. 다음으로 퍼즈 테스트를 활성화합니다.

커버리지 기반 퍼즈 테스트 활성화#

커버리지 기반 퍼즈 테스트를 활성화하려면 gitlab-cov-fuzz CLI를 실행하는 CI/CD 파이프라인을 만들어 두 퍼즈 대상에서 퍼즈 테스트를 실행합니다.

파이프라인 파일을 만들려면:

  1. add-fuzz-test 브랜치에 있는지 확인합니다.

  2. fuzz-testing-demo 프로젝트의 루트 디렉토리에서 새 파일을 만듭니다.

  3. 파일 이름을 .gitlab-ci.yml로 지정하고 다음 코드를 추가합니다:

    default:
      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
    

    이 단계는 파이프라인에 다음을 추가합니다:

    • 템플릿을 사용하는 fuzz 스테이지.
    • 두 개의 잡, readme_fuzz_targethello_fuzzing_target. 각 잡은 처리되지 않은 예외를 크래시로 보고하는 jsfuzz 엔진을 사용하여 실행됩니다.

    fuzz-testing-demo/fuzzers/fuzzers.yml 프로젝트 파일에서 이 코드를 복사할 수도 있습니다.

  4. 설명적인 커밋 메시지를 작성합니다.

  5. Target Branchadd-fuzz-test인지 확인합니다.

  6. Commit changes를 선택합니다.

커버리지 기반 퍼즈 테스트가 성공적으로 활성화되었습니다. 다음으로 방금 만든 파이프라인을 사용하여 퍼즈 테스트를 실행합니다.

퍼즈 테스트 실행#

퍼즈 테스트를 실행하려면:

  1. 왼쪽 사이드바에서 Code > Merge requests를 선택합니다.
  2. New merge request를 선택합니다.
  3. Source branch 섹션에서 add-fuzz-test 브랜치를 선택합니다.
  4. Target branch 섹션에서 네임스페이스와 main 브랜치가 선택되어 있는지 확인합니다.
  5. Compare branches and continue를 선택합니다.
  6. 머지 리퀘스트를 만듭니다.

머지 리퀘스트를 만들면 새 파이프라인이 트리거되어 퍼즈 테스트가 실행됩니다. 파이프라인 실행이 완료되면 머지 리퀘스트 페이지에 보안 취약점 알림이 표시됩니다.

각 취약점에 대한 자세한 정보를 보려면 개별 Uncaught-exception 링크를 선택합니다.

퍼즈 테스트를 성공적으로 실행하고 수정할 취약점을 식별했습니다.

취약점 수정#

퍼즈 테스트에서 두 가지 보안 취약점이 식별되었습니다. 이러한 취약점을 수정하려면 my-tools.js 라이브러리를 사용합니다.

my-tools.js 파일을 만들려면:

  1. 프로젝트의 add-fuzz-test 브랜치에 있는지 확인합니다.

  2. 프로젝트의 루트 디렉토리로 이동하여 my-tools.js 파일을 엽니다.

  3. 이 파일의 내용을 다음 코드로 교체합니다:

    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 프로젝트 파일에서 코드를 복사할 수도 있습니다.

  4. Commit changes를 선택합니다. 이렇게 하면 또 다른 파이프라인이 트리거되어 다른 퍼즈 테스트가 실행됩니다.

  5. 파이프라인이 완료되면 머지 리퀘스트 Overview 페이지를 확인합니다. 보안 스캔에서 새로운 잠재적 취약점이 감지되지 않았다는 것을 확인해야 합니다.

  6. 변경 사항을 머지합니다.

축하합니다, 퍼즈 테스트를 성공적으로 실행하고 식별된 보안 취약점을 수정했습니다!

자세한 내용은 커버리지 기반 퍼즈 테스트를 참조하세요.

튜토리얼: GitLab에서 퍼즈 테스트 수행 (사용 중단)

Tier: Ultimate
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
원문 보기
요약

커버리지 기반 퍼즈 테스트가 GitLab 18.0에서 사용 중단되었으며 19.0에서 제거될 예정입니다. 커버리지 기반 퍼즈 테스트는 예상치 못한, 잘못된 형식의, 또는 랜덤 데이터를 애플리케이션에 전송한 다음 불안정한 동작과 크래시를 모니터링합니다.

Warning

커버리지 기반 퍼즈 테스트가 GitLab 18.0에서 사용 중단되었으며 19.0에서 제거될 예정입니다. 이는 브레이킹 체인지입니다.

커버리지 기반 퍼즈 테스트는 예상치 못한, 잘못된 형식의, 또는 랜덤 데이터를 애플리케이션에 전송한 다음 불안정한 동작과 크래시를 모니터링합니다.

이를 통해 다른 QA 프로세스에서 놓칠 수 있는 버그와 잠재적인 보안 문제를 발견할 수 있습니다.

퍼즈 테스트는 다른 보안 스캐너와 자체 테스트 프로세스에 더하여 사용해야 합니다. GitLab CI/CD를 사용하는 경우 CI/CD 워크플로우의 일부로 퍼즈 테스트를 실행할 수 있습니다.

이 튜토리얼에서 JavaScript를 사용하여 커버리지 기반 퍼즈 테스트를 설정, 구성 및 수행하려면 다음을 수행합니다:

  1. 프로젝트 템플릿 포크하여 퍼즈 테스트를 실행할 프로젝트를 만듭니다.
  2. 퍼즈 대상 만들기.
  3. 포크된 프로젝트에서 커버리지 기반 퍼즈 테스트 활성화.
  4. 보안 취약점을 식별하기 위해 퍼즈 테스트 실행.
  5. 퍼즈 테스트에서 식별된 취약점 수정.

프로젝트 템플릿 포크#

먼저 퍼즈 테스트를 사용해볼 프로젝트를 만들려면 fuzz-testing 프로젝트 템플릿을 포크해야 합니다:

  1. fuzz-testing 프로젝트 템플릿을 엽니다.
  2. 프로젝트 템플릿을 포크합니다.
  3. 프로젝트 템플릿을 포크할 때:

fuzz-testing 프로젝트 템플릿을 성공적으로 포크했습니다. 퍼즈 테스트를 시작하기 전에 프로젝트 템플릿과 포크 간의 관계를 제거합니다:

  1. 왼쪽 사이드바에서 Settings > General을 선택합니다.
  2. Advanced를 펼칩니다.
  3. Remove fork relationship 섹션에서 Remove fork relationship을 선택합니다. 메시지가 표시되면 프로젝트 이름을 입력합니다.

프로젝트가 준비되었고 이제 퍼즈 테스트를 만들 수 있습니다. 다음으로 퍼즈 대상을 만듭니다.

퍼즈 대상 만들기#

이제 퍼즈 테스트용 프로젝트가 있으니 퍼즈 대상을 만듭니다. 퍼즈 대상은 입력이 주어지면 테스트 중인 애플리케이션을 호출하는 함수 또는 프로그램입니다.

이 튜토리얼에서 퍼즈 대상은 랜덤 버퍼를 매개변수로 사용하여 my-tools.js 파일의 함수를 호출합니다.

두 개의 퍼즈 대상 파일을 만들려면:

  1. 상단 바에서 Search or go to를 선택하고 fuzz-testing-demo 프로젝트를 찾습니다.

  2. 프로젝트의 루트 디렉토리에 파일을 만듭니다.

  3. 파일 이름을 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 프로젝트 파일에서 이 코드를 복사할 수도 있습니다.

  4. Target Branchadd-fuzz-test로 이름을 지정하고 설명적인 커밋 메시지를 작성합니다.

    • 아직 Start a new merge request with these changes 체크박스를 선택하지 마세요.
  5. Commit changes를 선택합니다.

  6. 프로젝트의 루트 디렉토리로 돌아갑니다.

  7. add-fuzz-test 브랜치에 있는지 확인합니다.

  8. 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 프로젝트 파일에서 이 코드를 복사할 수도 있습니다.

  9. 설명적인 커밋 메시지를 작성합니다.

  10. Target Branchadd-fuzz-test인지 확인합니다.

  11. Commit changes를 선택합니다.

이제 테스트 중인 애플리케이션을 호출할 수 있는 두 개의 퍼즈 대상이 있습니다. 다음으로 퍼즈 테스트를 활성화합니다.

커버리지 기반 퍼즈 테스트 활성화#

커버리지 기반 퍼즈 테스트를 활성화하려면 gitlab-cov-fuzz CLI를 실행하는 CI/CD 파이프라인을 만들어 두 퍼즈 대상에서 퍼즈 테스트를 실행합니다.

파이프라인 파일을 만들려면:

  1. add-fuzz-test 브랜치에 있는지 확인합니다.

  2. fuzz-testing-demo 프로젝트의 루트 디렉토리에서 새 파일을 만듭니다.

  3. 파일 이름을 .gitlab-ci.yml로 지정하고 다음 코드를 추가합니다:

    default:
      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
    

    이 단계는 파이프라인에 다음을 추가합니다:

    • 템플릿을 사용하는 fuzz 스테이지.
    • 두 개의 잡, readme_fuzz_targethello_fuzzing_target. 각 잡은 처리되지 않은 예외를 크래시로 보고하는 jsfuzz 엔진을 사용하여 실행됩니다.

    fuzz-testing-demo/fuzzers/fuzzers.yml 프로젝트 파일에서 이 코드를 복사할 수도 있습니다.

  4. 설명적인 커밋 메시지를 작성합니다.

  5. Target Branchadd-fuzz-test인지 확인합니다.

  6. Commit changes를 선택합니다.

커버리지 기반 퍼즈 테스트가 성공적으로 활성화되었습니다. 다음으로 방금 만든 파이프라인을 사용하여 퍼즈 테스트를 실행합니다.

퍼즈 테스트 실행#

퍼즈 테스트를 실행하려면:

  1. 왼쪽 사이드바에서 Code > Merge requests를 선택합니다.
  2. New merge request를 선택합니다.
  3. Source branch 섹션에서 add-fuzz-test 브랜치를 선택합니다.
  4. Target branch 섹션에서 네임스페이스와 main 브랜치가 선택되어 있는지 확인합니다.
  5. Compare branches and continue를 선택합니다.
  6. 머지 리퀘스트를 만듭니다.

머지 리퀘스트를 만들면 새 파이프라인이 트리거되어 퍼즈 테스트가 실행됩니다. 파이프라인 실행이 완료되면 머지 리퀘스트 페이지에 보안 취약점 알림이 표시됩니다.

각 취약점에 대한 자세한 정보를 보려면 개별 Uncaught-exception 링크를 선택합니다.

퍼즈 테스트를 성공적으로 실행하고 수정할 취약점을 식별했습니다.

취약점 수정#

퍼즈 테스트에서 두 가지 보안 취약점이 식별되었습니다. 이러한 취약점을 수정하려면 my-tools.js 라이브러리를 사용합니다.

my-tools.js 파일을 만들려면:

  1. 프로젝트의 add-fuzz-test 브랜치에 있는지 확인합니다.

  2. 프로젝트의 루트 디렉토리로 이동하여 my-tools.js 파일을 엽니다.

  3. 이 파일의 내용을 다음 코드로 교체합니다:

    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 프로젝트 파일에서 코드를 복사할 수도 있습니다.

  4. Commit changes를 선택합니다. 이렇게 하면 또 다른 파이프라인이 트리거되어 다른 퍼즈 테스트가 실행됩니다.

  5. 파이프라인이 완료되면 머지 리퀘스트 Overview 페이지를 확인합니다. 보안 스캔에서 새로운 잠재적 취약점이 감지되지 않았다는 것을 확인해야 합니다.

  6. 변경 사항을 머지합니다.

축하합니다, 퍼즈 테스트를 성공적으로 실행하고 식별된 보안 취약점을 수정했습니다!

자세한 내용은 커버리지 기반 퍼즈 테스트를 참조하세요.