ESETの最新のリサーチによると、Macユーザーを狙ったOceanLotusのツールセットに追加機能が備わったことが判明した。ここではその追加機能について解説をしていく。
この記事は、ESETが運営するマルウェアやセキュリティに関する情報サイト「Welivesecurity」の記事を翻訳したものである。
2019年3月上旬、人気のオンラインスキャンサービスであるVirusTotal上に、APTグループ「OceanLotus」によりmacOSをターゲットとした新たなマルウェアのサンプルがアップロードされた。このバックドアの実行ファイルは、以前のmacOS向け亜種と同じ特徴を持っている。しかし、その構造は大きく変貌を遂げ、検出することが非常に難しくなっている。残念ながら、ESETではこのサンプルに関するドロッパーを発見できなかったため、最初の感染源を特定できていない。
先日、ESETはOceanLotusのアップデートに関する詳細を発表した。このマルウェアはさまざまな手法を駆使してコードを実行し、執拗に攻撃し続ける。さらに、Windowsシステム上にほとんど痕跡を残さないようになっている。OceanLotusは、macOSに被害をもたらすコンポーネントを含んでいることも知られている。今回のこの記事では、トレンドマイクロ社が分析した以前のmacOSバージョンからの変更点を詳しく解説する。さらに、この亜種のコードを分析する際にIDA Hex-Rays APIで文字列を自動的に復号する方法についても説明する。
分析
本記事で取り上げる以下の3つのセクションでは、SHA-1ハッシュ値E615632C9998E4D3E5ACD8851864ED09B02C77D2を用いたサンプルの分析結果について説明する。このファイルはフラッシュライト型(flashlight)と呼ばれ、ESET製品ではOSX/OceanLotus.Dとして検出される。
アンチデバッグとアンチサンドボックス
OceanLotusのmacOS用バイナリーでは従来どおり、サンプルがUPXで圧縮されている。しかし、ほとんどのパッカー識別ツールではこれを認識できない。これは、文字列「UPX」を利用したシグネチャが含まれていることが多いからである。さらに、Mach-Oのシグネチャはあまり一般的ではなく、定期的にアップデートされていないという理由もある。この独自の特徴のため、静的に検出するのはさらに難しくなっている。ここで興味深いのは、解凍されると、.TEXTセグメントの__cfstringセクションの最初がエントリーポイントになることである。このセクションは、図1のとおりフラグ属性を持っている。
図2のとおり、コードが__cfstringセクション内に記述されていると、逆アセンブリツールは誤ってコードを文字列として表示してしまう。
バイナリーは実行されると、最初にアンチデバッグ機能を持ったウォッチドッグ(watchdog) *1としてスレッドを作成する。この唯一の目的は、デバッガが存在しないか絶えず確認することである。このため、このスレッドは、
- 要求パラメータであるPT_DENY_ATTACHでptraceを呼び出して、デバッガを切り離そうとする
- task_get_exception_ports関数を呼び出して、対象外ポートが開いていないか確認する
- 現在のプロセスでP_TRACEDフラグが設定されているかを検証し、デバッガが図3のとおりアタッチされているか確認する
*1 和訳「番犬」から転じ、システムの動作状況を監視するデバイス、ソフト、機能全般を指す。ここではデバッガの存在を常時確認し、存在が確認された場合、exit関数を呼び出すようプログラムされている。
ウォッチドッグがデバッガの存在を検出すると、exit関数が呼び出される。さらに、サンプルは以下二つのコマンドを送信してその環境を確認する。
ioreg -l | grep -e “Manufacturer”
sysctl hw.model
そして既知の仮想化システムの文字列 (oracle、vmware、virtualboxまたはparallels) のハードコードされたリストと戻り値を照合する。最後に、以下のコマンドは、マシンが「MBP」、「MBA」、「MB」、「MM」、「IM」、「MP」、「XS」のいずれに相当するのか確認する。これらのコードはシステムのモデルを表している。例えば、「MBP」はMacBook Proを、「MBA」はMacBook Airを表している。
system_profiler SPHardwareDataType 2>/dev/null | awk ‘/Boot ROM Version/ {split($0, line, “:”);printf(“%s”, line[2]);}
メジャーアップデート
トレンドマイクロ社の記事以降、バックドアのコマンドは変更されていない。しかし、ESETは若干の修正を発見した。このサンプルに使用されているC&Cサーバーは比較的最近のものであり、2018年10月22日に作成されている。
- daff.faybilodeau[.]com
- sarc.onteagleroad[.]com
- au.charlineopkesston[.]com
使用されているURLリソースは、以下に変更されている。
/dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35
C&Cサーバーに送信された最初のパケットには、ホストマシンに関する詳細情報が含まれており、下表のコマンドで収集されたデータすべてを含んでいる。
コマンド | 説明 |
---|---|
system_profiler SPHardwareDataType 2>/dev/null | awk '/Processor / {split($0,line,":"); printf("%s",line[2]);}' machdep.cpu.brand_string |
プロセッサーの情報を収集 |
system_profiler SPHardwareDataType 2>/dev/null | awk '/Memory/ {split($0,line, ":"); printf("%s", line[2]);}' | メモリーの情報を収集 |
ifconfig -l | ネットワークインターフェイスのMACアドレスを収集 |
ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformSerialNumber/ { split($0, line, "\""); printf("%s", line[4]); }' | デバイスのシリアル番号を取得 |
このサンプルは、上記のとおり構成が変更された上に、ネットワークから持ち出すためのlibcurlライブラリを使用していない。代わりとして、外部ライブラリを使用している。これを突き止めるため、バックドアはゼロパディング *2されたキーgFjMXBgyXWULmVVVzyxyを用いたAES-256-CBCで、カレントディレクトリに収められている各ファイルの復号を試みる。各ファイルは「復号化」され、「/tmp/store」として保存される。さらに、dlopen関数で作成されたライブラリとしてファイルのロードを試みる。復号化でdlopenの呼び出しに成功すると、バックドアはエクスポートされた関数BoriryとChadylonVを取得する。これらは、サーバーとのネットワーク通信をおこなうと考えられているためである。ESETは元のサンプルからドロッパーや他のファイルを入手していないため、このライブラリを分析できなかった。さらに、コンポーネントが暗号化されているため、これらの文字列に基づいて作成されたYARAルール *3はディスク上で検出されるファイルと一致しない。
*2 「ゼロ(0)」を「パディング(埋める)」行為のことを指す。例えば、6桁指定の部分に4桁しかない場合、2桁分の「0」を追加し、エラーを回避する。
*3 マルウェアの検出、分析のためのプログラム「YARA」における、記述ルールのこと。YARAはPythonをベースとしたオープンソースであり、GitHubなどで配布されている。
※GitHub URL(https://github.com/VirusTotal/yara)
以前のmacOS向け亜種の分析のところで解説したとおり、クライアントIDが作成される。このIDは、以下のコマンドのいずれかの戻り値であるMD5ハッシュ値である。
- ioreg -rd1 -c IOPlatformExpertDevice | awk ‘/IOPlatformSerialNumber/ { split($0, line, “\””); printf(“%s”, line[4]); }’
- ioreg -rd1 -c IOPlatformExpertDevice | awk ‘/IOPlatformUUID/ { split($0, line, “\””); printf(“%s”, line[4]); }’
- ifconfig en0 | awk \’/ether /{print $2}\’ (MACアドレスを取得)
- 以前のサンプルで「uuidgen」として使用された不明なコマンド (「\x1e\x72\x0a」)
ハッシュ化する前に、root権限を示す戻り値に文字「0」または「1」を追加する。そうでない場合、このクライアントIDは以下に格納される。
/Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex
~/Library/SmartCardsServices/Technology/PlugIns/drivers/snippets.ecgML
通常、このファイルは_chflags関数で隠れており、タイムスタンプは乱数値による「touch –t」コマンドを用いて修正される。
文字列の復号
以前のバージョンと同様に、文字列はCCCrypt関数を用いたAES-256-CBC (16進数エンコードされたキー:ゼロパディングされた 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92。IV *4はゼロで埋める) で暗号化されている。キーは以前のバージョンから変更されているが、このグループは文字列を暗号化するのに同じアルゴリズムを使用しているため、自動的に復号することができた。今回のこの記事と併せ、ESETではバイナリー内にある文字列を復号するためにHex-Rays APIを利用するIDAスクリプトを公開している。このスクリプトによって、今後OceanLotusのエクスプロイトを分析し、ESETがまだ入手できていない既存サンプルの分析に貢献することも期待される。このスクリプトで重要なのは、関数に渡す引数を入手する一般的なメソッドの部分である。さらに、このスクリプトは、その値を求めるためにパラメータの割り当てを探し出す。このメソッドを再利用すると、関数の引数リストを取得し、引数をコールバック関数に渡すことができる。
*4 initialization vectorの略で和訳は「初期化ベクトル」、暗号化と同時に生成される数値のこと。同じ平文が同じ暗号文にならないように使用する。
このスクリプトはdecrypt関数のプロトタイプを把握した上で、最初にこの関数への相互参照をすべて検索する。次に、引数をすべて見つけ出して、データを復号し、相互参照のアドレスにあるコメントに平文を埋め込む。スクリプトが正常に機能するように、base64 *5のデコード関数で使用するカスタムのアルファベットをスクリプトにおいて設定しなければならない。また、そのキーの長さを含むグローバル変数を定義する必要もある(この場合、DWORDとして定義。図4を参照)。
*5 データのエンコード方式の一つで、64種類の英数字に限定して通信をおこなう。
関数ウィンドウ内の復号関数を右クリックし、「引数の抽出と復号」をクリックする。スクリプトは、図5のとおり復号された文字列をコメントに埋め込む。
これにより、図6のとおり関数ウィンドウへのIDAの相互参照に復号された文字列をまとめて簡単にリストアップすることができる。
ESETでは、Githubのレポジトリーで最終スクリプトを公開している。
結論
最近、ESETの別の記事で取り上げたとおり、OceanLotusグループはそのツールセットを常に改善し、アップデートを繰り返している。今回も、Macユーザーを標的としたツールを改善したばかりである。コードは大して変更されていない。しかし、多くのMacユーザーが自身のマシンでセキュリティソフトウェアを使用していないため、検出を回避する必要性は軽視されているようだ。ESETはこのファイルを発見次第、すみやかに製品に適用し検出できるようにしている。一方で、C&C通信で使用されているネットワークライブラリはディスク上で暗号化されているため、使用されている正確なネットワークプロトコルは現時点でも依然として不明のままである。
感染の疑いを確認するための指標 = (危殆化指標、IoC)
ESETは、Githubのレポジトリーで本記事に掲載しているIoCだけでなく、MITRE ATT&CK *6からの情報も公開している。
*6 米国の非営利研究機関である「MITRE」が運営する、サイバーセキュリティに関するナレッジデータベースのこと。
ドメイン名
- daff.faybilodeau[.]com
- sarc.onteagleroad[.]com
- au.charlineopkesston[.]com
URLリソース
- /dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35
ファイルパス
- ~/Library/SmartCardsServices/Technology/PlugIns/drivers/snippets.ecgML
- /Library/Storage/FileSystem/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex
- /tmp/store
分析したサンプル | SHA-1ハッシュ値 | ESET検出名 |
---|---|---|
フラッシュライト型 | E615632C9998E4D3E5ACD8851864ED09B02C77D2 | OSX/OceanLotus.D |
MITRE ATT&CK上における手法
戦術 | ID | 名前 | 説明 |
---|---|---|---|
防御回避 | T1158 | 隠しファイルとディレクトリ | バックドアは、chflag関数でclientIDファイルを隠す。 |
T1107 | ファイルの削除 | バックドアは、「削除」コマンドを受信できる。 | |
T1222 | ファイルパーミッションの修正 | バックドアは、実行したいファイルパーミッションを755 *7に変更する。 | |
T1027 | 難読化されたファイルまたは情報 | ネットワークからの持ち出しに使用するライブラリを、CBCモード*8でAES-256を用いて暗号化する。 | |
T1099 (macOS) |
タイムスタンプ | clientIDを格納するファイルのタイムスタンプを、乱数値で修正する。 | |
検知 | T1082 | システム情報の検知 | バックドアは、C&Cサーバーへの初回接続時にマシンのフィンガープリント *9を作成する。 |
持ち出し | T1022 | データの暗号化 | バックドアは、持ち出す前にデータを暗号化する。 |
コマンド&コントロール | T1094 | カスタムのC&Cプロトコル | バックドアは、乱数値を含むパケット専用のフォーマットを実装する。トレンドマイクロ社の記事を参照。 |
*7 ファイルのパーミッションを「755」に変更すると、読み出し・実行はすべてのユーザーが可能、書き込みのみオーナーが可能という権限設定となる。
*8 「CBC(Cipher Block Chaining)モード」は暗号化利用モードの一つ。広く利用されているほど安全性は高いものの、並列処理できないため、暗号化に時間を要する。
*9 和訳「指紋」が転じ、接続マシンの情報の識別のために生成される固有の値のことを指す。