正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

チュートリアル: GitLabでファズテストを実行する(非推奨)

  • プラン: Ultimate
  • 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated

カバレッジガイドファズテストはGitLab 18.0で非推奨となり、19.0で削除される予定です。これは破壊的な変更です。

カバレッジガイドファズテストは、予期しない不正な形式データやランダムなデータをアプリケーションに送信し、不安定な動作やクラッシュがないか監視します。

これにより、他の品質保証プロセスでは見逃される可能性のあるバグや潜在的なセキュリティ上の問題を検出できます。

ファズテストは、他のセキュリティスキャナーや独自のテストプロセスに追加して使用する必要があります。GitLab CI/CDを使用している場合は、継続的インテグレーションとデリバリーワークフローの一部としてファズテストを実行できます。

このチュートリアルでJavaScriptを使用してカバレッジガイドファズテストをセットアップ、構成、および実行するには、次の手順を実行します:

  1. ファズテストを実行するプロジェクトを作成するために、プロジェクトテンプレートをフォークする
  2. ファズターゲットを作成する
  3. フォークしたプロジェクトでカバレッジガイドファズテストを有効にする
  4. セキュリティの脆弱性を特定するためにファズテストを実行する
  5. ファズテストで特定された脆弱性を修正する

プロジェクトテンプレートをフォークする

まず、ファズテストを試すプロジェクトを作成するには、fuzz-testingプロジェクトテンプレートをフォークする必要があります:

  1. fuzz-testingプロジェクトテンプレートを開きます。
  2. プロジェクトテンプレートをフォークする
  3. プロジェクトテンプレートをフォークする場合:

正常にfuzz-testingプロジェクトテンプレートをフォークしました。ファズテストを開始する前に、プロジェクトテンプレートとフォークの関係を削除します:

  1. 左側のサイドバーで、設定 > 一般を選択します。
  2. 高度な設定を展開します。
  3. フォークの関係を削除セクションで、フォークの関係を削除を選択します。プロンプトが表示されたら、プロジェクトの名前を入力します。

プロジェクトの準備が完了し、ファズテストを作成できるようになりました。次に、ファズターゲットを作成します。

ファズターゲットを作成する

ファズテストのプロジェクトができたので、ファズターゲットを作成します。ファズターゲットは、入力が与えられたときに、テスト対象のアプリケーションを呼び出す関数またはプログラムです。

このチュートリアルでは、ファズターゲットは、パラメータとしてランダムなバッファを使用して、my-tools.jsファイルの関数を呼び出す。

2つのファズターゲットファイルを作成するには:

  1. 左側のサイドバーで、検索または移動先を選択し、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 Branch(ターゲットブランチ)にadd-fuzz-testという名前を付け、記述的なコミットメッセージを作成します。

    • Start a new merge request with these changes(これらの変更で新しいマージリクエストを開始する)チェックボックスはまだ選択しないでください。
  5. 変更をコミットするを選択します。

  6. プロジェクトのルートディレクトリに戻ります。

  7. add-fuzz-testブランチにいることを確認してください。

  8. fuzz-readme.jsという名前の2番目のファイルを作成し、次のコードを追加します:

    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 Branch(ターゲットブランチ)がadd-fuzz-testであることを確認してください。

  11. 変更をコミットするを選択します。

これで、テスト対象のアプリケーションを呼び出すことができる2つのファズターゲットができました。次に、ファズテストを有効にします。

カバレッジガイドファズテストを有効にします。

カバレッジガイドファズテストを有効にするには、2つのファズターゲットでファズテストを実行するgitlab-cov-fuzzコマンドラインインターフェースを実行する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ステージ。
    • 2つのジョブ、readme_fuzz_targethello_fuzzing_target。各ジョブはjsfuzzエンジンを使用して実行され、未処理の例外をクラッシュとしてレポートします。

    このコードは、fuzz-testing-demo/fuzzers/fuzzers.ymlプロジェクトファイルからコピーすることもできます。

  4. 記述的なコミットメッセージを作成します。

  5. Target Branch(ターゲットブランチ)がadd-fuzz-testであることを確認してください。

  6. 変更をコミットするを選択します。

カバレッジガイドファズテストが正常に有効になりました。次に、作成したパイプラインを使用してファズテストを実行します。

ファズテストの実行

ファズテストを実行するには:

  1. 左側のサイドバーで、コード > マージリクエストを選択します。
  2. 新しいマージリクエストを選択します。
  3. ソースブランチセクションで、add-fuzz-testブランチを選択します。
  4. ターゲットブランチセクションで、ネームスペースとmainブランチが選択されていることを確認します。
  5. ブランチを比較して続行するを選択します。
  6. マージリクエストを作成する

マージリクエストを作成すると、ファズテストを実行する新しいパイプラインがトリガーされます。パイプラインの実行が終了すると、マージリクエストページにセキュリティの脆弱性アラートが表示されます。

各脆弱性の詳細を表示するには、個々のUncaught-exception(Uncaught-exception)リンクを選択します。

ファズテストが正常に実行され、修正する脆弱性が特定されました。

脆弱性を修正する

ファズテストで2つのセキュリティ脆弱性が特定されました。これらの脆弱性を修正するには、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. 変更をコミットするを選択します。これにより、別のファズテストを実行するために別のパイプラインがトリガーされます。

  5. パイプラインが終了したら、マージリクエストの概要ページを確認します。セキュリティスキャンで、新しい潜在的な脆弱性が検出されなかったことがわかります。

  6. 変更をマージします。

おめでとうございます。ファズテストが正常に実行され、特定されたセキュリティ脆弱性を修正しました。

詳細については、カバレッジガイドファズテストを参照してください。