SolarWinds攻撃:検出を逃れるステルス型攻撃
SolarWinds攻撃のフォローアップ分析シリーズの第1回目では、攻撃者がどのようにしてセキュリティソフトを無効化し、検知を回避したかを見ていきます。
SolarWinds攻撃で使用されたツールを分析していて印象的なのは、攻撃者が自らの存在に気づかれないように細心の注意を払っていることです。ステルス性に高いソフトウェアサプライチェーン攻撃では、通常は危険と認識されない信頼できる提供元からの署名のあるソフトウェアを悪用します。ただし、この攻撃者はこの隠れ蓑だけでは満足せず、他の手段も使って検出を逃れようとしました。
まず、トロイの木馬化したSolarWinds Orionのアップデートを使用してSunburstバックドア(Backdoor.Sunburst)を配信し、14日後に実行するように設定しました。つまり、この期間が経過するまで攻撃を開始しないよう設定したのです。
このような期間を設定したのは、最初の攻撃のログエントリが次のアクティビティを開始する前に削除されるのを見込み、それによって、2つの不正なアクティビティが関連付けられないようにするためと推測されます。マネージドセキュリティサービスプロバイダ(MSSP)を含め、多くの組織がストレージのコスト削減と検索の簡略化のために1週間ほどでセキュリティログを削除しています。
Sunburstではマシンの現在のWindowsドメインも調査されます。ドメインに文字列「test」やラボシステムに関連すると思われる「swdev.local」、「apac.lab」をはじめとする13の特定ドメインのいずれかが含まれている場合、攻撃は実行されません。 すべてのドメインのリストは付録Aを参照してください。
セキュリティソフトウェアと調査システムの回避
攻撃はトロイの木馬化されたSolarWindsのOrionソフトウェアで始まりました。攻撃者はOrionを改変してSunburstバックドアをコンピュータに配信しました。Sunburstは第1段階のマルウェアで、感染したコンピュータを偵察し、セキュリティツールのチェックを行い、必要に応じて第2段階のペイロードを配信するように設計されています。
メインのSunburstコードはSolarWindows.Orion.Core.BusinessLayerという名前のクラスに含まれ、最初にインスタンス化されるとUpdateというメンバー関数が呼び出されます。この関数名は偽装のためコードによって更新は実行されませんが、その代わりにセキュリティソフトウェアが無効化され、セキュリティ調査システムが回避され、攻撃者の利益にならないシステムでの実行が防止されます。この関数にはプロセス名のリスト、ドライバファイル名のリスト、プロセスとサービス名の組み合わせのリストの3つのリストが含まれています。これらの名前はすべて、FNV1A アルゴリズムを使ってハッシュ化し、タイムスタンプを装った変数名を使用することで、コード内で難読化されています。
この関数は以下を実行します。
- 実行中のプロセスのリストの取得
- プロセスのリストの項目とプロセス名の一致の確認
- インストールされているすべてのドライバのリストの取得
- ドライバのリストの項目とドライバ名の一致の確認
- 一致する項目が確認された場合、この不正なコードではそれ以上のアクションは実行されません。
このプロセスとドライバのリストにはセキュリティ調査システムで一般的に実行されるツールが含まれているため、検出を逃れるためにこれらのシステムでは実行しないように設計されているものと推測されます。すべてのセキュリティツールのリストは付録Aに記載されています。このリストには以下のようなさまざまなセキュリティソフトウェアプログラムに関連する名称も含まれています。
- セキュリティソフトウェアのプロセス名
- AVG/AVAST
- Panda
- Kaspersky
- Tanium
- ドライバ名
- CyberArk - cybkerneltracker.sys
- Altiris Symantec - atrsdfw.sys(Ghostプレインストールブート環境ドライバ)
- Raytheon Cyber Solutions - eaw.sys
- CJSC Returnil Software - rvsavd.sys
- Verasys Digital Guardian - dgdmk.sys
- Sentinel One – sentinelmonitor.sys
- Hexis Cyber Solutions - hexisfsmonitor.sys
- Dell SecureWorks - groundling32.sys, groundling64.sys
- SAFE-Cyberdefense - safe-agent.sys
- Cybereason – crexecprev.sys
- Absolute - psepfilter.sys, cve.sys
- Bromium - brfilter.sys, brcow_x_x_x_x.sys
- LogRhythm - lragentmf.sys
- OESIS OPSwat - libwamf.sys
このリストに記載されているセキュリティベンダーは、攻撃の標的にする組織に自社製品がインストールされる可能性が低いと攻撃者が判断したために選ばれた可能性が高いと考えられます。また、サプライチェーンの攻撃ベクトルが無差別であること、そして、SolarWindsの約18,000社の顧客企業が標的になったことから、攻撃者は自分たちに利益にならない組織で検出されるリスクを回避したかったためとも考えられます。
興味深いことに、solarwindsdiagnosticsというプロセスもブラックリストに含まれています。これは、SolarWindsのテスト中やトラブルシューティング中に検出されるのを回避するためと推測されます。
セキュリティソフトウェアの無効化
Sunburstでは、レジストリを介して一部のソフトウェアセキュリティサービスを無効化することも試行されました。これにより、Sunburstは検出されずに攻撃を実行できます。
攻撃者が迅速に行動を起こし、その後サービスを復元すると、セキュリティ管理者はそのアクティビティを記録できず、一時的に保護が解除されていることに気づかないことすらあります。

この関数は以下を実行します。
- 実行中のプロセスのリストの取得
- プロセス/サービス名の組み合わせのリストの項目とプロセス名の一致の確認
- サービスレジストリのエントリの変更によるセキュリティソフトウェアの無効化
- ソフトウェアの無効化を確認した後(通常は再起動後)、不正なコードはコマンド&コントロール(C&C)サーバーに接続し、さらに攻撃を実行する可能性があります。
Sunburstでセキュリティソフトウェアを無効にする場合、単純に製品のサービス開始を「無効」に設定します。Windowsでは以下のレジストリキーを設定して無効にします。
- HKLM\ SYSTEM\CurrentControlSet\services\<サービス名>\Start = 4
この設定によって、次回の再起動時にセキュリティソフトウェアがロードされなくなります。
シマンテック製品は攻撃者によって無効化されることはありません。これは、シマンテックのソフトウェアには改ざん防止機能があり、自らのサービスが無効になるのを防止しているためと推測されます。
プロセスとサービスの組み合わせのリストには、以下のベンダーのソフトウェアが含まれています。
- CrowdStrike
- Carbon Black
- FireEye
- ESET
- F-Secure
リストにはMicrosoft Defenderも含まれていますが、興味深いことに、サービスキーのアクセス許可のみが変更されています。 現在、その影響は確認されていません。また、未知の製品も複数含まれていますが、巧妙にコメントアウトされています。攻撃者はその手法がそれらの製品には効果がないと判断したのでしょう。
さらに、Sunburstでは続行前に、api.solarwinds.comが有効なアドレスに解決されるか確認されます。
存在を隠す脅威
SolarWinds攻撃は、近年の攻撃の中でも特に計画的で巧妙です。攻撃者は標的となる組織への有効な侵入経路を見つけ出し、ネットワーク侵入後は検出を回避するためにさまざまなツールを使用しています。これらのツールは現在分析中ですが、今後ブログで公開する予定です。
保護/緩和
こうした攻撃に関連するツールは、シマンテックのエンドポイント製品を実行するマシン上で検出されブロックされます。
ファイルベースの保護:
- Backdoor.Sunburst
- Backdoor.Sunburst!gen1
- Backdoor.SuperNova
- Backdoor.Teardrop
ネットワークベースの保護:
- System Infected: Sunburstマルウェアのアクティビティ
付録A
回避されたドライバ
| Driver | FNV1A Hash | Description |
|---|---|---|
| ybkerneltracker.sys | 17097380490166623672 | |
| atrsdfw.sys | 15194901817027173566 | Altiris Symantec (Ghost Preinstallion boot environment driver) |
| eaw.sys | 12718416789200275332 | Raytheon Cyber Solutions |
| rvsavd.sys | 18392881921099771407 | CJSC Returnil Software |
| dgdmk.sys | 3626142665768487764 | Verdasys |
| sentinelmonitor.sys | 12343334044036541897 | Sentinel |
| hexisfsmonitor.sys | 397780960855462669 | Sentinel One |
| groundling32.sys | 6943102301517884811 | Dell SecureWorks |
| groundling64.sys | 13544031715334011032 | Dell SecureWorks |
| safe-agent.sys | 11801746708619571308 | SAFE-Cyberdefense |
| crexecprev.sys | 18159703063075866524 | Absolute (Palisade Systems) |
| psepfilter.sys | 835151375515278827 | Absolute |
| cve.sys | 16570804352575357627 | Absolute |
| brfilter.sys | 1614465773938842903 | Bromium |
| brcow_x_x_x_x.sys | 12679195163651834776 | Bromium |
| lragentmf.sys | 2717025511528702475 | LogRhythm |
| libwamf.sys | 17984632978012874803 | OESIS OPSwat |
回避されたセキュリティツール
| Tool | FNV1A Hash |
|---|---|
| apimonitor-x64 | 2597124982561782591 |
| apimonitor-x86 | 2600364143812063535 |
| autopsy64 | 13464308873961738403 |
| autopsy | 4821863173800309721 |
| autoruns64 | 12969190449276002545 |
| autoruns | 3320026265773918739 |
| autorunsc64 | 12094027092655598256 |
| autorunsc | 10657751674541025650 |
| binaryninja | 11913842725949116895 |
| blacklight | 5449730069165757263 |
| cff explorer | 292198192373389586 |
| cutter | 12790084614253405985 |
| de4dot | 5219431737322569038 |
| debugview | 15535773470978271326 |
| diskmon | 7810436520414958497 |
| dnsd | 13316211011159594063 |
| dnspy | 13825071784440082496 |
| dotpeek32 | 14480775929210717493 |
| dotpeek64 | 14482658293117931546 |
| dumpcap | 8473756179280619170 |
| evidence center | 3778500091710709090 |
| exeinfope | 8799118153397725683 |
| fakedns | 12027963942392743532 |
| fakenet | 576626207276463000 |
| ffdec | 7412338704062093516 |
| fiddler | 682250828679635420 |
| fileinsight | 13014156621614176974 |
| floss | 18150909006539876521 |
| gdb | 10336842116636872171 |
| hiew32 | 13260224381505715848 |
| unknown | 17956969551821596225 |
| hiew32demo | 12785322942775634499 |
| idaq64 | 8709004393777297355 |
| idaq | 14256853800858727521 |
| idr | 8129411991672431889 |
| ildasm | 15997665423159927228 |
| ilspy | 10829648878147112121 |
| jd-gui | 9149947745824492274 |
| lordpe | 3656637464651387014 |
| officemalscanner | 3575761800716667678 |
| ollydbg | 4501656691368064027 |
| pdfstreamdumper | 10296494671777307979 |
| pe-bear | 14630721578341374856 |
| pebrowse64 | 4088976323439621041 |
| peid | 9531326785919727076 |
| pe-sieve32 | 6461429591783621719 |
| pe-sieve64 | 6508141243778577344 |
| pestudio | 10235971842993272939 |
| peview | 2478231962306073784 |
| pexplorer | 9903758755917170407 |
| ppee | 14710585101020280896 |
| procdump64 | 13611814135072561278 |
| procdump | 2810460305047003196 |
| processhacker | 2032008861530788751 |
| procexp64 | 27407921587843457 |
| procexp | 6491986958834001955 |
| procmon | 2128122064571842954 |
| prodiscoverbasic | 10484659978517092504 |
| py2exedecompiler | 8478833628889826985 |
| r2agent | 10463926208560207521 |
| rabin2 | 7080175711202577138 |
| radare2 | 8697424601205169055 |
| ramcapture64 | 7775177810774851294 |
| ramcapture | 16130138450758310172 |
| reflector | 506634811745884560 |
| regmon | 18294908219222222902 |
| resourcehacker | 3588624367609827560 |
| retdec-ar-extractor | 9555688264681862794 |
| retdec-bin2llvmir | 5415426428750045503 |
| retdec-bin2pat | 3642525650883269872 |
| retdec-config | 13135068273077306806 |
| retdec-fileinfo | 3769837838875367802 |
| retdec-getsig | 191060519014405309 |
| retdec-idr2pat | 1682585410644922036 |
| retdec-llvmir2hll | 7878537243757499832 |
| retdec-macho-extractor | 13799353263187722717 |
| retdec-pat2yara | 1367627386496056834 |
| retdec-stacofin | 12574535824074203265 |
| retdec-unpacker | 16990567851129491937 |
| retdec-yarac | 8994091295115840290 |
| rundotnetdll | 13876356431472225791 |
| sbiesvc | 14968320160131875803 |
| scdbg | 14868920869169964081 |
| scylla_x64 | 106672141413120087 |
| scylla_x86 | 79089792725215063 |
| shellcode_launcher | 5614586596107908838 |
| solarwindsdiagnostics | 3869935012404164040 |
| sysmon64 | 3538022140597504361 |
| sysmon | 14111374107076822891 |
| task explorer | 7982848972385914508 |
| task explorer-x64 | 8760312338504300643 |
| tcpdump | 17351543633914244545 |
| tcpvcon | 7516148236133302073 |
| tcpview | 15114163911481793350 |
| vboxservice | 15457732070353984570 |
| win32_remote | 16292685861617888592 |
| win64_remotex64 | 10374841591685794123 |
| windbg | 3045986759481489935 |
| windump | 17109238199226571972 |
| winhex64 | 6827032273910657891 |
| winhex | 5945487981219695001 |
| winobj | 8052533790968282297 |
| wireshark | 17574002783607647274 |
| x32dbg | 3341747963119755850 |
| x64dbg | 14193859431895170587 |
| xwforensics | 17683972236092287897 |
| xwforensics64 | 17439059603042731363 |
回避されたセキュリティソフトウェア
| Vendor | Process | FNV1A Hash |
|---|---|---|
| Panda | psanhost | 2532538262737333146 |
| psuaservice | 4454255944391929578 | |
| psuamain | 6088115528707848728 | |
| Kaspersky | avp | 13611051401579634621 |
| avpui | 18147627057830191163 | |
| ksde | 17633734304611248415 | |
| ksdeui | 13581776705111912829 | |
| Tanium | tanium | 7175363135479931834 |
| taniumclient | 3178468437029279937 | |
| taniumdetectengine | 13599785766252827703 | |
| taniumendpointindex | 6180361713414290679 | |
| taniumtracecli | 8612208440357175863 | |
| taniumtracewebsocketclient64 | 8408095252303317471 | |
| AVG/AVAST | aswidsagent | 2934149816356927366 |
| aswidsagenta | 13029357933491444455 | |
| aswengsrv | 6195833633417633900 | |
| avastavwrapper | 2760663353550280147 | |
| avgsvc | 3660705254426876796 | |
| avgui | 12709986806548166638 | |
| avgsvca | 3890794756780010537 | |
| avgidsagent | 2797129108883749491 | |
| avgsvcx | 3890769468012566366 | |
| avgwdsvcx | 14095938998438966337 | |
| avgadminclientservice | 11109294216876344399 | |
| afwserv | 1368907909245890092 | |
| avastui | 11818825521849580123 | |
| avastsvc | 8146185202538899243 | |
| bccavsvc | 16423314183614230717 |
回避されたドメイン
| Domain | FNV1A Hash |
|---|---|
| swdev.local | 1109067043404435916 |
| swdev.dmz | 15267980678929160412 |
| lab.local | 8381292265993977266 |
| lab.na | 3796405623695665524 |
| emea.sales | 8727477769544302060 |
| cork.lab | 10734127004244879770 |
| dev.local | 11073283311104541690 |
| dmz.local | 4030236413975199654 |
| pci.local | 7701683279824397773 |
| saas.swi | 5132256620104998637 |
| lab.rio | 5942282052525294911 |
| lab.brno | 4578480846255629462 |
| apac.lab | 16858955978146406642 |
サービス無効化のリスト
| Vendor | Process Names | Service Names |
|---|---|---|
| Carbon Black | cavp | carbonblack |
| cb | carbonblackk | |
| cbcomms | ||
| cbstream | ||
| CrowdStrike | csfalconservice | csagent |
| csfalconcontainer | csdevicecontrol | |
| csfalconservice | ||
| FireEye | xagt | xagt |
| xagtnotif | fe_avk | |
| fekern | ||
| feelam | ||
| 3320767229281015341 (unknown) | ||
| ESET | ekrn | eamonm |
| eguiproxy | eelam | |
| egui | ehdrv | |
| ekrn | ||
| 2589926981877829912 (unknown) | ||
| epfwwfp | ||
| ekbdflt | ||
| epfw | ||
| F-Secure | fsgk32st | 17624147599670377042 (unknown) |
| fswebuid | 16066651430762394116 (unknown) | |
| fsgk32 | 13655261125244647696 (unknown) | |
| fsma32 | fsaua | |
| fssm32 | fsma | |
| fnrb32 | 3425260965299690882 (unknown) | |
| fsaua | fsbts | |
| fsorsp | fsni | |
| fsav32 | fsvista | |
| 13783346438774742614 (unknown) | ||
| 2380224015317016190 (unknown) | ||
| fses | ||
| fsfw | ||
| fsdfw | ||
| fsaus | ||
| fsms | ||
| fsdevcon | ||
| 14243671177281069512 (unknown) | ||
| 16112751343173365533 (unknown) |



