Falco GitHubプラグインでDropboxの情報漏洩に対応する

By 清水 孝郎 - NOVEMBER 5, 2022

SHARE:

本文の内容は、2022年11月2日にNigel Douglasが投稿したブログ(https://sysdig.com/blog/dropbox-breach-falco-plugin/)を元に日本語に翻訳・再構成した内容となっております。

11月1日、Dropboxは、攻撃者が、巧妙に設計されたフィッシング攻撃によって盗んだ従業員の認証情報を使って、ある従業員のGitHubアカウントにアクセスし、130以上のコードリポジトリを盗むというセキュリティ侵害を公表しました。

攻撃者がCircleCIのふりをしてDropboxエンジニアのGitHubログイン情報にアクセスした場合(circleci.comのメールアドレスを偽装した巧妙なフィッシング攻撃によって)、その情報を使ってDropbox GitHub組織に侵入し、それらのプライベートGitレポからデータを流出させることができたのです。

Dropboxの従業員は、GitHubアカウントを使用してDropboxのプライベートコードレポにアクセスし、GitHubのログイン情報もCircleCIに入ることができます。

これは、CircleCIのフィッシングの試みが真新しいものではないことに注意することが重要です。この攻撃の3週間前に、GitHubはCircleCIになりすますフィッシングキャンペーンについて警告しています。Dropboxは、フィッシングメールが本物のCircleCIのメールを装った、この既存のキャンペーンの犠牲者でした。

A white background with a diagram - the Falco logo and the GitHub logo are there. Between them are 2 arrows describing steps: 1. Falco automatically configures a web hook per repo. The arrow from the GitHub logo to the Falco says: 2. GitHub sends a message for every user action. A third arrow points down to: 3. Falco notifies you

既知の脅威の攻撃 – フィッシング

フィッシングメールに関する教育は、あなたのビジネスや組織にDropboxのような別の侵害が起こるのを防ぐために重要ですが、敵対者があなたのGithubアカウントにアクセスする方法は他にもたくさんあります。オープンソースのクラウドネイティブランタイムセキュリティプロジェクトであるFalcoを使えば、侵入につながるGitHubのセキュリティ上の欠陥のいくつかに対処することができます。Falco Pluginsを利用することで、Falcoの脅威検知機能をクラウド環境やGitHubのようなサードパーティサービス全体に拡張することができます。

FalcoのGithubプラグイン

FalcoのライブラリやFalco自体は、Pluginを使用することで拡張することができます。
プラグインは、文書化されたAPIに準拠する共有ライブラリであり、以下を可能にします。

  • フィルタリング式/Falco ルールを使って評価することができる新しいイベントソースの追加。
  • イベントから情報を抽出するための新しいフィールドを定義する機能を追加

最近発表されたFalcoにおけるGitHubプラグインは、Dropbox攻撃を含みますがこれに限定されません、一般的な侵害に通常つながる以下のセキュリティ欠陥への対処を行う事を可能にします。GitHubに対してよく使われる攻撃ベクトルについて説明する前に、このプラグインがどのように動作するかを簡単に説明していきましょう。

FalcoとGitHubを統合するのは、わりと簡単です。以下の手順で行います。

  • FalcoにGitHubトークンが渡される。
  • Falcoはそのトークンを使って、あなたが指定したリポジトリごとにwebhookをセットアップする。
  • そして、GitHubがこれらのウェブフックに送信したすべてのメッセージをリッスンする。
  • Falcoはメッセージのデータをフィルターして解釈し、何か悪いことが起こったときに意味のあるアラートを数秒のうちに送信する。
  • あなたは、これらのアラートをあなたのお気に入りの通知チャネル(メール、Slack、SIEMツール)にルーティングすることができますし、自動的に問題を修正するためにレスポンスエンジンでそれらを活用することもできます。

注:Falcoは、まさにストリーミング方式で動作します:いかなるデータもコピーせず、保存せず、インデックスを作成しません。
このため、安価で運用が容易であり、応答性も非常に高くなります。

Gitレポへのシークレットのプッシュを検出する

Dropboxのケースでは、従業員の認証情報はフィッシング攻撃で盗まれましたが、多くの侵入事件では、何も考えずにGitリポジトリにシークレットがプッシュされるだけになっています。クラウド・ネイティブ・アプリケーションでは、シークレットとは、パスワード、トークン、キーなど、少量の機密データを含むオブジェクトのことです。

シークレットを使用すると、アプリケーションのコードに機密データを含める必要がなくなります。しかし、シークレットは公開リポジトリやプライベートリポジトリからアクセスできるようにすべきではありません。これは通常、意図せず、あるいはそれがもたらすリスクについて何も考えずに行われるので、シークレットが公開/非公開の Git レポにプッシュされたらセキュリティチームに通知しなければなりません。

以下は、シークレットが公開リポジトリにプッシュされたことを検出するための Falco のルールです。すぐに、Githubプラグインに使用されている source: github に気づくはずです。いずれかのルールの condition が満たされたとき、Falcoは output フィールドで指定されたとおりにフォーマットされたメッセージを送ります。このメッセージには、たくさんの有用なコンテキストが含まれています。

- rule: Secret pushed into a public repository
  desc: A secret (AWS keys, github token...) was committed into a public repository
  condition: >
    github.type=push
    and github.diff.has_secrets = true
    and github.repo.public=true
  output: >
    One or more secrets were pushed into a public repository
    (repository=%github.repo repo_owner=%github.owner org=%github.org
    user=%github.user secret_types=%github.diff.committed_secrets.desc
    file=%github.diff.committed_secrets.files
    line=%github.diff.committed_secrets.lines
    url=%github.diff.committed_secrets.links)
  priority: CRITICAL
  source: github

上述のように、Falco のルールは、ある程度人間にとって読みやすい YAML フォーマットを提供します。そのため、セキュリティチームがこれらの YAML ファイルをカスタマイズしたり、特定のビジネスニーズに合わせて新しいものを作成したりするのは、むしろ簡単なことなのです。

シークレットがプライベートレポにプッシュされるインスタンスのための Falco ルールを構築するために、ルールをわずかに修正するだけです。

- rule: Secret pushed into a private repository
  desc: A secret (AWS keys, github token...) was committed into a private repository
  condition: github.type=push and github.diff.has_secrets = true and github.repo.public=false
  output: One or more secrets were pushed into a private repository (repository=%github.repo repo_owner=%github.owner org=%github.org user=%github.user secret_types=%github.diff.committed_secrets.desc file=%github.diff.committed_secrets.files line=%github.diff.committed_secrets.lines url=%github.diff.committed_secrets.links)
  priority: CRITICAL
  source: github

Dropboxの侵害の場合、130のプライベートレポが敵対者にアクセス可能な状態になりました。もしシークレットがこれらのプライベートレポにプッシュされた場合、意図的かどうかに関わらず、攻撃者はそれらの機密情報をスクレイピングし、追加のサービスやインフラにアクセスできるようになる可能性があります。

だからこそ、こうした安全でない行動を監視し、たとえ侵入されたとしても、その範囲を限定するために最善を尽くすことが重要なのです。

パブリックとプライベートのFalcoルールの唯一の違いは、github.repo.public の条件を「true」から「false」に変更したことです。

Falcoルールを構築するのがいかに簡単であったかと同様に、Falcoプラグインも開発するのはむしろ簡単です。Falcoコミュニティチームは、Falco用のHashicorp Nomadプラグインの構築方法を紹介する有益なセッションをYouTubeで開催しました。また、MFAスパム攻撃を検出するOktaプラグインの記事で詳しく調べることができます。

GitHubからの共同作業者の追加と削除

Dropboxの不正アクセスでは、社員が盗んだ認証情報を使っていましたが、彼らはGitHubですべてのアクションをなりすましユーザーとして行っていたと思われます。インサイダーの脅威や、高い権限を持つユーザーアカウントにアクセスした人物を想定すると、彼らはプロジェクトに共同作業者を追加し、プロジェクトの「正規」ユーザーとして検知を回避しようとする可能性があります。

2つのシンプルなFalcoルールを作成し、共同作業者が追加されたとき(正当かどうかにかかわらず)、および共同作業者が削除されたときに検出できるようにすることができます。もし攻撃者がアカウントを乗っ取ることを望むなら、彼らは既存の協力者を削除しようとするかもしれません。以下のFalcoルールは、それらの試みを検出します。

- rule: Remove Collaborator from Repository
  desc: Detect the removal of a collaborator from a repository
  condition: github.type=member and github.action=removed
  output: A collaborator was removed from a repository (repository=%github.repo repo_owner=%github.owner org=%github.org user=%github.user collaborator=%github.collaborator.name)
  priority: INFO
  source: github

もし、企業以外のメールアドレスをプロジェクトに追加しようとした場合、例えば [email protected] のように、Falco ルールの出力にある collaborator フィールドにこのように表示されるはずです。

これらのアラートのほとんどは優先順位が「情報」であると考えられていますが、これらのINFOアラートはGithubの可能な限り早いIndicator of Compromise(IoC)の一部であると考えるべきでしょう。

- rule: Add Collaborator to Repository
  desc: Detect the addition of a collaborator to a repository
  condition: github.type=member and github.action=added
  output: A collaborator was added to a repository (repository=%github.repo repo_owner=%github.owner org=%github.org user=%github.user collaborator=%github.collaborator.name role=%github.collaborator.role)
  priority: INFO
  source: github

非公開のリポジトリが公開に

Dropboxの事件の場合、攻撃者は従業員の認証情報を盗んだ後、DropboxのGitHub組織の1つにアクセスし、130以上のコードリポジトリを盗み出すことができました。

注目すべきは、Githubが「当社のコアアプリやインフラのコードは含まれていなかった」という点です。これらのリポジトリへのアクセスはさらに制限され、厳しく管理されています」と同社は付け加えている。

このシナリオでは、Dropboxチームは、データ流出の対象とはならないさまざまなレベルの制限のあるレポを持っていました。残念ながら、シークレットが公開されるのと同じように、多くの組織がプライベートリポジトリに対して同じことをしています。ありがたいことに、この正確な動作がDropboxに起こったわけではありません!

- rule: Private Repository Becoming Public
  desc: Detect changing the visibility of a repository to public
  condition: >
   github.type=repository and github.action=publicized
  output: >
    A repository went from private to public
    (repository=%github.repo repo_owner=%github.owner
    org=%github.org user=%github.user)
  priority: CRITICAL
  source: github

繰り返しますが、プライベートリポジトリがあっても、そのプライベートリポジトリにアクセスするための認証情報がすでに盗まれていれば、あなたのコードは安全ではありません。
しかし、家のセキュリティの例えを続けるなら、会社のコードが入った公開リポジトリを持つことは、ドアのない家を持つようなものです。リポジトリを公開しないことは重要ですが、しかし、Githubのようなサービスからの潜在的なデータ流出を防ぐことができるようにすることも必要です。

GitHubは、侵害の直後にプライベートリポジトリからのコンテンツの流出を検出したことを確認しており、脅威者はVPNやプロキシサービスを使用して追跡を困難にしています。Git Cloneを実行したり、リポジトリの可視性を「公開」に変更しようとする試みは、「クリティカル」な優先順位で処理されるべきです。

GitHubアクションによるクリプトマイニング

繰り返しになりますが、Dropboxの情報漏えいと同様に、ビジネス上の機密情報の損失はどの組織にとっても大きな懸念事項ですが、Githubの攻撃対象はさらなる頭痛の種を引き起こす可能性がありました。

Githubでは、GitHub Actionsと呼ばれる機能により、選択したGitHubイベント(例えばPRのマージなど)に応じて任意のコードを実行することが可能です。Github Actionsは、自動化と統合によってコードリポジトリを拡張するための素晴らしい方法です。

最近、Sysdig Threat Research Teamは、GitHub Actionsを活用した大規模なクリプトマイニングの活動を発見しました。今回確認されたのは、CI/CDプラットフォームの無料トライアルアカウントに割り当てられた計算機を悪用する「freejacking」と呼ばれる行為です。このフリージャッキングは目新しいものではありませんが、新しいクラウドサービスが誕生し、無料で提供されるのに伴い、こうした攻撃の頻度が増しています。

暗号通貨マイニングの増加は、悪意のあるアクターが攻撃を拡大できる状況において特に顕著であり、数時間であってもかなりの利益を得ることができるほどです。以下のFalcoルールは、Githubのアクションがマイナーと一緒に使用されている場合、具体的に検出することができます。

- rule: Github action with miners
  desc: a github action containing crypto miners was executed
  condition: >
    github.type=workflow_run and github.workflow.has_miners=true
  output: >
    a github action containing crypto miners was executed
    (repository=%github.repo repo_owner=%github.owner org=%github.org
    user=%github.user file=%github.workflow.filename)
  priority: CRITICAL
  source: github

condition フィールドが、miners の実行を指す workflow_run タイプの webhook メッセージに対してどのようにフィルタリングしているかに注目してください。Github.workflow.has_miners は、ワークフローの定義ファイルをフェッチして一行ずつスキャンし、xmrig などのよく知られたマイナー・バイナリーの実行を識別するパターンを探す、別のマクロです。

まとめ

公開されたgitリポジトリにシークレットをプッシュするという問題は、現時点ではかなりよく知られているにもかかわらず、トヨタ自動車でのごく最近のものを含め、シークレットのリークが原因で数年間に多くの有名なデータ漏洩が起こりました。FalcoのGithubプラグインを使えば、このような間違いをさらに犯す前に、この種の設定ミスに警告を発することができます。

クリプトマイニングギャングが無料のクラウドコンピューティングプラットフォームを悪用していることについて触れました。このように悪用されているサービスのリストには、GitLab、Microsoft Azure、TravisCI、LayerCI、CircleCI、Render、CloudBees CodeShip、Sourcehut、Oktetoといったものが含まれています。これは、GitHubだけの問題ではない。サービス内のクリプトマイニングの不正使用を検出できるクラウドネイティブのエコシステムには、Falcoプラグインの機会が無限にあります。

最近のDropbox GitHubの侵害の場合、他のすべての侵害と同様に、従業員の認証情報が高度なフィッシング攻撃によってアクセスされたことから始まりました。いったん侵入されたら、私たちは被害の範囲を監視する必要があります。Falcoのプラグインを使えば、プロジェクトに共同作業者を追加したり削除したりする永続性を獲得するための事後探索の試みを検出することができます。


Falcoのルールセットはカスタマイズ可能であるため、クリプトマイニングの例に限らず、Githubで新たに発見された脅威に特化したセキュリティルールを構築することが容易です。私たちは現在、あなたのGitレポ内で公開される可能性のある一般的なシークレットの種類の束を識別しています。しかし、新しいシークレットの検出を追加するには、secrets.go の secretsChecks 配列に新しいエントリを追加するだけです。

もし、あなた自身のFalcoプラグインを作成したい場合は、Falcoプラグイン開発ガイドをご覧ください。