公開されたデータベースバックアップ:/backup.sqlにアクセスできるとどうなるか
データベースのバックアップ(.sqlファイル、圧縮ダンプ、データベースのzipアーカイブ)は、Webからアクセス可能なディレクトリに直接作成され、そのまま放置されることがあります。/backup.sqlや/dump.sqlへのリクエストが1回成功するだけで、攻撃者はアプリケーションロジックに触れることなく、すべてのテーブルのすべての行を手に入れます。
これは何か
バックアップスクリプト、ホスティングのコントロールパネル、手動のエクスポートツールは、backup.sql、dump.sql、database.sql、db.sql.gz、backup.zipといった推測しやすい名前でダンプファイルを書き出すことがよくあります。これらがWebルート内に置かれ、サーバーが明示的にブロックしていない場合、普通のダウンロード可能なファイルになります。攻撃者は、到達できるすべてのホストに対してこうした一般的な名前を何十個もリクエストする自動スキャンを実行しています。
AppSafeは/backup.sql、/dump.sql、/database.sql、/db.sql.gzなどの最も一般的なパスをチェックし、SQLダンプやアーカイブに見える内容で200レスポンスを返すものを報告します。このチェックはプレーンテキストのSQLと圧縮形式の両方を検出します。
なぜ重要か
SQLダンプには、取得時点のすべてのテーブルのすべての行が含まれます。ユーザーアカウント、パスワードハッシュ、メールアドレス、個人情報、セッショントークン、支払い履歴、アプリケーション内部の状態などです。ダンプのダウンロードはHTTPリクエスト1回で済み、アプリケーションログには痕跡が残りません。Webサーバーは他の静的ファイルと同じように配信するからです。
流出したAPIキーと違い、流出したデータベースはローテーションできません。誰かがusersテーブルのコピーを手に入れた時点で、そのユーザーにとって侵害は永続的です。ダンプの内容によっては、GDPR、CCPA、HIPAAに基づく侵害通知が義務付けられ、影響を受けたすべてのユーザーへの通知という運用コストも発生します。
直し方
正しい対策は、Webサーバーが到達できないディレクトリにバックアップファイルを書き出すことです。/var/www/のサブディレクトリではなく、/var/backups/のようなパスや、非公開ACLのオブジェクトストレージバケットを使ってください。cronジョブやバックアップスクリプトを見直し、出力先のパスを更新します。
多層防御の一環として、ファイルの保存場所にかかわらず、SQLファイルや一般的なアーカイブ拡張子へのリクエストをサーバーレベルで拒否します。
location ~* \.(sql|sql\.gz|bak|dump|tar|tar\.gz|tar\.bz2|zip)$ {
deny all;
return 404;
}公開されたファイルを見つけたら、すぐに削除してください。次に、なぜそこに置かれたのかを調査し、それを配置したスクリプトや手順を修正して、次回の定期実行で再び現れないようにします。
クリーンアップ後、一般的なパスがブロックされていることを確認します。
for path in /backup.sql /dump.sql /database.sql /db.sql.gz; do
code=$(curl -so /dev/null -w "%{http_code}" "https://yourdomain.com$path")
echo "$path → $code"
done
# Every line must print 404FAQ
攻撃者はなぜ私のサイトで/backup.sqlを試すことを知っているのですか?
あなたを狙い撃ちしているわけではありません。自動スキャナーは何百万ものホストに対して、一般的なバックアップ名を何十個も絶えずリクエストしています。存在するファイルは200を返し、あなたが確認しようと思う前にダウンロードされてしまいます。
ファイルが置かれていたのは1時間だけでした。もう被害は出ていますか?
その可能性はあります。自動スキャンは24時間稼働しており、ファイルは出現から数分以内に見つかることがよくあります。アクセスログがあれば、そのパスがリクエストされたかを確認してください。リクエストされていたら、侵害が確定したものとして扱ってください。
ファイルを移動する代わりにパスワードで保護するだけではだめですか?
単一ファイルへのBasic認証は脆弱で、設定ミスも起こりやすい方法です。正しい答えは、Webからアクセス可能な場所からファイルを完全に取り除くことです。バックアップはHTTPサーバーが到達できない場所に置くべきです。
関連する解説
公開されたディレクトリインデックス:ファイルサーバーがすべてを一覧表示するとき
中身を一覧表示するファイルサーバーは、攻撃者に無料の目録を渡しているのと同じです。
露出した .env ファイル:攻撃者はどうやってシークレットを見つけるか
到達可能な .env が1つあるだけで、スタック全体を明け渡すことになりかねません。
Supabase の Row Level Security(RLS):テーブルを確実に保護する
anon key は公開されています。それとデータの間にあるのはRLSだけです。
公開された.gitディレクトリ:目の前に潜むソースコード流出
アクセス可能な/.gitは、コードベース全体とコミット履歴をそのまま渡してしまいます。