SSRF攻撃によるクラウド全体の乗っ取りを防ぐ
これは、あるスタートアップのAmazon S3バケット、環境変数、様々な内部APIシークレットに、メールを送信するシンプルなフォームを介してアクセスした攻撃者の話だ。これは実話だが、スタートアップの名前は秘密にしておく。

侵入経路
すべてはPHPアプリケーションがメールを送信するところから始まります。派手な画像を添付ファイルとしてメールに読み込むために、アプリケーションは画像をダウンロードする必要があります。PHPでは、これは簡単です。file_get_contents関数を使用します。
もちろん、このメールに対するユーザー入力の一部は、完全にチェックされているわけでも、HTMLエンコードされているわけでもない。 <img src=’evil.com’/>
. 理論的には、これはそれほど悪いことではありませんが、悲しいことに、このPHP関数は非常に強力で、インターネット経由で画像を読み込む以上のことができます。また、ローカルファイルや、さらに重要なこととして、インターネットではなくローカルネットワーク上のファイルを読み込むこともできます。
攻撃者はevil.comの代わりに、特別なローカルURLを入力した。 このURLを使用すると、単純なGETリクエストで、実行中のAWS EC2サーバーのロールにリンクされたIAM認証情報を取得できる。
<img src=’http://169.254.169.254/latest/meta-data/'>
その結果、攻撃者はメールボックスの添付ファイルにEC2サーバーのIAM認証情報を含むメールを受け取った。これらのキーによって、攻撃者はAWSの様々なサービスと会話する際に、そのサーバーになりすますことができる。そこからすべてが下り坂になる...。
そもそも、なぜこんなことが可能なのか?
これらのIAMキーをロードするシステムはIMDSv1と呼ばれ、Amazonは2019年にIMDSv2と呼ばれる新しいバージョンをリリースした。IMDSv2では、IAM認証情報を取得するために、特別なヘッダーを付けたPUTリクエストを送信する必要がある。つまり、file_get_contentsのような単純なGETベースのURL読み込み関数では、もはやそこまでの被害は出せないということだ。
2023年現在、IMDSv2の採用率がどうなっているかは不明だが、アマゾンが採用率を高めるための対策を取っているのは明らかで、IMDSv1がまだ野放しで使われているのを目にすることもある。
IAMキーの漏洩はさらなる漏洩につながる:S3バケットをリストアップし、その内容を読み取ることができた。さらに悪いことに、S3バケットの1つには、機密性の高い環境変数(Sendgrid APIキーなど)を含むcloudformationテンプレートが含まれていた。
このような事態からクラウドインフラを守るにはどうすればいいのか?
さて、このようなデータの完全な損失を防ぐにはどうしたらいいでしょうか?開発者は細心の注意を払い、file_get_contentsに渡すURLにはallowlistを使うように注意すればよい。画像を期待しているのであれば、受け取ったコンテンツが画像であることを確認することもできます。しかし現実には、開発者としてこの種のミスを避けるのは難しいのです。
このような攻撃に対して、インフラが特別な防御策を講じていることを確認することは、非常に良いことだ。Aikido セキュリティのAWSとの新しい統合は、あなたのクラウドが以下の対策のいずれかを積極的に講じていない場合に警告を発します。これらの対策はそれぞれ単独でもこの特定の攻撃を阻止できただろうが、我々はこれらすべてを実施することを推奨する。Aikdidoの無料トライアルアカウントを使って、あなたのクラウドがこれらの脅威に対してすでに防御されているかどうかを確認してください。Aikdidoがどのようにアプリを脆弱性から保護しているかは、こちらをご覧ください。
取るべきステップ
- 既存のIMDSv1 EC2ノードをIMDSv2に移行する
- ウェブサーバの環境やcloudformationテンプレートにシークレットを一切保存しないこと。AWS Secrets Managerのようなツールを使って、実行時にシークレットをロードする。
- EC2サーバーにIAMロールを割り当てる際は、ローカルAWSネットワーク(VPC)内でのみ使用できるように制限するなど、余分なサイドコンディションを設定しておく。以下の例では、EC2サーバーが特定のVPCエンドポイント経由で通信している場合にのみ、S3からの読み込みを許可している。これはネットワーク内からのみ可能なので、攻撃者はローカルマシンからS3バケットにアクセスできなかっただろう。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "rule-example",
"Effect": "Allow",
"Action": "s3:getObject",
"Resource": "arn:aws:s3:::bucketname/*",
"Condition": {
"StringEquals": {
"aws:SourceVpce": "vpce-1s0d54f8e1f5e4fe"
}
}
}
]
}
キル・チェイン』について
キル・チェーンは、攻撃者が複数の脆弱性を連鎖させることによって、ソフトウェア企業の王冠を狙うという実話を紹介するシリーズである。WillemDelbareが、CTOとしてSaaSスタートアップの構築とサポートに携わった10年の経験を活かして執筆した。この物語はウィレムのネットワークから直接もたらされたものであり、すべて実際に起こったことである。