世の中でもセキュリティ攻撃の話題が賑わってますが、なんと自分の環境も攻撃を受けちゃいました。
分析調査や対応について、そんなに情報見つからない気がするので、今後、同じようなことにあった方が迅速に対応できるよう、ブログで残しておきたいと思います。
※ 逆手に取った悪用は絶対にしないでください
今回、攻撃を受けた構成はこんな感じでした。
赤字の箇所が、通常の構成と異なるところ。公式ドキュメントを守っていないところです。
サブドメインに対して CNAME レコードを使うことは問題はないですが、バケット名と異なるものは NG になります。
重要
バケットは、ドメインまたはサブドメインと同じ名前にする必要があります。例えば、サブドメイン acme.example.com を使用している場合、バケットの名前は acme.example.com にする必要があります。
論理的には動きそうだなぁと思って試しに設定した(実際、その当時は問題なく動作した)ままだったのが、今回の問題点の一つでした。
では、検知からその後の対応についても述べていきたいと思います。
検知 〜 初動対応編
検知
仕事も終わり、最後にメールチェックをしていたところ、見慣れないメールが…
「New owner for http://www.example.com/」( example.com は実際は自分のドメイン )という件名で届きました。
このドメインは、Gemini for Google Workspace など新しめの機能を勉強するために、個人で契約している Google Workspace で使っています。
そこにオーナーとして、全然知らないアドレスが追加されたと。
このアドレスはフリーメールアドレスなのでますます怪しい…怪しすぎる!
自分のドメインではあるものの、www のサイトは作った記憶はあるが、Google Serch Console に登録した記憶はない。
サイトにアクセスすると、何やら海外のゲーム広告っぽいものに。
完全にヤられている。
ここで、なんとなく状況は理解できたので、初動対応にかかりました。
初動対応
DNS レコードを削除
まずは、www のレコードを削除しました。
Route 53 で管理しているホストゾーンだったので、該当レコードを選んで削除。
これで、サイトアクセスはできなくなり、何が仕込まれているかわからないコンテンツの配信を止めて、世の中に迷惑をかけないようにします。
まずは、レコードを削除を頭の片隅に置いておきしましょう!
Google Serch Console での該当ユーザー削除
こっちに少し苦戦。
送られてきたメールに従い、コンソールを確認してみても、該当のユーザーが見つからない。
インターネット上を検索しても、同じような質問は見つかったが、どれも解決はしていなさそう…
プロパティが怪しそう。
メールで届いた URL で、URL Prefix を追加。
追加した URL Prefix を選択し、ユーザー一覧を確認することで、不正に作られたユーザーを発見。
無事、不正ユーザーを削除できました。
調査・分析 〜 対応編
調査・分析
現状どうなっているのか?
検証のみの環境のため、サイトは不要なものの、何が起こっているのかを調査。
S3 バケットを「www.example.com」で作ろうとしたところ、そのバケット名はすでに利用されているとのこと。
乗っ取られている…
偽サイトのソースコードを見ると、verification token のメタタグが付けられていた。
これを使って、Google Serch Console 上のユーザーを作った模様。
実際に試してみたところ、ユーザー削除と同様の手順で、別の Google Workspace アカウントからも対象の FQDN のメタタグを発行できました。
この FQDN が狙われた理由(漏洩元)としては、外部からクラウドのサブドメインテイクオーバーを補助するツールはいろいろ出回っているので、そこからだろうとは思いましたが、一応、CloudTrail などを確認し、IAM 情報の漏洩はなさそうであることを確認しました。
万が一、IAM 漏洩していると危険なので、確認は必須です。
名前解決の挙動
名前解決のメカニズムは、ドキュメント上ではそこまで詳細に明記されていなかったので、実際に色々試してみました。
- 別の S3 バケットで、Web ホスティングしたものに CNAME を向ける
論理的には行けそうな気もしますが、冒頭で挙げた重要項目の違反です。
ドメインと一致するバケット名のものが存在しない場合は、これでも動作はしました。(※ ドキュメントに書かれている NG パターンなので動作の保証はない)
一方、バケットが存在する場合は、CNAME に設定した値ではなく、ドメインと一致するバケット名の方が優先されてしまいます。冒頭で書いた構成図のものがこちらです。
蛇足ではありますが、S3 のバケット名は AWS アカウント横断的にリージョン内でユニークである必要があるので、自分の AWS アカウントを確認するだけではダメです。 - ALB 配下で Web サイトを構築
この場合だと、CNAME でも A レコードでも、どちらででも自身のサイトの方へ名前解決されました。 - AWS 外部のサイトに CNAME を向ける
この場合も、自身のサイトの方へ名前解決されました。
対応
Abuse レポートを挙げることで、AWS 側で対処してくれる可能性はありますが、おそらくレコード削除などで無効化することで、攻撃者側があきらめてバケット削除するとは思います。
いずれにせよ、それまでは直接の S3 Web ホスティングでの提供は諦めねばです。
サイトの復旧手段を考察
先に書いた名前解決の挙動も、明確に定義されているものではないので、バケットが削除されるまではレコードを作らないほうが無難そうです。
ただ、もし商用環境であった場合には、Abuse の対応を待っているだけでは辛いと思います。そこで、どのような復旧手段があるのかを考察してみました。
結論、以下のような手段が考えられます。
- CloudFront を前段に置く
今のところ、これがベストの気がします。
先ほど述べた Route 53 での S3 Web ホスティングドメインの名前解決は、あくまで CNAME で S3 Web ホスティングドメインの名前解決時の優先順位です。
それ以外のドメインでは、設定内容が優先される挙動です。
CloudFront を前段に置く構成では、CloudFront のドメインを CNAME として登録するようになります。
そうすることで、乗っ取られたバケットへの名前解決が行われなくなります。
※ くどいですが、S3 Web ホスティングのマニュアルには、FQDN とバケット名を揃えるよう記されています。何かあっても動作保証外となるリスクはある暫定対応です。 - EC2 や ECS で Web サーバーを立ち上げる
コンテナなどを使うことで、環境構築のコストは下がって入るものの、構成変更が必要になるのでできれば避けたいところです。 - 別のクラウドの静的ホスティングサービスを利用
S3 以外の CNAME であれば、そちらが優先されるので、こちらでも対応可能。ただし、同じ静的ホスティングサービスでも、使い勝手はかなり違うので、よほど精通していないと辛そう。
再発防止編
一つのアカウント内で、Route 53 も管理しているのであれば、Config Rule とか書けばいい気がしますが、
ドメインは別アカウントで管理することも多いと思うので、単純に Web Hosting のバケットを削除する際には、合わせてレコードも削除することを徹底するとか。
また、ドメイン取得時に、www は一般的なもので、「www.example.com」 バケットを作っておくことも有効かもと思いました。
まとめ
早々に気づけてよかったです。通知に感謝!
自分の個人用の環境だったことが不幸中の幸いで、企業サイトだったらと思うと、いい学習の機会となりました。
フィッシングサイトを作成されて、ユーザーに損害を与えるような大きな問題にもなりかねません。
ちょっとしたミスで発生してしまうものなので、気をつけましょう!
また、ここに記した手順で、一次対応から暫定復旧まではできると思いますので、もし陥ってしまった際は落ち着いて速やかに対応しましょう!