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の導入状況は不明ですが、Amazonがその導入を促進するために対策を講じていることは明らかであり、IMDSv1が依然として広く使用されているのが現状です。
IAMキーの侵害は、さらなる侵害につながります。S3バケットがリストされ、その内容が読み取られる可能性があります。さらに悪いことに、S3バケットの1つにはCloudFormationテンプレートが含まれており、その中には機密性の高い環境変数(例:Sendgrid APIキー)が含まれていました。
この脅威からクラウドインフラストラクチャをどのように防御すればよいですか?
では、このデータ損失を完全に防ぐために何ができるでしょうか?開発者は、file_get_contentsに渡すURLに対して許可リストを使用するなど、細心の注意を払うことができます。画像を期待している場合は、受信したコンテンツが画像であることを検証することも可能です。しかし、現実には、開発者としてこのような種類のミスを避けることは困難です。
これらの攻撃に対して、インフラストラクチャにさらなる防御策を講じることがはるかに優れています。Aikido Security内のAWSとの新しい統合は、クラウドが以下のいずれの対策も積極的に講じていない場合に警告します。これらの対策はそれぞれ単独でこの特定の攻撃を阻止できたはずですが、すべてを実装することをお勧めします。無料トライアルアカウントを使用して、クラウドがこれらの脅威からすでに防御されているかを確認してください。Aikidoがアプリケーションを脆弱性からどのように保護するかをこちらで確認してください。
講じるべき手順:
- 既存の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"
}
}
}
]
}
「キルチェーン」について
The Kill Chainは、攻撃者が複数の脆弱性を連鎖させることでソフトウェア企業の最も重要な資産に到達する、現実の物語を集めたものです。SaaSスタートアップのCTOとして10年間の構築とサポートの経験を持つWillem Delbareによって書かれました。これらの物語はWillemのネットワークから直接得られたものであり、すべて実際に起こったことです。

