ESET/マルウェア情報局

macOSを狙ったマルウェアがアップデートで機能追加

  • この記事をはてなブックマークに追加
  • 本文印刷

 本記事はキヤノンマーケティングジャパンが提供する「マルウェア情報局」に掲載された「OceanLotusがmacOSを標的としたマルウェアをアップデート」を再編集したものです。

 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のとおりフラグ属性を持っている。

図1 – MACH-O__cfstringセクションの属性

 図2のとおり、コードが__cfstringセクション内に記述されていると、逆アセンブリツールは誤ってコードを文字列として表示してしまう。

図2 – IDAでデータとして定義されたバックドアコード

 バイナリーは実行されると、最初にアンチデバッグ機能を持ったウォッチドッグ(watchdog) *1としてスレッドを作成する。この唯一の目的は、デバッガが存在しないか絶えず確認することである。このため、このスレッドは、

*1 和訳「番犬」から転じ、システムの動作状況を監視するデバイス、ソフト、機能全般を指す。ここではデバッガの存在を常時確認し、存在が確認された場合、exit関数を呼び出すようプログラムされている。

  • 要求パラメータであるPT_DENY_ATTACHでptraceを呼び出して、デバッガを切り離そうとする
  • task_get_exception_ports関数を呼び出して、対象外ポートが開いていないか確認する
  • 現在のプロセスでP_TRACEDフラグが設定されているかを検証し、デバッガが図3のとおりアタッチされているか確認する

図3 – sysctl関数でデバッガがアタッチされているか確認

 ウォッチドッグがデバッガの存在を検出すると、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 ioreg -rd1 -c IOPlatformExpertDevice | awk '
/IOPlatformSerialNumber/ { split($0, line, "\""); printf("%s",
line[4]); }'
説明 プロセッサーの情報を収集 メモリーの情報を収集 ネットワークインターフェイスのMACアドレスを収集 デバイスのシリアル番号を取得

 このサンプルは、上記のとおり構成が変更された上に、ネットワークから持ち出すための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種類の英数字に限定して通信をおこなう。

図4 – グローバル変数 key_lenの定義

 関数ウィンドウ内の復号関数を右クリックし、「引数の抽出と復号」をクリックする。スクリプトは、図5のとおり復号された文字列をコメントに埋め込む。

図5 – 復号されたテキストをコメントに埋め込む

 これにより、図6のとおり関数ウィンドウへのIDAの相互参照に復号された文字列をまとめて簡単にリストアップすることができる。

図6 – f_decrypt関数への相互参照

 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ハッシュ値 E615632C9998E4D3E5ACD8851864ED09B02C77D2
ESET検出名 OSX/OceanLotus.D
MITRE ATT&CK上における手法
戦術 防御回避 防御回避 防御回避 防御回避 防御回避 検知 持ち出し コマンド&コントロール
ID T1158 T1107 T1222 T1027 T1099 (macOS) T1082 T1022 T1094
名前 隠しファイルとディレクトリ ファイルの削除 ファイルパーミッションの修正 難読化されたファイルまたは情報 タイムスタンプ システム情報の検知 データの暗号化 カスタムのC&Cプロトコル
説明 バックドアは、chflag関数でclientIDファイルを隠す。 バックドアは、「削除」コマンドを受信できる。 バックドアは、実行したいファイルパーミッションを755*7に変更する。 ネットワークからの持ち出しに使用するライブラリを、CBCモード*8でAES-256を用いて暗号化する。 clientIDを格納するファイルのタイムスタンプを、乱数値で修正する。 バックドアは、C&Cサーバーへの初回接続時にマシンのフィンガープリント *9を作成する。 バックドアは、持ち出す前にデータを暗号化する。 バックドアは、乱数値を含むパケット専用のフォーマットを実装する。トレンドマイクロ社の記事を参照。

*7 ファイルのパーミッションを「755」に変更すると、読み出し・実行はすべてのユーザーが可能、書き込みのみオーナーが可能という権限設定となる。

*8 「CBC(Cipher Block Chaining)モード」は暗号化利用モードの一つ。広く利用されているほど安全性は高いものの、並列処理できないため、暗号化に時間を要する。

*9和訳「指紋」が転じ、接続マシンの情報の識別のために生成される固有の値のことを指す。

[引用・出典元]
OceanLotus: macOS malware update by Romain Dumont 9 Apr 2019 - 11:30AM
https://www.welivesecurity.com/2019/04/09/oceanlotus-macos-malware-update/