パブリック・プライベートを問わず、AWSのストレージサービスであるS3のバケット名からアカウントIDを突き止める方法をセキュリティ企業「Tracebit」のCTOであるサム・コックス氏が公開しました。

How to find the AWS Account ID of any S3 Bucket

https://tracebit.com/blog/2024/02/finding-aws-account-id-of-any-s3-bucket/



コックス氏の方法はS3のVPCエンドポイントを使用することでVPCエンドポイントポリシーを適用するのがポイントとのこと。ポリシーで「アカウントIDが1で始める場合のみ許可」などアカウントIDに基づいて許可を行う事で、ポリシーレベルでの拒否が発生するかどうかをチェックします。



具体的な方法は下記の通り。

まず最初にターゲットとなるバケットのリージョンを確認します。curlなどでアクセスすると「x-amz-bucket-region」ヘッダーにリージョンが記載されています。



続いてターゲットと同じリージョンにVPCおよびVPCエンドポイントを作成し、VPCエンドポイントポリシーに下記の通り「s3:ResourceAccount」を設定します。「0*」と設定することでアカウントIDが0で始まる場合のみ通信が許可されるというわけです。



VPCエンドポイントを経由するため、EC2インスタンスを作成してターゲットバケットへアクセスを行います。もちろんアクセスは拒否されますが、その際にVPCエンドポイントを通過していた場合はCloudTrailに下図のようなログが残ります。



10分ほど待ってもCloudTrailにログが表示されない場合はVPCエンドポイントレベルでアクセスが拒否されているため、アカウントIDの最初の文字が0ではないことが分かります。この場合は「1*」のように続いてアカウントIDの最初の文字が1かどうかを調べればOK。



一方、CloudTrailにログが表示された場合は「00*」のように2桁目を見つける作業に移行します。



この作業を繰り返すことでアカウントIDの全てが明らかになるというわけ。なお、1文字ずつ順番に探すのではなく、下図のように複数のルールをまとめて設定することで10分以内にアカウントIDを見つけることが可能と述べられています。



コードについては公開されていませんが、実際の動作の様子は下図の通りとのこと。バケット名を入力するとアカウントIDが出力されていることが分かります。



なお、アカウントIDが機密情報にあたるのかどうかについてはさまざまな考えがあり、AWS公式からも特に機密にするべきと述べられているわけではありませんが、機密にした方がセキュリティが高まることは間違いありません。また、コックス氏によるとこのブログ記事を公開する前にAWSのセキュリティチームと相談済みとのことです。