コンテンツ配信ネットワークを悪用して拡散するバンキング・マルウェア

この記事をシェア

インターネットで動画を配信するサービスでは、帯域幅の使用を最大化するために「コンテンツ配信ネットワーク」(CDN)が活用されている。だがCDNはマルウェアを広める新たな方法としてネット犯罪者から注目を浴びている。これを悪用して拡散するバンキング・マルウェアも発見されている。

この記事は、ESETが運営するマルウェアやセキュリティに関する情報サイト「Welivesecurity」の記事を翻訳したものである。

* 本記事は2017年11月20日に要約記事を公開済み

コンテンツ配信ネットワークを悪用して拡散するバンキング・マルウェア

ネットフリックス(Netflix)のようなサービスでは、「コンテンツ配信ネットワーク」すなわち「CDN」を利用して帯域を最大限有効に活用している。CDNを利用することで、ユーザーはコンテンツをより高速に閲覧することが可能だ。これは、サーバーがユーザーの近くに存在し、ネットフリックスのCDNの一部をなしているためである。結果として、世界中のどこにいようとも、シリーズものの動画や映画のロード時間は短縮されることとなる。しかし、CDNはマルウェアを拡散するための新手法の1つになりつつあることが明らかになっている。

図1: 2016年6月の「NSIS/TrojanDropper.Agent.CL」の検知状況(縦軸は検出比率、横軸は日付)

図1: 2016年6月の「NSIS/TrojanDropper.Agent.CL」の検知状況
(縦軸は検出比率、横軸は日付)

この攻撃の流れの中にはさまざまな事象が存在するが、その中には近年の「ファイルレス」(=ファイルの形態をとらない)バンキング・マルウェアの傾向に幾つかの点で類似するリモートスクリプトの実行、指揮統制サーバー(C&Cサーバー)のCDN利用、その他の標準的なマルウェアの実行と保護技術が含まれている。

本記事の目的は、JSスクリプトを非常に多く利用してダウンロードと実行を実現する「downAndExec」についての分析結果を共有することである。ここでは特に、被害者のコンピューター上に潜むバンキング・マルウェアについての分析結果に焦点を当てる。

フェーズ1: 初期感染

ハッシュ値(SHA1) ファイル名
(VirusTotal)
タイムスタンプ
(VirusTotal)
37648e4b95636e3ee5a6
8e3fa8c0735125126c17
AppAdobeFPlayer_1497851813.exe 2017-06-19
38b7611bb20985512f86
dc2c38247593e58a1df6
Consulta_Resultado05062017.exe 2017-06-09
67458b503047852dd60
3080946842472e575b856
NotaFiscal.exe 2017-06-19
8ea2c548bcb974a380
fece046a7e3f0218632ff2
nao confirmado 923337.crdownload 2017-06-09
bffaabcce3f4cced896f7
45a7ec4eba2070286b3
5ae9e0f3867ae8a317031fc9a5ed886e.virus 2017-07-04
effb36259accdfff07c036
c5a41b357692577265
Consulta_Resultado05062017.exe 2017-06-12

ヌルソフト(Nullsoft)社が開発したスクリプト形式のインストールシステム「NSIS」の特徴の1つに、バージョン9.43(2014年6月)のリリース以降、実行可能ファイルの中に埋め込まれたスクリプトを抽出可能になったことがある。このスクリプトは、初期のトロイの木馬の全ての機能を有している。ロードされると、そのスクリプトは再帰的なコールを繰り返し、実行パスの監視を困難にする。

オリジナルのスクリプトにほぼ修正を加えることなく、ActiveX(Internet Explorerでのみ実行可能)のようなリソースを利用することで、Google Chromeの「DevTools」を利用してそのスクリプトをデバッグすることができる。

図2:再帰的なコールc()とDevToolsを通じてデバッグをするためのスクリプトのパッチ

図2: 再帰的なコールc()とDevToolsを通じてデバッグをするためのスクリプトのパッチ

このスクリプトは「ダウンローダー」として分類されるマルウェアの特徴的なものである。目的は、被害者のコンピューター上で別のタイプのマルウェアをダウンロードして実行することである。この例では、スクリプトは外部にホストされているJS(JavaScript)の1つをダウンロードしている。このJSは実行プロセスを補完するのに必要不可欠なものとなっている。

CDNプロバイダーのインフラは上述のJSスニペット(=再利用される短いプログラム)をホストするのに積極的に利用されている。CDNドメイン全体をブロックすることが非現実的であることから、このような脅威に対応するには下記のような課題が存在する。

  • 新たなC&Cマルウェアをブロック
    C&Cをホストする同一のドメイン上にて頻繁に登場する新たなURLをわれわれが目にしてきた(そしていまだに目にしている)のは、おそらくこのためである
  • IoC(危殆化(=マルウェア侵入の目印となる)指標)を検索
    感染された環境では、不正ではないソフトウェアのアクセス記録が(潜在的には)多数存在している
図3: 不正JSスニペットをホストするCDNシミュレーション

図3: 不正JSスニペットをホストするCDNシミュレーション

CDNが不正JSスニペットをホストしている状況をシミュレートしてデバッグをしやすくするには、ローカルにHTTPサービスを立ててそのスニペットをそこでホストするのがおすすめである(これにより、リソース共有を可能にし、そしてスクリプトを実行する他の場所からスクリプトを実行可能にできることが観測できる)。

図4: 外部にホストされたJSスニペットをロードする

図4: 外部にホストされたJSスニペットをロードする

図4では、スニペットのコンテンツを得るために、どのようにしてスクリプトが外部ドメイン(CDN)にリクエストを発しているかを示している。もしレスポンスのステータスが「OK」(HTTPのステータスコードが200)であれば、コンテンツが返信される。

フェーズ2: 第2のダウンロード段階

JSスニペットのコンテンツ(スクリプト文字列)を返却するf()を呼び出した後には、eval関数が呼び出される。そして、そのJSスニペットの最後に"downAndExec(\"\", \"\")"が追加される。

図5: C&Cとx-idの情報がJSスニペットに組み込まれたdownAndExecコール

図5: C&Cとx-idの情報がJSスニペットに組み込まれたdownAndExecコール

最初のパラメータ()はC&CがホストされているURLに対応しており、第2パラメータ()は上述したように、その他のペイロードをダウンロードするのに必要な「x-id」データを含んでいる。

図6: downAndExecに関連するファイル群の関係

図6: downAndExecに関連するファイル群の関係

このJSスニペットには、実行時にコードにアサインされる文字列が幾つか含まれている。そのため、(関数名の変更や難読化がなされていないのにもかかわらず)静的解析を実施した際にその解析が困難になる。

図7: JSスニペットに用いられている難読化

図7: JSスニペットに用いられている難読化

本スクリプトの核となる部分は明示的にdownAndExec()関数を参照する。この関数は最初のNSISダウンローダーにより追加される。このことは、サンドボックス環境などでJSスニペットが別々に分析されると、不正関数は実行されず、最終的にそのスニペットは不正ではないと判定されるであろうことを意味している。

図8: JSスニペット内のdownAndExec()の定義

図8: JSスニペット内のdownAndExec()の定義

サンドボックスに対する保護機構に加え、そのスクリプトはサイバー犯罪に興味を示している可能性のあるコンピューターを特定すべく、コードの不正セクションを実行する前にさまざまなチェックを実施する。

最初のチェックはisOS()である。これは単純にtrue命令文を返却するのみであるが、これは本マルウェアの次バージョンに利用するためのスタブにもなり得る。第2のチェックはhaveAnyPrograms()である。これは被害者のコンピューターにインストールされているファイルの中に興味深いものがないかどうかをチェックしている。

図9: システム上のバンキングソフトウェアを探すhaveAnyPrograms()関数の構造

図9: システム上のバンキングソフトウェアを探すhaveAnyPrograms()関数の構造義

getPathfromGuid()とgetPathFromGuidWow()関数はHKCR内のCLSIDキーの有無により、ファイルを検索する。CLSIDにより検索されるファイルは下記の通りである。

グローバル一意識別子(GUID) ファイル名
{E37CB5F0-51F5-4395-A808-5FA49E399F83} %ProgramFiles%\GBPLUGIN\gbieh.dll
{E37CB5F0-51F5-4395-A808-5FA49E399003} %CommonAppData%\GbPlugin\gbiehCef.dll
{E37CB5F0-51F5-4395-A808-5FA49E399008} %ProgramFiles%\GbPlugin\gbiehuni.dll
{E37CB5F0-51F5-4395-A808-5FA49E399007} %ProgramFiles%\GbPlugin\gbiehabn.dll
{E37CB5F0-51F5-4395-A808-5FA49E399011} -

これらのファイルが1つも見当たらない場合には、本スクリプトは次の段階として、ブラジルの銀行であるブラデスコやイタウ、シコーブ、サンタンデールにより利用されているようなバンキングプログラムに関連付けられているフォルダを探す。

これらのファイルを検索するのは、コンピューター上にて、オンラインバンキングの目的ではおそらく用いられない不正機能の有効化を阻止するためである。これは、有効性を高く維持したまま、検知数が減少する(多くのアナリストの検知範囲を超える)ことを意味している。

haveAnyPrograms()経由でこれらのファイルが1つでも発見された際には、接続がブラジルからなされているかどうかを検証するための第3のチェックが実施される。興味のある潜在的被害者のアカウントはブラジルにあるため、ブラジル以外の国により(主に自動的に)分析されることは避けたい。そこで、下記のスニペットを実行することで、カスタマーIPがブラジルのAS(自律システム)のものであるかどうかを検証している。

図10: カスタマーIPがブラジルのものであるかどうかを検証する関数

図10: カスタマーIPがブラジルのものであるかどうかを検証する関数

これらのファイルが1つも見当たらない場合には、本スクリプトは次の段階として、ブラジルの銀行であるブラデスコやイタウ、シコーブ、サンタンデールにより利用されているようなバンキングプログラムに関連付けられているフォルダを探す。

これらのファイルを検索するのは、コンピューター上にて、オンラインバンキングの目的ではおそらく用いられない不正機能の有効化を阻止するためである。これは、有効性を高く維持したまま、検知数が減少する(多くのアナリストの検知範囲を超える)ことを意味している。

haveAnyPrograms()経由でこれらのファイルが1つでも発見された際には、接続がブラジルからなされているかどうかを検証するための第3のチェックが実施される。興味のある潜在的被害者のアカウントはブラジルにあるため、ブラジル以外の国により(主に自動的に)分析されることは避けたい。そこで、下記のスニペットを実行することで、カスタマーIPがブラジルのAS(自律システム)のものであるかどうかを検証している。

フェーズ3: C&Cとの通信とペイロードの実行

被害者のコンピューターが全ての条件を満たしたならば、マシンの脆弱性を突いてC&Cとの通信を開始するセクションの実施に移る。

図11: JSスニペットの核となる実行セクション

図11: JSスニペットの核となる実行セクション

dlToText_s()関数は497行目で呼び出され、2つのパラメータを 受け取っている。すなわち、C&CのURL(downAndExecの中でとしてパースされている)と文字列(downAndExecの中でとしてパースされている)であり、それらは“/?t”文字列を用いて連結されている。

dlToText_s()の最初のパラメータ(すなわち“/?t”)は、どのC&Cペイロードがダウンロードされるべきかを示しており、第2パラメータはGET要求のヘッダに(の値の)“x-id”フィールドを追加してダウンロードするペイロードを保護するのに用いられている。

図12: C&Cペイロードのダウンロードに用いられる関数群

図12: C&Cペイロードのダウンロードに用いられる関数群

分析時には、ファイルtは値“3”のみ保持していた。downAndExec()を見て分かる通り、tの値に応じてさまざまなふるまいを定義することが可能である。

図13: tファイルのコンテンツ

図13: tファイルのコンテンツ

この値はKによって決定される。本スクリプトはKの値として次のものを取り得る形になっている。

  • K=“1”: スニペットは不正アクションをとることなく、実行を終了する
  • K=“3”: スニペットは3つのファイルをダウンロードする。そのうちの1つは単に文字列(DLLの名前)であり、その他の2つはWindowsの実行ファイルである「PEファイル」である。そのシーケンスの中で、runAsUser()関数が呼び出される
  • K=“4”:“3”と似た動作を実施するが、2つのPEファイルのみダウンロードされる。そして、runAsUser()の代わりにrunAsRundll()関数が呼び出される

(K =“4”のときの)PEファイルはダウンロードすることはできなかった。また、これがどのような挙動を示すのかもまだ分かっていない。K =“3”の際には、下記のファイルがダウンロードされる。

ファイル名 観測された挙動
dllf DLL名を含む文字列 (例: “cryptui.dll”,“mssign32.dll”)
bin CERTMGR.EXEに対応するPE(合法)
dllb 「Win32 / Spy.Banker.ADYV.trojan」としてESETによって検出された不正PE

ペイロードの分析はいまだ現在進行形の段階である。しかし、CERTMGR.EXEを実行することで、DLLプリローディングを通じてメモリー内に不正PEが注入されることが分かっている(DLLプリローディング攻撃)。

これまで見てきたように、downAndExec技術は2つのダウンロードステージと幾つかの保護機構を持っている。これらを用い、望ましいプロファイルを持つマシンを特定し、もしくは「無菌」セクションに不正コードを拡散する。このセクションはそれだけでは(オンライン保護メカニズムを回避するために)何も実行しないが、その他の不正コードの部品と結合することにより、被害者のコンピューターに侵入することができる。

downAndExecについてはまだまだ多数の疑問点が残っている。例えば、

  • JSスニペットをホストするのになぜCDNを利用するのか
  • runAsAdmin()のような関数も存在するが、利用されていない。このJSスニペットはブラジルのそのほかのサイバー犯罪やマルウェアの共有モジュールとして用いられているのか・K=“4”の際にこのウイルスはどのような行動をするのか

これらをはじめとした各種の疑問に対する回答を得られた際に、ESETでは再び解説を公開することになるだろう。

IoC(危殆化指標)

ESETの検知名 ハッシュ値 (SHA1)
NSIS/TrojanDropper.Agent.CL 30FC877887D6845007503F3ABD44EC261A0D40C7
34F917AABA5684FBE56D3C57D48EF2A1AA7CF06D
37648E4B95636E3EE5A68E3FA8C0735125126C17
38B7611BB20985512F86DC2C38247593E58A1DF6
67458B503047852DD603080946842472E575B856
8EA2C548BCB974A380FECE046A7E3F0218632FF2
BFFAABCCE3F4CCED896F745A7EC4EBA207028683
EFFB36259ACCDFFF07C036C5A41B357692577265
JS/TrojanDownloader.Agent.QPA 2AD3B1669E8302035E24C838B3C08F2C
Win32/Spy.Banker.ADYV 51AED47CC54E9671F3EA71F8EE584952
URLs contacted
hxxps://1402712571.rsc.cdn77.org
hxxps://1356485243.rsc.cdn77.org (inactive)
この記事をシェア

業務PCのセキュリティ対策に

サイバーセキュリティ
情報局の最新情報を
チェック!