** 本記事は、Covert code faces a Heap of trouble in memory の翻訳です。最新の情報は英語記事をご覧ください。**
サイバーセキュリティの脅威の中でも特に話題に上ることが多いのがランサムウェアです。ビジネスは中断させられ、身代金の要求は数十万ドルから中には数千万ドルに及ぶこともあります。
この 2 つの要素だけでもランサムウェアが大きな問題であることは明らかですが、特に現在はランサムウェア攻撃とデータの窃取がセットで、標的となった企業は知的財産を Web に流出させられるというさらに大きな悩みを抱えることになります。
防御する側にとっては、これらのランサムウェアの阻止が最重要課題になっています。攻撃者による侵害の最初の足掛かりを把握することも重要です。
組織ごとにパスワードポリシーやネットワーク構成、セキュリティの設定は異なるため、昨今のランサムウェア攻撃は、人間が操作している場合も多くあります。攻撃者は、多くの場合盗み出したユーザーアカウントを使用して、オフィスでキーボードを物理的に操作しているかのようにコマンドを実行します。
しかしこの前段階として、攻撃者は Cobalt Strike や Meterpreter (リモートアクセスエージェントやトロイの木馬) のような、初期の攻撃段階の後にさまざまな用途に使用できるエージェントを配信します。このエージェントは、任意のコード実行、認証情報へのアクセス、権限昇格、ネットワークの水平移動、情報の収集と窃取、ランサムウェアの展開など、攻撃者が必要とするほとんどの行為を可能にします (MITRE ATT&CK マトリクスに図示されています)。
これらのリモートアクセスエージェントは高度な設定が可能で、ネットワークやエンドポイントの防御を回避する目的で意図的にパッキングされたり、難読化されたり、暗号化されたりしているため、ほとんどのセキュリティ製品で確実に検知することが困難です。
有名企業を狙うランサムウェアや国家レベルの攻撃などでこのようなエージェントが使用され、影響の大きいインシデントが数多く発生していることからも明らかです。SolarWinds、CCleaner、NetSarang (“ShadowPad”)、ASUS (“ShadowHammer”) などを標的とした大規模なサプライチェーン攻撃でも同様のリモートアクセスエージェントが使用されました。
ステージャー
最初のアクセスはさまざまな方法で行われます。盗まれた認証情報でインターネットに接続している VPN や RDP サーバーが攻撃されたり、Office ドキュメントに埋め込んだ悪意のあるマクロをユーザーに実行させたりする場合があります。
リモートアクセスエージェントの配信は多くの場合、段階的に行われます。攻撃の最初は多くの場合、価値ある標的に到達したかどうかを判断し、OS のアーキテクチャに応じてどのエージェントを配信するかを決定する段階です。この初期の悪意のあるコード (「ステージャー」、「ローダー」として知られる) は、一般的にはペイロードを直接メモリ内に送り込むハンドラまたは導管であり、不完全なウイルス対策や機械学習による検出を回避します。
ステージャーには一般的に短いコードしか搭載されていないため、悪意あるものかどうかを判断することができません。正規のツールが使用される場合もあります。
一度ステージャーがリモートアクセス型のトロイの木馬を配信すると、エージェントは Mimikatz などの追加のペイロードをメモリに直接配信して実行します。その際、信頼できる Windows プロセス、あるいはビジネスで使用されているアプリケーションを利用できれば理想的です。
これは再利用可能な多段式ロケットのようなもので、ロケットそのものは害がなくても、最終的に積まれたペイロードは悪意ある目的に使用される可能性があります。
検出の回避
クラウドを利用した分析、行動分析、機械学習を用いたエンドポイントプロテクションの進歩にもかかわらず、攻撃者は悪意のあるコードを難読化したり、ポリモーフィックの手法で再編成したりすることで、検知を回避しています。
Emotet、Trickbot、Qakbot などの拡散しているトロイの木馬は、ネットワークやウイルス対策の防御機能による検出を回避するために、多くの場合、難読化を繰り返してパッキングされています。
防御の回避は新しい手法ではありません。既知の脅威ファミリーを識別するための検出や特徴ベースの機械学習による検出回避する攻撃が行われています。これは、高度に訓練されたモデルでも予測できないようなコード構造やシーケンスを使用して実行されます。
最終的に利用されるコードは不明となり、(誤検知を防ぐために) 「許可」されることが多くありますが、結果的には攻撃に悪用されます。「Shellter」と「Phantom Evasion」は、よく知られた悪意のあるコードを難読化して防御を回避するツールです。
しかし、マルウェアがメモリにロードされるときには、パッキングや難読化が解除されたりします。パッケージングや難読化による隠れ蓑がなくなれば、検出は容易です。しかし残念なことに、パフォーマンスへの影響を考慮して、エンドポイントプロテクションにはメモリをスキャンする機能があるにもかかわらず、積極的に利用されていません。
また機械学習モデルは、一般的にメモリスキャンには適していません。このためメモリスキャンは、これまでに検出されている悪意あるコードのシーケンス (「シグネチャ」) を頼りに検出することになりますが、機能に影響を与えることなくコードシーケンスを変更して、検出を逃れることも可能です。熟練した脅威研究者であれば難読化されたマルウェアの亜種にも対応できる適切なコードシーケンスを選択できますが、攻撃者も対応してきます。
以下 (図1) は、最近の Conti ランサムウェアの攻撃で Sophos IIntercept X が検出したステージャーです。
SHA-256: 66379f43359d10fa207ee3fe61696af3f0b465358341c91c167a75a942cac987
ロードされるファイル名: rundll32 C:\ProgramData\x64.dll entryPoint
このような攻撃的な手法は、EDR (Endpoint Detection and Response) で「すべてを記録する」というセキュリティ業界のトレンドを加速させました。EDR を使用すると、人間の脅威対応者 (社内のセキュリティ運用チームやソフォスの 24時間体制 Managed Threat Response のような外部サービス) が記録を選別して、このような脅威を、理想的にはランサムウェアが展開される前に、早期に検出することができます。このようなサービスは、侵害やインシデントの調査にも役立ちます。
Cobalt Strike Beacon
保護されたネットワークで多く配信されているリモートアクセスエージェントは、Cobalt Strike Beacon です。本来 Cobalt Strike ツールセットはセキュリティ評価を目的としたものですが、サイバー犯罪者に流出し、悪用されています。また、コストを抑え、攻撃の帰属を隠すために、国家が支援している攻撃者にも使用されています。
例えば、最近報告された SolarWinds のサプライチェーンインシデント (「Solorigate」とも呼ばれる) では、攻撃者が展開した Cobalt Strike Beacon が何か月も検知されないままでした。
また、Cobalt Strikeはその特性や機能から、Conti を含む、人間が操作する多くのランサムウェア攻撃に頻繁に使用されるツールセットです。Conti については、ソフォスの研究者がソフォスニュースなどで最近詳しく報告しています。
その中には、Cobalt Strike の C2 プロファイルの変更、設定変更が可能なプロセス注入、難読化した上で攻撃を待機する機能などがあります。この最後の機能は、その名の通り、命令を待機する間にメモリ内で自身を難読化するものです。エージェントが起動すると、元の状態に復元します。この仕組みによって、メモリ内で発見することが困難になっています。
最新 OS におけるメモリのパーミッション
幸いなことに、ソフォスではこれらのリモートアクセスエージェントすべてに共通する静的な特徴を発見しました。しかし、その前に、メモリのパーミッションについて説明しておきましょう。
2003 年の AMD の Athlon 64 や Intel の Pentium 4 以降、主流のコンピューターに搭載されている CPU (Central Processing Unit) には、NX ビット (No-eXecute) と呼ばれる技術が採用されており、メモリーの領域をプロセッサーの命令 (コード) の格納用とデータの格納用に分離しています。2004 年の Windows XP Service Pack 2 (SP2) ではコードとデータを分離する NX 技術のサポートが Windows に導入され、DEP (Data Execution Prevention) と呼ばれるようになりました。
たとえば、Web ブラウザに表示される画像が格納されているメモリ領域にはコード実行権限がなく、コアアプリケーションである Web ブラウザ自体が格納されている領域にコード実行権限があります。
通常、アプリケーション本体とそのダイナミックリンクライブラリ (DLL) は、Image と呼ばれるメモリ領域にロードされます。
アプリケーションの動作には、インメモリーのワークスペースが必要です。このメモリは動的に割り当てられ (または解放され)、たとえば、テキスト、画像、スクリプトを含む Web ページなどのデータを一時的に保存、またはキャッシュし、これらのデータを処理して表示できます。便宜上このワークスペースは一般的にヒープと呼ばれ、大まかには「プライベートデータ」と表現されます。ヒープは、アプリケーションの「プロセス」が存続する間、拡大また縮小します。
イメージメモリは通常、実行 / 読み取りパーミッションで保護されています。データのみが格納されているヒープメモリには、通常、読み取り / 書き込みのパーミッションが割り当てられます。ヒープメモリ領域にコードが入力されると、パーミッションが実行 / 読み取り / 書き込み、または実行 / 読み取りに設定されます。
以下の図2~4は、侵害前と侵害後の NOTEPAD.EXE のメモリレイアウトを示しています。
DEP (データ実行防止) または実行可能領域プロテクションは、データのみの領域がコードを実行できないようにするシステムレベルのメモリプロテクションです。DEP の目的は、バッファオーバーフローが悪用された場合に任意のコードが実行されるのを防ぐこと、すなわちバッファ境界を越えた過剰なデータ (任意のコード) がデータ専用のメモリ領域で実行されるのを防ぐことです。
DEP が存在するために、実行中のアプリケーション (「プロセス」) は、コードをアンパッキングするなどしてより多くのメモリを必要とする場合、この追加メモリ領域にコード実行許可を割り当てたり、マークしたりしないと、コード実行をこの領域に引き渡すことができません。このメモリ領域に少なくとも実行 / 読み取りの許可がない場合、プロセッサのハードウェアで例外が発生し、OS によってプロセスが終了します。
この通常のメモリ割り当ては土台となる本質的な動作で、多くのステルス製の高い攻撃で観察されます。興味深いことに特に攻撃の過程では、ステージャーは通常 (コード注入やアンパッキングにより) ヒープメモリから実行されます。そして、このステージャーは、最終的なエージェントのために、ヒープ上に追加の実行可能なメモリを割り当てます。この「ヒープ領域間」のメモリ割り当て動作が、この脅威のステルス性の高い特性と能力の柱となっています。
パラダイムシフト
ソフォスは「HeapHeapHooray」と呼ばれる数年にわたるプロジェクトにおいて、既存のアプリケーションとの高い互換性を保ちながら、この悪意のあるメモリ割り当て動作をブロックする新しい実用的なプロテクション機能を設計しました。
その結果、「ダイナミックシェルコードプロテクション」と呼ばれるシステムレベルで攻撃の影響を緩和する機能が完成しました。コードのタイプに影響を受けない設計であり、リモートアクセス型のトロイの木馬、ファイルレスマルウェア、ランサムウェアなど、多くのサイバー攻撃を阻止できます。
最近の攻撃では、ソフォスのアーリーアクセスプログラムを利用したお客様が、このプロテクション機能の効果を実際に体験しています。何らかのプロセスがダイナミックシェルコードプロテクションによって定義されたメモリ割り当てのルールを侵害した場合、このミティゲーションは、割り当てコールが発生したメモリ領域からランレングス圧縮された base64 メモリダンプを含むアラートを生成します。このデータは、脅威のレスポンダーに、侵入に関する情報を与え、最初のアクセスや攻撃がどこから実行されているか (その C&C サーバー) を迅速に追跡するのに役立ちます。
MitigationL ダイナミックシェルコード
タイムスタンプ: 2021-01-15T05:50:38
プラットフォーム: 10.0.14393/x64 v321 06_3f*
PID: 2856
Aアプリケーション: C:\Windows\System32\rundll32.exe
作成日時: 2016-07-16T13:19:06
変更日時: 2016-07-16T13:19:06
説明: Windows host process (Rundll32) 10
シェルコード: (HHA) (0x00400000 bytes)
コーラーのオーナー: (anonymous; doc.dll)
OwnerModule
名前: doc.dll
サムプリント: 9be4c0089b841d45871f054cb797f099f2a89d71d6158110f1e3a78cb9a9e3ae
SHA-256: 2cd05616874445c655eaf723c549f35cc6c379b1877750788adf2c5d6b86cd09
SHA-1: c7bcb3b84244a22e6ee9699cfbd86dc9f27fc677
MD5: c5e8007b5fa2e25625d659fa5c6604ff
0000024F0AEE034B ffd5 | CALL | RBP |
0000024F0AEE034D 4893 | XCHG | RBX, RAX |
0000024F0AEE034F 53 | PUSH | RBX |
0000024F0AEE0350 53 | PUSH | RBX |
0000024F0AEE0351 4889e7 | MOV | RDI, RSP |
0000024F0AEE0354 4889f1 | MOV | RCX, RSI |
0000024F0AEE0357 4889da | MOV | RDX, RBX |
0000024F0AEE035A 41b800200000 | MOV | R8D, 0x2000 |
0000024F0AEE0360 4989f9 | MOV | R9, RDI |
0000024F0AEE0363 41ba129689e2 | MOV | R10D, 0xe2899612 |
0000024F0AEE0369 ffd5 | CALL | RBP |
0000024F0AEE036B 4883c420 | ADD | RSP, 0x20 |
0000024F0AEE036F 85c0 | TEST | EAX, EAX |
0000024F0AEE0371 74b6 | JZ | 0x24f0aee0329 |
0000024F0AEE0373 668b07 | MOV | AX, [RDI] |
0000024F0AEE0376 4801c3 | ADD | RBX, RAX |
—– SNIP HERE —–
—– END SNIP —–
ロードされるモジュール
—————————————————————————–
00007FF8D34A0000-00007FF8D35D2000 hmpalert.dll (SurfRight B.V.),
バージョン: 3.7.17.317
0000000065180000-00000000651BA000 doc.dll (),
バージョン:
00007FF8C9AA0000-00007FF8C9ADE000 SOPHOS~1.DLL (Sophos Limited),
バージョン: 10.8.9.610
プロセス追跡
1 C:\Windows\System32\rundll32.exe [2856]
rundll32.exe C:\Programdata\doc.dll entryPoint
2 C:\Windows\System32\wbem\WmiPrvSE.exe [4636]
C:\Windows\system32\wbem\wmiprvse.exe -secured -Embedding
3 C:\Windows\System32\svchost.exe [748]
C:\Windows\system32\svchost.exe -k DcomLaunch
4 C:\Windows\System32\services.exe [656]
5 C:\Windows\System32\wininit.exe [552]
wininit.exe
6 C:\Windows\System32\smss.exe [452]
\SystemRoot\System32\smss.exe 000000d4 0000007c
7 C:\Windows\System32\smss.exe [360]
\SystemRoot\System32\smss.exe
サムプリント
7eba537e2dd90dded5c4950f939fbe9a9678b33f840382136d317550ea65a926
モジュールベースサムプリント
9be4c0089b841d45871f054cb797f099f2a89d71d6158110f1e3a78cb9a9e3ae
ランレングスと base64 でエンコード (圧縮) されたメモリダンプをデコードすると、以下のような人間が読める文字列になります:
/Menus.aspx
言語: en-US,en;q=0.5
リファラー: https://locations[.]smashburger.com/us/ky/louisville/312-s-fourth-st.html
ユーザーエージェント: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko)
docns.com
ダイナミックシェルコードプロテクション
2021 年 1 月からは、Sophos Intercept X を使用しているお客様はこのプロテクション機能を利用できるようになりました。この新しいプロテクション機能は、既存のアプリケーションとの高い互換性を保ちながら、メモリの割り当てプロセスに悪意があるかどうかを考慮せず、またシグネチャにも依存せずにアラートを発行できます。
このプロテクション機能は、すべての攻撃に対して必ず有効なわけではありませんが、脅威の状況に大きな影響を与えることが期待されます。すべての機械学習システムが同じではないように、すべてのメモリプロテクションも同じではありません。ソフォス独自のダイナミックシェルコードプロテクションは、ステルス性の高いリモートアクセスエージェントの基本的な動作をブロックするため、攻撃者にとっては大きな打撃になると考えられます。
ダイナミックシェルコードプロテクションはクラウドや機械学習に依存しないため、Cobalt Strike Beacon をはじめとする難読化したマルウェアやメモリに配信されるポストエクスプロイトエージェントとの戦いにおける、パラダイムシフトとなります。
注意: Cobalt Strike Beacon を使った攻撃では、ファイルレスのインメモリー技術が多く確認されています。たとえば Sophos APCViolation プロテクションは、Beacon が非同期プロシージャコール (APC) を介して他のプロセスのアドレス空間で何らかのコードを実行しようとすると、Beacon のコード注入をブロックします (MITRE ATT&CK T1055.004)。多くのエンドポイントプロテクション製品はこのイベントを可視化できないことから、多くの攻撃者が APC インジェクションを利用しています。ダイナミックシェルコードプロテクションは、リモートからの手動によるキーボード攻撃を可能にするリモートアクセスエージェントの根幹となる動作を困難にすることを目的としています。
堅牢な緩和策
Sophos Threat Mitigation チーム (HitmanPro と HitmanPro.Alert のチーム) は、実環境で観察された攻撃手法に対して、他にも多くの斬新な緩和策を導入しています。
これらの緩和策は、Sophos Intercept X に組み込まれており、任意のコードが実行されることを防ぎ、その影響を制限するように設計されています。これは、未知のアプリケーション、信頼されているアプリケーションの両方において、望ましくない動作、つまりディスクやメモリー上のデータを操作するために基本的に必要な機能を介してカーネルが実行するコマンドを監視することによって行われます。これらの緩和策は独自の堅牢性を備えています。シグネチャに依存しないことで難読化されることを避けており、つまり攻撃を検知するための、脆弱なマシンコードのインスペクションには依存していません。さらに、これらのテクノロジーは、クラウドにも機械学習にも依存していません。
次の表は、Sophos Intercept X が Windows 10 に追加する、現在のソフォス独自の緩和策の一覧です。Windows 10 Exploit Guard とは逆に、ソフォスが提供するミティゲーションは互換性が高く、デフォルトで有効で、設定は必要ありません。
説明 | モジュール | レベル | Windows 10 でも同様か |
データ実行防止 (DEP) の実施 | DEP | アプリケーション | はい |
モジュールでの ASLR の必要性 | DEP (ASLR) | アプリケーション | はい |
ボトムアップ ASLR | DEP (ASLR) | アプリケーション | はい |
例外チェーンの検証 | SEHOP | アプリケーション | はい |
API 呼び出しの検証 | ROP | アプリケーション | オプション |
スタックメモリからの API 呼び出しを防止 | CallerCheck | アプリケーション | – |
ダイナミックメモリからのプロセス生成を防止 | CallerCheck | アプリケーション | – |
インポートアドレスフィルタリング (IAF) | IAF | アプリケーション | オプション |
スタックの整合性の検証 | StackPivot | アプリケーション | オプション |
スタックメモリー保護の検証 | StackExec | アプリケーション | オプション |
ヒープのコンテンツの整合性を検証 | HeapSpray | アプリケーション | – |
ヒープスプレーに頻繁に悪用されるメモリアドレスをブロック | HeapSpray | アプリケーション | – |
リモートイメージをブロック | LoadLib | アプリケーション | オプション |
反射型 DLL によるコード注入を防止 | LoadLib | アプリケーション | オプション |
Flash Player における vtable ハイジャックの防止 | VTableHijack | アプリケーション | – |
Internet Explorer での VBScript のサンドボックス化 | Lockdown | アプリケーション | – |
Web ダウンロードにおける DLL ハイジャックの防止 | DllHijack | アプリケーション | – |
新たに作成された実行可能なコンテンツをアプリケーションが実行しないようにする | Lockdown | アプリケーション | – |
アプリケーションが環境寄生型バイナリを使用しないようにする | Lockdown | アプリケーション | – |
アプリケーションが自動実行のレジストリエントリを作成しないようにす | Lockdown | アプリケーション | – |
Office マクロからの Win32 API 呼び出しの防止 | Lockdown | アプリケーション | オプション |
監視されていないシステムコールによる検査バイパスの防止 | SysCall | アプリケーション | – |
WoW64 マーシャリングレイヤーによる検査バイパスの防止 | SysCall | アプリケーション | – |
Heaven’s Gate 経由での検査バイパスを防止 | SysCall | アプリケーション | – |
Web ブラウザの整合性の検証 | Intruder | アプリケーション | – |
データロールバックによるランサムウェアプロテクション、フォルダー不問 | CryptoGuard | System | – |
Windows EFS を悪用するランサムウェアをブロック | CryptoGuard | System | – |
ブートおよびボリュームレコードの上書き保護 | WipeGuard | System | – |
セクションを超えた制御フローを防止 | CodeCave | System | – |
画像サイズを超えた余剰メモリからのコード実行を防止 | CodeCave | System | – |
ダイナミックメモリーからのエントリーポイントの上書きを防止 | CodeCave | System | – |
トークン盗難による権限昇格の防止 | PrivGuard | System | – |
セカンダリログオンハンドラーによる権限昇格の防止 | PrivGuard | System | – |
LSASS による認証情報の盗難防止 | CredGuard | System | オプション |
APC 違反の防止 | APCViolation | System | – |
APC によるアトムテーブルの悪用防止 | APCViolation | System | – |
モジュールロードオーダーが騙され、無視されることを阻止 | Kernel32Trap | System | – |
プロセスの空洞化を防止 | HollowProcess | System | – |
プロセス環境ブロック操作の防止 | HollowProcess | System | – |
メインスレッドのハイジャックを防止 | HollowProcess | System | – |
CTF プロトコル呼び出し元の検証 | CTFGuard | System | – |
ダイナミックシェルコードの防止 | DynamicShellcode | System | – |
他のプロセスからのダイナミックシェルコードを防止 | DynamicShellcode | System | – |
AMSI.DLL のインメモリ操作の防止 | AmsiGuard | System |
– |