CI/CDでサードパーティスクリプト・バイナリを使う際の注意点

ROUTE06でプロダクトセキュリティのお手伝いをしている wonda-tea-coffee です。
今回は社内向けに作成した資料を社外向けに一部修正して紹介します。

はじめに

開発のあらゆる場面でサードパーティのスクリプトやバイナリを使用することがあるでしょう。これらは多くの恩恵をもたらす一方で、使い方を誤ると時にセキュリティインシデントに繋がるおそれがあります。

実際にセキュリティインシデントに発展した例としてはコードカバレッジツールであるCodecovへのハッキングが挙げられます。このインシデントでは、Codecovが提供するスクリプトが悪意ある第三者によって改ざんされ、同スクリプトを使用した一部の組織の保有する機密情報が流出しました。
以下では先のインシデントが起きた一因と、望ましいパターンについていくつか紹介します。

アンチパターン

サードパーティスクリプトを使う際、以下のようなコードを一度は見たことがあるのではないでしょうか。

curl -sSL https://install.python-poetry.org | python3 -

これはpoetryのインストールガイドから抜粋したものです。https://install.python-poetry.org からインストール用スクリプトをダウンロードし、そのままPythonコードとして実行しています。今日非常によく見られる類のコードですが、前述のCodecovのハッキングではこのようなコードが問題になりました。先のコードでは https://install.python-poetry.org がハッキングされた場合、任意のPythonコードが実行されてしまいます。

修正例1

https://install.python-poetry.org でホストされているスクリプトはGitHubリポジトリで管理されています。この場合、以下の手順で置き換えることが可能です。

  1. リポジトリのmainブランチのコミット一覧から最新のコミットハッシュを見つける
  2. リポジトリのファイルビュー上部から「Raw」ボタンを押下してプレーンテキストを表示する

リポジトリのファイルビュー上部

  1. 2のURLのmain部分を見つけた1で見つけたハッシュで置き換える

こうすることで特定のコミット時点のスクリプトを使用することができます。

curl -sSL https://raw.githubusercontent.com/python-poetry/install.python-poetry.org/04dd4769d5346e2e09dc68a9515e63c85d589a20/install-poetry.py | python -

修正例2

対象のスクリプトやバイナリがGitHubでホストされ、GitHubのリリース機能が使用されている場合はファイルの中身を直接検証することも有効です。

#!/bin/bash

wget -q -O terragrunt https://github.com/gruntwork-io/terragrunt/releases/download/v0.45.3/terragrunt_linux_amd64
hash=$(sha256sum terragrunt  | awk '{ print $1 }')
if [ "$hash" = "16d9e40b59f94f1640bad00d36afa1cf2082a105f2966aec2a13f685c8447035" ]; then
    # do something
else
    echo "The downloaded terragrunt hash did not match."
    echo $hash
    exit 1
fi

最後に

この他にもアンチパターン、修正例があることでしょう。今後サードパーティのスクリプトやバイナリを使用する際は、一度改ざんリスクについて考えてみてはいかがでしょうか。