EN

NRIセキュア ブログ

ソフトウェアサプライチェーンのセキュリティ対策|不正なコミットを「異常検知」で見つける方法

目次

    blogtop

    近年では経済安全保障に関する意識の高まりもあり、ソフトウェアサプライチェーンのサイバーセキュリティ上のリスクが問題視されている。不正なコミット[i]によるバックドアの埋め込みなどの対策が難しいリスクの扱いについて頭を悩ませている組織も多いと思われる。

     

    本記事では、ソフトウェアサプライチェーンにおけるリスクのひとつである不正なコミットの混入リスクやその対策の全体像の説明を行った後、異常検知を用いた不正なコミットの発見のための手法に関する説明とApiiro[ii]というツールを用いて実施した不正なコミットの発見に関する簡単な実験結果の紹介を行う。

     

    [i] 不正なコミット:悪意のある攻撃者が攻撃目的でソースコードリポジトリに対して行う悪性のコミットのこと。コミットの内容としてはリポジトリのソフトウェアやそれを部品として利用する製品への攻撃を容易にするためのバックドアの埋め込みなどが想定される。正規の開発者ではない攻撃者が正規の開発者になりすますなどの方法で悪性のコミットを混入させた事例やコミット権限を持つ正規の開発者が悪性のコミットを行った事例が報告されている。

    [ii] Apiiro:ソフトウェアサプライチェーン全体のアプリケーションセキュリティとリスク管理の自動化のためのプラットフォーム

     

    ソフトウェアサプライチェーンにおける不正なコミット混入のリスク

    従来から、モノの製造における原材料・部品の調達から生産・物流・販売までに渡る一連の供給網のことはサプライチェーンと呼ばれている。ソフトウェアサプライチェーンとは、ソフトウェアに関するサプライチェーンのことで、外部開発の商用・OSSパッケージの調達と自社・委託先における独自ソフトウェアの開発からソフトウェアのビルド・流通・デプロイまでの一連の流れのことを言う。

     

    DXの進展に伴い、モノのサプライチェーンと同様にソフトウェアサプライチェーンを適切に管理することの重要性は増すばかりである。

     

    近年では経済安全保障に関する意識の高まりもあり、ソフトウェアサプライチェーンのサイバーセキュリティ上のリスクが問題視されている。現代のソフトウェアサプライチェーンは大規模で複雑なものとなっており、攻撃者は、複数の組織をまたがるソフトウェアの開発から流通までの各段階のいずれかにおいて、不正なコードの混入やコード・ビルド成果物のすり替えを行うことで、そのソフトウェアを利用するユーザやシステムに対して攻撃を行うことができる。

    図1:ソフトウェアサプライチェーンのリスク

    ソフトウェアサプライチェーンのリスク

    このようなソフトウェアサプライチェーンのリスクの中でも、影響が大きく対策が難しいとされるリスクの1つが、悪意のある攻撃者によるソースコードリポジトリへの不正なコミットのリスクである。バックドアの埋め込みなどが行われることでシステムのセキュリティレベルは大きく低下するため無視できないリスクではあるが、特に正規の開発者による不正なコミットを防止するのはとても難しい。

     

    不正なコミットは、自社あるいは委託先の内部の正規の開発者によるものと、(場合によっては正規の開発者になりすました)それ以外の主体によるものが考えられる。当然、正規の開発者による不正なコミットの方が検知・防止が難しい。

     

    正規の開発者以外の主体による不正なコミットについてはリポジトリへのアクセス制御やコミットへの署名といった既存の技術で検知・防止できる(これらについてはSLSAなどのフレームワークで整理されている)。ここではこれらの方法による防止がより難しい正規の開発者による不正なコミットに対する対策について考える。正規の開発者による不正なコミットを検知するための手法は以下の2種類に大別される。

     

    • コミットの内容に基づく手法
    • コミットの内容以外の観点に基づく手法

     

    前者はSASTや人間によるソースコードレビューなど、後者はリポジトリのメタデータや開発者の振る舞いに着目した異常検知を用いた手法などが該当する。

     

    最も信頼性が高いのは人間によるソースコードレビューであるとされているが、人間が行うため経済的・時間的コストが高く、全ての変更に対して徹底して行うのは難しい。しかし、自動化されたどの検知手法も単独で不正なコミットの高精度な検知を行えるほどは成熟していない。

     

    よって、自動検知手法の利用に際しては手法を適切に組み合わせて利用することと、人間によるソースコードレビューが現実的となるように「怪しい」変更を絞り込む目的で利用することが現実的な解となる。

     

    今回はSAST等と比べるとあまり広く知られていない、異常検知を用いた不正なコミットの発見のための手法について紹介する。

    異常検知を用いた不正なコミットの発見のための手法

    異常検知を用いた不正なコミットの発見のための手法では、コミットの変更の内容・意味には着目せず、各コミットについてリポジトリのメタデータなどから計算される複数の特徴量(指標)の値を計算し、これらの特徴量の値が通常のコミットと大きくかけ離れている場合にそのコミットを異常とみなす。

     

    例えば、あるリポジトリに最後にコミットが行われた日時からの経過時間を特徴量とすることが考えられる。多くのコミットは活発に開発が行われているリポジトリに対して行われるため、1年以上コミットがなされていないリポジトリに対してコミットが行われることは珍しく、異常なコミットとして検知するというような具合である。

     

    異常検知を用いた不正なコミットの発見のための手法には以下のような特徴がある。

    • 特定のプログラミング言語に依らない。
      コミットの変更の内容・意味には着目しないため、ソースコードの理解が必要なく、全ての言語で書かれたソフトウェアに同様に適用できる。
    • SASTのような手法と補完的な関係にある。
      ソースコードの内容に着目するSASTとは原理が異なるため、適切に組み合わせることでより多くの種類の不正なコミットの検知が可能となることが期待できる。

    異常検知を用いた不正なコミットの発見のための手法は、利用する特徴量の一覧と計算された複数の特徴量の値からコミットの異常性を判断する方法によって特徴づけられる。それぞれについて以下で簡単に説明する。

     

    ソースコード管理システムのデータから抽出できる不正なコミットの検知に有効な特徴量としては以下のようなものが知られている[ⅲ]。ソースコード管理システムから得られる特徴量だけでも様々な観点のものがあることが分かる。

    表1:異常コミットによる不正なコミットの発見に利用できる特徴量の例

    No.

    特徴量のカテゴリ

    特徴量の例

    1

    変更に関する簡単な統計量

    ・コミットとその親コミットの差分から得られる簡単な数値化された特徴量を利用する。
    ・例えば、追加・削除された行数、追加・削除・変更されたファイル数、名前が変更されたファイル数、変更されたファイルの種類の数などが挙げられる。

    2

    重要なファイルに対する変更の有無

    ・ビルド定義やシステム設定等に関するファイルを重要なファイルとみなし、これらのファイルへの変更の有無を特徴量とする。

    3

    ファイルの更新履歴に基づく特徴量

    ・コミットで変更が加えられている各ファイルに対するコミットの著者の過去の貢献度を数値化し特徴量とする。
    ・特別な場合としてコミットの著者がはじめて各ファイルに対してはじめて変更を加えたかどうかを特徴量とする。

    4

    コミットの著者の信用に基づく特徴量

    ・コミットの著者の信用度を様々な観点で数値化して特徴量として利用する。
    ・例えば、著者が特定可能なユーザ名を持っているか、著者のアカウントの作成日時

    ・はじめてコミットをした日時からの経過時間、著者が過去にリポジトリに対して行ったコミットの数、コミットが行われた時刻などが挙げられる。

    5

    休眠リポジトリ・ユーザアカウントの利用に関する特徴量

    ・リポジトリに対して最後にコミットが行われた日時からの経過時間、コミットの著者が最後にコミットを行ってからの経過時間などを特徴量とする。

    6

    プルリクエストに関する特徴量

    ・注目しているコミットを含むプルリクエストが過去に却下されたことがあるかどうかを特徴量とする。

     

    様々な特徴量が考案されているが、単独で不正なコミットを高精度で特定できるほど強力なものは無いと考えられている。複数の特徴量を組み合わせて判断を行うことや、一定の過検知を許容し不正なコミットとして検知されたコミットを人間が精査することが重要となる。

     

    計算された複数の特徴量の値からコミットの異常性を判断する方法についても様々なものが考えられるが、ここでは詳しくは触れない。最も単純なのは、単独の特徴量について、過去の平均値からの乖離の度合いによって判定を行うというものである。複数の特徴量に基づく、より精度の高い判定を行う方法としては、前述のような単独の特徴量に基づく判定を組み合わせた決定木を用いる方法などがある。

     

    ここで、精度と同等以上に重要となるのが検知結果の説明性である。上で述べたように(他の自動検知手法と同様に)異常検知による不正なコミットの検知は現状それほど精度が高くなく、自動的に検知されたコミットを人間が確認することが前提となるため、不正なコミットの疑いがある異常なコミットが検知された際に、ユーザに対してなぜそのコミットが異常とみなされたかを説明できることが非常に重要である。上で例に挙げた判定方法はどちらも検知結果の説明性が担保された手法である。

     

    [ⅲ]参考文献:D. Gonzalez, T. Zimmermann, P. Godefroid and M. Schaefer, "Anomalicious: Automated Detection of Anomalous and Potentially Malicious Commits on GitHub," 2021 IEEE/ACM 43rd International Conference on Software Engineering: Software Engineering in Practice (ICSE-SEIP), Madrid, ES, 2021, pp. 258-267, doi: 10.1109/ICSE-SEIP52600.2021.00035.

    ツールによる「不正なコミット」検知の実験結果

    ここまでは異常検知による不正なコミットの発見のための手法を説明してきた。ここからはApiiroというツールを用いて、異常検知により不正なコミットの検知を行った実験の概要と結果を示す。

     

    Apiiroはソースコードリポジトリ・チケット管理システム・アーティファクトリポジトリ・実行環境などソフトウェアサプライチェーンを幅広く監視し、セキュリティに関する情報を収集する。そして、これらの情報を統合的に分析し、アプリケーションの資産管理を行うことで、リスクのある変更を特定・可視化するとともに影響の大きさに基づいてリスクの優先度付けを行うことができる。Apiiroのソースコードの変更を分析する機能の中にはここまで紹介してきた異常検知による不正コミットの発見を行うためのものもいくつか含まれている(例を表2に示す)。

    表2:Apiiroに実装されている異常検知による不正なコミットの発見に関する機能

    No.

    機能

    概要

    1

    休眠リポジトリに対する・休眠開発者によるコミットの検知

    ・長期間変更のなかったリポジトリに対するコミットと、長期間活動していなかった開発者によるコミットをリスクの高い変更として検知する。
    ・検知対象のイベントの名前は"Commit behavior is abnormal"である。
    ・表1の「(5)休眠リポジトリ・ユーザアカウントの利用に関する特徴量」の特徴量を用いて判定を行う。

    2

    依存パッケージ追加の検知

    ・package.jsonなどのビルド定義ファイルを編集し、依存パッケージの追加を行うコミットをリスクの高い変更として検知する。
    ・検知対象のイベントの名前は"Dependencies added"である。
    ・表1の「(2)重要なファイルに対する変更の有無」の特徴量を用いて判定を行う。

    3

    機微ファイルの編集の検知

    ・指定したビルド定義ファイルやシステム設定等に関するファイルに対して変更を行うコミットをリスクの高い変更として検知する。
    ・検知対象のイベントの名前は"Sensitive file"である。
    ・表1の「(2)重要なファイルに対する変更の有無」の特徴量を用いて判定を行う。

     

    今回は1年以上更新されていない休眠リポジトリを用意してApiiroで監視を行い、この休眠リポジトリに対するコミットを異常なイベントとして検知するという実験を行った。実験で用いた休眠リポジトリはOWASP Juice ShopのリポジトリをForkしたうえで、1年分のコミットを削除することで用意した。

     

    休眠リポジトリに対する・休眠開発者によるコミットを検知するためのApiiroのルールは"Abnormal commit behavior detected"というものであり、上の表1の「(5)休眠リポジトリ・ユーザアカウントの利用に関する特徴量」の特徴量を用いて判定を行う。このルールは標準で用意されているものなので、ApiiroをGitHubと連携させるための設定と実験用のリポジトリを監視対象とする設定を行えば準備は完了である。

     

    休眠リポジトリに対して以下のような変更をコミットした。(package.jsonを変更し依存パッケージのバージョンを変更しているが、今回は休眠リポジトリに対するコミットというイベントの検知が主題なので、変更の内容は今回の実験結果には関係がない)

    図2:休眠リポジトリに対する変更の内容

    休眠リポジトリに対する変更の内容

     

    コミット後しばらくするとApiiroによるスキャンが自動的に行われ、上記のコミットが異常なコミットとして検知された。異常とみなされた理由が"Dormant repository"=「休眠リポジトリ(に対するコミット)」であることも明示されている。

    図3:休眠リポジトリに対するコミットがリスクの高いコミットとして検知された

    休眠リポジトリに対するコミットがリスクの高いコミットとして検知された

     

    実際の開発の場面であれば上記のアラートを確認した開発者、あるいは、セキュリティ担当者などが休眠リポジトリに対して行われたコミットを確認し、不正なコミットであるかどうかを判断し、適切な対応を行うこととなる。

     

    Apiiroでは特定のリスクが検知された際に、メールの送信・チャットへの投稿・プルリクエストに対するコメントの投稿・チケットの起票などを、自動的に行う自動化されたワークフローを定義することができ、担当者によるアラートの確認・対応を円滑化できる。このようにツールを用いて不正なコミットの疑いがあるコミットを自動的に検知することで、リスクの高い少数のコミットに人的リソースを集中させることが可能となる。

    最後に

    NRIセキュアテクノロジーズでは、ソフトウェアサプライチェーンのセキュリティ対策に関するコンサルティング支援をはじめとして複数のサービスを提供している。もしソフトウェアサプライチェーンのセキュリティ強化をご検討中、あるいはそもそも何をどこから対応すれば良いか分からない、等のお悩みに直面されているのであれば、ぜひ一度弊社にご相談いただけると幸いである。