# スクリプト インジェクション

スクリプトの挿入と GitHub Actions ワークフローに関連するセキュリティ リスクについて説明します。

## スクリプト インジェクションのリスクを理解する

ワークフロー、[カスタム アクション](/ja/enterprise-server@3.22/actions/concepts/workflows-and-actions/custom-actions)、[複合アクション](/ja/enterprise-server@3.22/actions/tutorials/create-actions/create-a-composite-action)を作成するときは、攻撃者からの信頼されていない入力をコードが実行する可能性があるかどうかを常に考慮する必要があります。 これは、攻撃者が悪意のあるコマンドとスクリプトをコンテキストに追加したときに発生する可能性があります。 ワークフローの実行時に、それらの文字列がコードとして解釈されて、ランナーで実行される場合があります。

攻撃者は、自分の悪意のあるコンテンツを [`github`コンテキスト](/ja/enterprise-server@3.22/actions/reference/workflows-and-actions/contexts#github-context)に追加する可能性があります。これは、潜在的に信頼されない入力として扱う必要があります。 このようなコンテキストは、通常、`body`、`default_branch`、`email`、`head_ref`、`label`、`message`、`name`、`page_name`、`ref`、`title` で終わるものです。 例: `github.event.issue.title`、または `github.event.pull_request.body`。

これらの値が、ワークフロー、アクション、API 呼び出し、またはそれらが実行可能なコードとして解釈される可能性のあるその他の場所に直接流れないようにする必要があります。 他の特権アプリケーション コードに使用するのと同じ防御型プログラミング体制を採用することで、 GitHub Actionsの使用をセキュリティで強化できます。 攻撃者が行う可能性があるステップの一部については、「[セキュリティで保護された使用に関するリファレンス](/ja/enterprise-server@3.22/actions/reference/security/secure-use)」を参照してください。

さらに、それ以外にも、ブランチ名やメール アドレスなど、あまり知られていませんが潜在的に信頼されない入力のソースがあり、許可された内容の観点からは非常に柔軟性があります。 たとえば、`zzz";echo${IFS}"hello";#` は有効なブランチ名であり、ターゲット リポジトリに対する攻撃ベクトルになる可能性があります。

以下のセクションでは、スクリプト インジェクションのリスクを軽減するのに役立つ方法について説明します。

### スクリプト インジェクション攻撃の例

スクリプト インジェクション攻撃は、ワークフローのインライン スクリプト内で直接発生する可能性があります。 次の例のアクションでは、式を使って pull request タイトルの有効性がテストされていますが、スクリプト インジェクションのリスクも加わります。

```yaml
      - name: Check PR title
        run: |
          title="${{ github.event.pull_request.title }}"
          if [[ $title =~ ^octocat ]]; then
          echo "PR title starts with 'octocat'"
          exit 0
          else
          echo "PR title did not start with 'octocat'"
          exit 1
          fi
```

この例の場合、ランナーの一時シェル スクリプト内で `run` コマンドが実行されるため、スクリプト インジェクションに対して脆弱です。 シェル スクリプトを実行する前に、 `${{ }}` 内の式が評価され、結果の値に置き換えられます。これにより、シェル コマンドの挿入に対して脆弱になる可能性があります。

このワークフローにコマンドを挿入するため、攻撃者は `a"; ls $GITHUB_WORKSPACE"` というタイトルの pull request を作成する可能性があります。

![編集モードでの pull request のタイトルのスクリーンショット。 フィールドには、a"; ls $GITHUB\_WORKSPACE" という新しいタイトルが入力されています。](/assets/images/help/actions/example-script-injection-pr-title.png)

この例では、 `"` 文字を使用して `title="${{ github.event.pull_request.title }}"` ステートメントを中断し、ランナーで `ls` コマンドを実行できるようにします。
`ls` コマンドの出力をログで確認できます。

```shell
Run title="a"; ls $GITHUB_WORKSPACE""
README.md
code.yml
example.js
```

ランナーのセキュリティ保護の維持に関するベスト プラクティスについては、「[セキュリティで保護された使用に関するリファレンス](/ja/enterprise-server@3.22/actions/reference/security/secure-use#good-practices-for-mitigating-script-injection-attacks)」をご覧ください。