Trojankunのブログ

IT・セキュリティ関連の記事を書きます。

.gitディレクトリを狙った攻撃に関する調査

/.git/HEAD 宛のリクエス

監視しているサーバに次のようなHTTPリクエストが来ていました。

GET /.git/HEAD

このリクエストは設定誤りで公開されている.gitディレクトリがないか探索している通信です。 以前から何度もこのリクエストを見かけていたのですが、.gitディレクトリを公開していなければ問題ない通信なので深くは調べていませんでした。 いい機会なので今回調べてみようと思います。


参考


攻撃者が.gitディレクトリを狙う理由

.gitディレクトリにはgitに関する設定ファイルやプロジェクトのソースコードが含まれています。 ソースコードにはAPIキーや資格情報がハードコードされている場合もあり、攻撃者はこれを狙っています。 また、アプリケーションのソースコードが入手できれば攻撃者はじっくりとソースコードを解析することができ、 闇雲に攻撃するよりも効率良く攻撃が可能になります。


.gitディレクトリの構成(簡略化)

攻撃の解説の前に簡単に.gitディレクトリの構成について触れておきます。 gitの利用を始めると.gitディレクトリが作成され、.gitディレクトリ配下にHEADやconfigといったファイルが作成されます。 これらのファイルは標準的に.gitディレクトリ内に存在するので、攻撃者にとって狙いやすいファイルです。

.
├── HEAD
├── config
:
├── objects
│   ├── 11
│   │   └── 11aaaa2222bbbb3333cccc4444dddd5555eeee
│   ├── 66
│   │   └── 66ffff7777aaaa8888bbbb9999cccc0000dddd
│   ├── ee
│   │   └── ee1111ffff2222aaaa3333bbbb4444cccc5555
:
└── refs
    ├── heads
    :└── master

またobjectsディレクトリにはgitオブジェクト(=ソースコードだと思って下さい)が保存されていますが、ディレクトリ構成が少々複雑です。 それぞれのgitオブジェクトに対して40桁のSHA1ハッシュ値が生成され、先頭2文字がディレクトリ名、残り38文字がファイル名として利用されます。 SHA1ハッシュ値eeee1111ffff2222aaaa3333bbbb4444cccc5555のgitオブジェクトの場合は、/.git/objects/ee/ee1111ffff2222aaaa3333bbbb4444cccc5555 に配置されます。


攻撃者の最初のアクション

攻撃者が最初に確認したいことは、.gitディレクトリが公開されているかどうかです。 攻撃者は/.gitへアクセスし、.gitディレクトリの公開状況について確認します。

パターン① /.gitへアクセスが可能であり、ファイルの一覧表示が可能である
パターン② /.gitへアクセスすると403(Forbidden)エラーが発生する
パターン③ /.gitへアクセスすると404(Not Found)エラーが発生する

①の場合は.gitディレクトリが公開されており、.gitディレクトリ上のすべてのファイルが取得可能です。 逆に③の場合は.gitディレクトリが公開されていないため、攻撃は不成立となります。 そして②の場合、.gitディレクトリを直接見ることはできませんが、.gitディレクトリ上のファイルを直接指定することでそのファイルを参照できます。 ここで.gitディレクトリ内に標準的に存在する/.git/HEAD へのアクセスが試行されます。


攻撃者が/.git/HEADにアクセスし確認したいこと

攻撃者が/.git/HEADへアクセスする理由はもう1つあります。
上記の②のパターンの場合、攻撃者は入手したいソースコードのパスを直接指定する必要があります。 しかし、gitオブジェクトが置かれるパスはgitオブジェクトのSHA1ハッシュ値から生成され、 例としてSHA1ハッシュ値eeee1111ffff2222aaaa3333bbbb4444cccc5555のgitオブジェクトの場合は、 /.git/objects/ee/ee1111ffff2222aaaa3333bbbb4444cccc5555に配置されます。 攻撃者はgitオブジェクトのSHA1ハッシュ値がわからないはずなので、/.git/objects/ee/ee1111ffff2222aaaa3333bbbb4444cccc5555のような複雑なパスにはアクセスできないように思えますが、/.git/HEADや/.git/refs/heads/master のファイルの中にはgitオブジェクトのSHA1ハッシュ値に関する情報が格納されているため、これを知るために攻撃者は/.git/HEADにアクセスしてきます。


その他
  • /.git/HEAD へアクセスしてきた通信のUserAgentを見てみると、Headless Chrome でした。
    • 攻撃者も攻撃の自動化をどんどん進めているんだなあと思いました。
  • 他のUserAgentとしては RepoLookoutBot/1.0.0 が興味深かったです。
    • 誤って公開されている.gitディレクトリの探索を目的としたスキャナー
    • 善意でやっているのか商業目的でやっているのかは不明です

www.repo-lookout.org