.gitディレクトリを狙った攻撃に関する調査
/.git/HEAD 宛のリクエスト
監視しているサーバに次のようなHTTPリクエストが来ていました。
GET /.git/HEAD
このリクエストは設定誤りで公開されている.gitディレクトリがないか探索している通信です。 以前から何度もこのリクエストを見かけていたのですが、.gitディレクトリを公開していなければ問題ない通信なので深くは調べていませんでした。 いい機会なので今回調べてみようと思います。
参考
- 以下の2サイトが大変参考になりました。 medium.com qiita.com
攻撃者が.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にアクセスしてきます。