Aqua Nautilus マルウェア Redigo を発見 – 新しい Redis バックドア型マルウェア #aqua #セキュリティ #redis
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
本ブログは「Aqua Security」社の技術ブログで2022年12月1日に公開された「 Aqua Nautilus Discovers Redigo — New Redis Backdoor Malware 」の日本語翻訳です。
Aqua Nautilus マルウェア Redigo を発見 - 新しい Redis バックドア型マルウェア
Aqua のセキュリティ研究チームである Team Nautilus は、Redis サーバを標的とした新しい Go ベースのマルウェアを発見しました。この攻撃は、私たちが Redis の脆弱性 CVE-2022-0543 を意図的に残したハニーポットに対して実行されたものです。私たちの調査により、Redis サーバを標的とした Golang で書かれた新しい未検出のマルウェアが発見されました。このマルウェアは、攻撃側のサーバが感染したマシンを支配できるように設計されていることがわかりました。そのため、このマルウェアには「Redigo」という名前が付けられています。このブログでは、攻撃者がこの Redis の脆弱性を悪用し、新しいマルウェアを実行するためにそれを利用する方法を検証します。さらに、攻撃のプロセスを検証し、今後の攻撃から保護するための方法を推奨します。
Redis とは
Redis(Remote dictionary server)は、オープンソースのインメモリデータベースおよびキャッシュです。2009年に初めてリリースされ、リレーショナルデータベースでは対応できない高速なデータ配信方法を必要とするリアルタイムアプリケーション向けのソリューションとして開発されました。短い応答時間でデータの取得と配信が可能で、1秒間に数百万回のリクエストに対応できます。Redis は、頻繁にアクセスされるデータをキャッシュとしてメモリに保存することで、応答性を保証しています。
Redis の脆弱性 - CVE-2022-0543
Redis アーキテクチャには、Redis クライアントと Redis サーバという2つの主要なプロセスがあります。Redis サーバはアーキテクチャの主要な部分を構成しています。Redis サーバは、データをメモリに格納し、管理処理を行います。また、サーバには Lua スクリプトエンジンが搭載されており、ユーザはサーバ上に直接 Lua スクリプトをアップロードして実行できます。この機能により、スクリプトからのデータの読み書きを、とても効率的に行えるようになります。このエンジンはサンドボックス化されており、Redis クライアントとのやりとりは Redis の API を使用して行われ、Redis が動作するマシン上でクライアントが任意のコードを実行する能力は制限されています。しかし、2022年に Lua スクリプトエンジンの脆弱性が発見されました。一部の Debian パッケージでは、Lua ライブラリが動的ライブラリを提供していました。Redis サーバが Lua ライブラリをロードする際、パッケージ変数をロードします。指定したパッケージは Lua サンドボックス内に残され、任意の Lua ライブラリを呼び出すために使用されます。その結果、Lua のサンドボックスがエスケープされ、攻撃者が任意のコマンドを実行できます。
攻撃プロセス
初期アクセス
攻撃者はスキャナーやボットネットを使用して、ポート 6379 でインターネットに公開されている Redis サーバを探します。Redis サーバに接続すると、以下のように Redis コマンドを実行できるようになります。
- INFO コマンド - このコマンドによって、攻撃者は私たちの Redis サーバに関する情報を受け取ることができます。受け取ったデータのうち、どのサーバのバージョンが CVE-2022-0543 に対して脆弱であるかを知ることができます(先に説明したように、ハニーポットはこの脆弱性を意図して構築されています)。この情報は、攻撃者が脆弱性を悪用するための判断要素であり、脆弱性を悪用するための表面的な準備を始めることを可能にします。
- SLAVEOF コマンド - これは、攻撃者が攻撃サーバのレプリカを作成することを可能にします。このアクションは、後で脆弱性の悪用を可能にする共有オブジェクトをダウンロードするのに役立ちます。
- REPLCONF コマンド - このコマンドは、マスター(攻撃側サーバ)から作成されたばかりのレプリカへの接続を設定するために使用されます。
- PSYNC コマンド - 新しいレプリカはこのコマンドを実行し、マスターからのレプリケーションストリームを開始します。この接続により、レプリカは更新され続け、マスターはコマンドのストリームを送信できるようになります。マスターとして定義された攻撃サーバは、この接続を使用して、共有ライブラリ exp_lin.so をレプリカのディスクにダウンロードします。さらに、この接続は、接続中に中断された場合、レプリカが再接続され、切断中に逃したコマンドのストリームの一部を取得しようとするバックドアとして、攻撃者が利用可能です。
- MODULE LOAD コマンド - ステージ4でダウンロードされたダイナミックライブラリから、実行時にモジュールをロードできます。このライブラリは、脆弱性を悪用し、後で任意のコマンドの実行を可能にします。
- SLAVEOF NO ONE コマンド - これはレプリケーションをオフにし、脆弱性のある Redis サーバをマスターに変換します。
実行
攻撃者が読み込むライブラリファイル exp_lin.so は、ハニーポットに意図的に残された脆弱性を悪用するコードを実行します。このファイルには、攻撃者が任意のコマンドを実行し、攻撃を開始できるようにするコマンド system.exec の実装が含まれています。コマンドの最初の使用は、CPU アーキテクチャに関する情報を受け取るために起動されます。コマンドの2回目の使用は、攻撃サーバである Redigo から新たに発見されたマルウェアをダウンロードするために行われます。マルウェアファイルのダウンロード後、攻撃者はファイルの実行権限を昇格させ、実行します(マルウェアの調査については、以下をお読みください)。
防衛回避
攻撃者は、発見されないように自分たちの活動を隠すことに関心を持っています。彼らは、ポート 6379 を使用して Redis クラスター間の通信をシミュレートする、一見正当な Redis の通信を使用することによって、これを実行しています。しかし、実際は攻撃者によって、脆弱なサーバを制御するためのコマンドを転送するために使用されています。
ディスカバリ
攻撃者は、攻撃したシステム(この場合は私たちの Redis サーバ)についてよく知り、学ぼうとします。この情報は、彼らが攻撃を進める上で貴重なものです。初期アクセスで説明したように、攻撃者は Redis の INFO コマンドを使用しており、これは私たちのサーバに関する情報や統計を返すものでした。私たちのサーバは、サーバー、メモリ、CPU に関する詳細など、指定されたすべての情報を含む応答を返しました。このデータは、攻撃者がターゲットのリソースについて知るのに役立ちます。さらに、脆弱性を悪用して Lua サンドボックスから脱出した後、ホスト上で lscpu コマンドを実行し、CPU に関する情報を受け取っています。
コマンド&コントロール
このマルウェアは、Redis サーバの通信を模倣しており、攻撃対象ホストと C2 サーバ間の通信を隠蔽可能です。マルウェアのダウンロード後、ホストの役割は変化します。脆弱な Redis サーバはクライアントに変わり、攻撃側のサーバは Redis サーバになります。この関係により、攻撃サーバの応答が脆弱な Redis サーバへの今後の攻撃のコマンドとして使用されるため、攻撃者は互いの C2 接続を実現できます。これは、ポート 6379 を介した正当な Redis クラスター通信をシミュレートしています。これにより、ネットワークセンサーの検知器を回避ができると考えられます。実際の通信を分析した結果、マルウェアは攻撃者が Redis サーバをマスター・スレーブ関係で制御するために使用されていることがわかりました。
影響
私たちのハニーポットでは攻撃期間を限定しているため、影響の全容を確認できたとは言い難いです。類似の攻撃に基づいて推測すると、攻撃者が標的のホストを大規模なボットネットに追加する場合、通常は侵害されたサーバが標的のアプリケーションに対する分散サービス妨害(DDoS)キャンペーンに参加し、そのビジネスに影響を与えることを意味します。もう1つのシナリオは、標的となったホスト上でクリプトマイナーを実行することです。さらに、攻撃対象はデータベースであるため、攻撃者はホストを悪用してデータや機密情報を盗み出し、その環境に対するさらなる足がかりを得ることも可能です。いずれにせよ、各シナリオは侵害されたサーバのリソースに影響を与える可能性があり、現在リソース集約的な問題を解決するために共同システムの一部として使用されており、そのサービスを毎日使用するユーザへの可用性に影響を与える可能性があります。
新たに発見された Redigo マルウェア
このマルウェアの調査は、ネットワーク解析とマルウェア解析の2つの角度から検討しました。Redigo マルウェアは、私たちの Redis コンテナへの攻撃を開始したのと同じサーバからダウンロードされました。Shodan エンジンで IP アドレスを検索したところ、そのサーバは Redis のポート 6379 を開放していることが判明しました。
さらに、マルウェアの実行中に、ポート 6379 を使って攻撃サーバへの戻り通信が発生していました。このことは、攻撃サーバが Aqua の Redis サーバをスレーブ化し、両者の間に コマンド&コントロール 関係を構築したため、Aqua の Redis サーバと攻撃サーバの間に悪意のある通信が存在する疑いが強まりました。マルウェアがダウンロードされた後にキャプチャした通信セッションの1つを見ればわかるように、この通信が正当な Redis コマンドの下に自身を隠そうとする様子を実証できました。
赤で示された部分は、攻撃対象のサーバによって生成されたアウトバウンド通信を表し、青で示された部分は、攻撃サーバによって生成されたインバウンド通信を表します。その中で、脆弱な Redis サーバが AUTH コマンドを使用して現在の接続の認証を試みていることがわかります。さらに、PING-PONG コマンドもあります。脆弱な Redis は PING コマンドを送信し、攻撃サーバは PONG を返します。これは、接続がまだ生きているかどうかをテストするときに有効です。
マルウェアをより深く調査した結果、ファイルは go で書かれており、その真意を暴露する興味深い関数が含まれていることが判明しました。
上記の関数は、マルウェアがサーバ(攻撃された Redis サーバ)を支配するために使用するコマンドの異なる実装を示しています。いくつかの関数が特に Redis サーバに対して書かれていることがわかりますが、これは、攻撃者が Redis サーバを標的とする調整済みの攻撃を構築することを望んでいたことを暗示しています。
Redigo は新しい Redis バックドアマルウェアであるため、Virus Total ではすべてのベンダーで未検出のままです。
Redigo マルウェアの追跡
eBPF ベースの Aqua Lightning Enforcer の以下のスクリーンショットに見られるように、最初のイベントアラートは、共有オブジェクトのロードと削除の挙動でした。通常、稼働中の Redis サーバでこのようなイベントが発生することはないはずです。これは、Redis 通信経由で渡された .so ファイル(exp_lin.so)です。次に、新しい実行ファイルが落ちているのがわかります。これは、Redigo マルウェアであるバイナリファイル redis-1.2-SNAPSHOT です。
次に、2つ目のペイロードとアウトバウンドトラフィックのイベント(socket_createとsocket_connect)が表示されます。
上の図は、Aqua 社のLinux用オープンソースランタイムセキュリティフォレンジックツールである Aqua Tracee を使用した場合のイベントの様子を示しています。
Tracee は、このマルウェアの活動(プロセス名:redis-1.2-SNAPSHOT)を捕捉しています。
- security_socket_create:マルウェアは、通信のエンドポイントであるソケットを作成します。
- security_socket_connect:マルウェアは、ポート 6379 を使用して、攻撃者のサーバ(45[.]41[.]240[.]51)へのソケット上の接続を開始します。
このため、私たちはバイナリをさらに調査し、コマンド&コントロール 通信を正当な Redis 通信として偽装するように設計されているという結論に達しました。
この斬新なマルウェアは、Aqua の新しい Lightning Enforcer とランタイム保護ソリューションの全容を示す素晴らしい例となっています。このケースでは、私たちのサーバで実行中にドロップされた新規のマルウェアを観察しました。Virus Total のスキャンでわかるように、アンチウィルスなどの従来のツールでは、このツールを悪意のあるものとして判定できませんでした。しかし、eBPF 技術に基づく Aqua の Lightning Enforcer は、この動作の異常を検出し、悪意のあるアクティビティとして警告できたのです。通常、.so ファイルはランタイムにロードされるべきではありません。また、コンテナ環境では、実行時にファイルがドロップされることはないはずです。
未来の脅威から守る
私たちは、初めて確認されたバックドアマルウェアという新たな脅威の前に立っています。これらの攻撃者は、ボットネットネットワークを構築しながら、Redis プロトコルによる一見無害な通信を使用しており、その後、Redis サーバをマスターのコマンドを実行するスレーブに変換していました。この攻撃は、サーバの脆弱性を突いたもので、結果的に成功に終わっています。
このような脅威に対処するため、以下のガイドラインに従うことをお勧めします。
- 未知の脅威やゼロデイが存在することは周知の事実です。たとえあなたがすべてを正しく行ったとしても、ランタイム環境をそのような攻撃から保護できるとは限りません。そのため、ランタイム環境を監視する必要があります。Aqua Lightning Enforcer を導入して、ランタイム環境を保護しましょう。ランタイムモニタリングは、問題を迅速に軽減し、混乱を最小限に抑えるための基本的な実践方法です。監視プロセスは、疑わしい活動(例えば、悪意のあるバイナリファイルのダウンロードなど)が発生する可能性のあるランタイム環境にも適用されます。
- slaveof のような望ましくない Redis コマンドを実行しないように、環境を強化すべきです。
- Chain-Bench などのオープンソースツールでサプライチェーンをスキャンすると、新しい CIS ソフトウェアサプライチェーンベンチマークに基づいて、ソフトウェアサプライチェーンスタックのセキュリティ準拠を監査できます。
- 脆弱性や設定ミスをスキャンするツールにより、開発者、DevOps、セキュリティチームが強化されます。Aqua の組織向けツールに加え、Trivy などの特定のオープンソースツールでも、このような脆弱性をスキャンできます。Aqua Platform は、常に更新される脅威インテリジェンスのストリーム(脆弱性データの集約ソース(CVEs、ベンダーアドバイザリ、独自調査))に依存するツールでコンテナイメージをスキャンし、ミスを最小限に抑えながら最新の幅広いカバレッジを確保します。
Indicators of Compromise (IOCs)
IP 45.41.240.51 |
|
|
File Name |
Type |
Md5 |
redis-1.2-SNAPSHOT |
Binary |
a755eeede56cbce460138464bf79cacd |
exp_lin.so |
Binary |
c3b9216936e2ed95dcf7bb7976455859 |