すべての解説
深刻度:重大設定ミス

公開された.gitディレクトリ:目の前に潜むソースコード流出

Webサーバーがアプリケーションファイルと一緒に.gitディレクトリを配信していると、攻撃者は十分なオブジェクトをダウンロードしてソースコード全体を復元できます。過去にコミットされたすべてのシークレットも含まれ、後のコミットで削除したものも例外ではありません。AppSafeはこれをクリティカルとして報告します。

これは何か

Gitはリポジトリ全体(すべてのファイル、すべてのコミット、すべてのブランチの先端)をプロジェクトルートの隠しディレクトリ.gitに保存します。このディレクトリがWebルート内に置かれ、サーバーがアクセスをブロックしていない場合、/.git/config、/.git/HEAD、そして/.git/objects/配下のオブジェクトストアは誰でもダウンロードできてしまいます。

流出した.gitディレクトリからソース全体を復元するのは簡単です。git-dumperのようなツールはインデックスを取得し、参照されているすべてのオブジェクトを取得して、完全に動作するチェックアウトを作成します。攻撃者にシェルアクセスは必要なく、ブラウザさえあれば十分です。

なぜ重要か

ソースコードには、ほぼ確実にリスクを高める情報が含まれています。ハードコードされたAPIキー(古いコミットに多い)、データベーススキーマ、内部エンドポイントのパス、ビジネスロジック、認証フローなどです。現在コミットされているシークレットがなくても、履歴には攻撃者が悪用できる材料が詰まっています。

Gitの履歴は設計上、永続的です。何年も前にコミットされ、その後削除されたシークレットもオブジェクトストアに残り、他のすべてと一緒にダウンロードされます。無力化する唯一の方法はローテーションです。

直し方

nginxで.gitをブロックする

パスが/.git/で始まるすべてのリクエストを拒否します。ディレクトリの存在を認めないよう、403ではなく404を返してください。

location ~ /\.git {
  deny all;
  return 404;
}
.gitをWebルートの外に置く

最も確実な対策は、そもそも.gitディレクトリをドキュメントルートにデプロイしないことです。ビルド成果物を別のpublic/ディレクトリに出力する構成にし、プロジェクトルートではなくそのディレクトリだけをデプロイしてください。

ブロックされていることを確認する

修正をデプロイしたら、ブラウザでhttps://yourdomain.com/.git/configにアクセスします。Gitの設定内容ではなく404が返るはずです。AppSafeはスキャンのたびにこれを再チェックします。

過去にコミットされたシークレットをすべてローテーションする

ディレクトリがアクセス可能だった場合、いずれかのコミットに現れたすべてのAPIキー、パスワード、トークンを侵害されたものとして扱ってください。ローテーションが必要です。コミットを削除するだけでは不十分です。攻撃者がすでにダウンロードした可能性のあるpackファイルにオブジェクトが残っているためです。

FAQ

マネージドプラットフォーム(Vercel、Netlify、Fly.io)にデプロイしています。リスクはありますか?

ソースからビルドするマネージドプラットフォームは通常ビルド成果物だけをデプロイするため、.gitディレクトリは配信されません。リスクが高いのは、VPSへのデプロイ、プロジェクトルートからビルドしたDockerコンテナ、作業ツリー全体がコピーされる静的サイトのエクスポートです。

AppSafeは実際に何をチェックしていますか?

AppSafeは/.git/configと/.git/HEADをリクエストし、レスポンス本文が本物のGitファイルに見えるか([core]やref:のパターンに一致するか)を確認します。Gitの内容ではない汎用的な200ページは報告されません。

サーバー上の.gitディレクトリを削除するだけでよいですか?

デプロイされたファイルが動作すればよいだけなら、それで構いません。ただし、次回のプッシュでデプロイ処理が再びコピーしないようにしてください。デプロイスクリプトが一貫しない場合に備え、Webサーバー側でもブロックしておくと二重の防御になります。

あなたのアプリは大丈夫ですか?

AppSafeなら、この問題を含む数十項目を1回の無料スキャンでチェックできます。

アプリを無料でスキャン