{
	"id": "e2d83e1a-c6ba-4653-a0bd-f6412da2c9f9",
	"created_at": "2026-04-06T00:09:25.493705Z",
	"updated_at": "2026-04-10T13:11:55.791599Z",
	"deleted_at": null,
	"sha1_hash": "6d9d67d93fa7cc83fe150bac08003047e53d9096",
	"title": "PlugXローダーの進化",
	"llm_title": "",
	"authors": "",
	"file_creation_date": "0001-01-01T00:00:00Z",
	"file_modification_date": "0001-01-01T00:00:00Z",
	"file_size": 1135407,
	"plain_text": "PlugXローダーの進化\r\nPublished: 2022-11-30 · Archived: 2026-04-02 11:42:59 UTC\r\nはじめに\r\nＦＦＲＩセキュリティ ソフトウェアエンジニアの松本です。 PlugX というバックドアは非常に古くか\r\nら存在しており、現在でも利用されています。 今回はその PlugX のローダーの変遷について見ていき\r\nます。\r\nPlugX は標的型攻撃に利用されている Remote Access Tool(以下 RAT と記載)であり、主に政府機関など\r\nを狙う標的型攻撃に利用されるツールです。 機能としては情報収集・窃取、侵入後の PC のコントロ\r\nールなどがあります。\r\n2012 年には既に TrendMicro の記事[1]があるほど PlugX は古くから存在します。 その一方、ここ数か\r\n月の間にも TA416 (通称 Mustang Panda[2]) というグループが利用しているという報告[3]が上がってお\r\nります。\r\n日本国内では株式会社 JTB が PlugX に感染し情報漏洩したという事例が存在します[5][6]。 また、株式\r\n会社ジャストシステムのワープロソフトである一太郎の脆弱性を利用し感染を狙う事例もありました\r\n[7][9]。\r\nPlugX ローダーは世代に関わらず以下のような流れで動作しています。\r\n1. ドロッパーを添付したメール経由などにより、対象組織内部でドロッパーを実行してもらう\r\n2. ドロッパーが①正規 exe、②マルウェア dll、③バイナリファイルの 3 つを生成する\r\n3. ドロッパーが①正規 exe を実行する\r\nhttps://engineers.ffri.jp/entry/2022/11/30/141346\r\nPage 1 of 13\n\n4. ②マルウェア dll は①正規 exe が利用する正規 dll を偽装しており、①正規 exe はそのまま②マル\r\nウェア dll を読み込む\r\n5. ②マルウェア dll が③バイナリファイルを読み込む\r\n6. ③バイナリファイルが子プロセスを生成し、次の段階に移る\r\n読み込まれるバイナリファイルの内部に暗号化されたコードなどが入っているため、実際にはその複\r\n合など更に細かい動作が存在しますが、動作の流れは以下の概要図のようになります。\r\n図1 PlugX動作の概要図\r\n実際にドロップされる具体例としては下の図のようになります。 この図では RasTls.exe は正規の exe\r\nであり、RasTls.dll へのリンクが存在しています。 マルウェアバイナリにもアイコンが付いています\r\nが、これは本来 msc が Microsoft 管理コンソールに紐付けられている拡張子であるためです。 実際の中\r\n身は全く関係無いバイナリファイルとなっています。\r\nhttps://engineers.ffri.jp/entry/2022/11/30/141346\r\nPage 2 of 13\n\n図2 PlugX動作例\r\nexe が不正な dll を読み込んでしまう理由は、exe が dll を読み込む際に同じディレクトリの dll を優先\r\nする仕様のためです。\r\n図3 正規 exe のロードにより読み込まれる例\r\n次の図は、LoadLibraryW 関数で同ディレクトリの dll を動的に読み込む箇所です。\r\nこのような動的な dll 読み込みの際、通称 exe は自身の現在のパスから読み込みたい dll のパスを生成\r\nしますが、 PlugX は同ディレクトリ内にファイルを生成するため、結局すり替えられた dll を読み込む\r\nことになります。\r\nhttps://engineers.ffri.jp/entry/2022/11/30/141346\r\nPage 3 of 13\n\n図4 正規 exe から LoadLibraryW 関数で読み込まれる例\r\nこの手法は DLL Side-Loading[4]と呼ばれ、デジタル署名された正規の exe を利用することで、アンチウ\r\nイルスソフトの検知回避によく利用されます。\r\n一般に dll 内部の悪意のあるコードは entry 関数か、exe から必ず呼ばれる export 関数のどちらかに実装\r\nされていますが、PlugX は entry 関数に悪意のあるコードが実装されています。 ここで dll における\r\nentry 関数は DllMain 関数であり、リンクなどで読み込まれた段階で必ず呼ばれる処理です。 そのた\r\nめ、exe の初期化処理である dll 読み込みの段階で PlugX ローダーが動作します。\r\n次の段階では、子プロセスもしくはサービス登録によるサービスプロセスを生成します。 実行プロセ\r\nスに管理者権限が付与されているときには、サービスプロセスを生成し、管理者権限がない時には、\r\n子プロセスを生成します。\r\nさて、ここまでは全世代の PlugX 共通な動作の流れについて説明しましたが、次に世代によって変化\r\nしてきた内容を説明します。\r\nPlugXの変化\r\nPlugX は時間と共に進化していきました。 その流れを簡潔に纏めると以下のようになります。\r\n年代 世代 追加機能の例 引用\r\n2012 第一世代 RAT [1]\r\n2013 第二世代 自己解凍書庫の利用開始 [8][9]\r\n2015 第三世代 P2P機能の追加による、感染端末間の通信 [10]\r\n2017 第四世代 PoisonIvyのコード流用 [11]\r\n現状 第五世代\r\nGo言語の利用、ローダーの多様化\r\nC2 サーバーからドロップ検体をダウンロード\r\n[3][12]\r\n第一世代\r\nPlugX では前述通り、まずは正規 exe から dll が読み込まれ、dll からバイナリを読み込んだ上で次のプ\r\nロセスを生成するという動作をします。 まず注目すべきは、マルウェアバイナリのコード内部でスタ\r\nック上に文字列を生成する stack strings という手法が利用されている点です。 この手法はバイナリに文\r\n字列を直接埋め込まないため、解析をより困難にします。\r\nhttps://engineers.ffri.jp/entry/2022/11/30/141346\r\nPage 4 of 13\n\n図5 stack strings が利用されている箇所\r\nstack strings は x86 の mov 命令や lea 命令を利用してスタック上に文字列を手動で生成する方法です。\r\n図6 stack strings の例\r\n上の図であれば、4 byte 長の mov 命令を利用することでスタック上に文字列を構築できます。 構築後\r\nに esp レジスタが指している箇所を文字列として扱えば Windows API などで認識できる文字列になり\r\nます。 上記の例では char 型でしたが、wchar_t 型でも同様に作成可能です。\r\n図7 LoadLibraryA を 4 byte ずつ生成\r\nhttps://engineers.ffri.jp/entry/2022/11/30/141346\r\nPage 5 of 13\n\n図8 スタック上の GetProcAddress を 1 byte ずつ確認\r\nスタック上に生成された文字列はバイナリ内部で利用する API のアドレスを動的に取得するために利\r\n用されます。\r\nここで LZNT1 復号に利用する RtlDecompressBuffer という関数も動的解決しています。 ここで得た\r\nLZNT1 復号と XOR 復号により、子プロセスの生成に進みます。\r\n図9 バイナリをメモリ内部で復号\r\nhttps://engineers.ffri.jp/entry/2022/11/30/141346\r\nPage 6 of 13\n\n図10 XOR 復号関数\r\n図11 RtlDecompressBuffer 呼び出しによる LZNT1 復号\r\nこの復号により、メモリ内部に PE ヘッダーを持つコード領域を展開することが確認できます。\r\n図12 マジックナンバーである MZ が確認できる\r\n第二世代\r\n第二世代は機能面の変化の他、メモリ内部で復号される PE ファイルのマジックナンバーが PE ではな\r\nくなっているといった変更点が報告されています[8][9]。 ドロッパーに自己解凍書庫が利用されている\r\nパターンもこの辺りから出てきます。 ここではローダー部分の変化について見ていきます。\r\nマルウェア dll には上から順番にディスアセンブルすると、実際に実行される命令とは異なってしまう\r\nという難読化が施された関数も追加されています。\r\nhttps://engineers.ffri.jp/entry/2022/11/30/141346\r\nPage 7 of 13\n\n図13 不要な分岐\r\n赤枠は以下のような役割を担っています。\r\n1. 二行続けて同じ所にジャンプするように指定されているため、無条件ジャンプと同等\r\n2. その直後の call 命令は、直前のジャンプを無条件ジャンプと解釈できなかった為に発生\r\n3. e8 から命令を開始することで、意図的にコード外にジャンプする不正な call 命令と解釈させる\r\n他にも、不要な XOR なども追加されており、処理を追いかけにくい構造になっています。\r\n図14 不要な XOR\r\nこれらの難読化処理は Ghidra のデコンパイル結果にも影響しますが、除去整理することで以下のよう\r\nにデコンパイル結果が綺麗になります。 デコンパイル結果から dll 内部のバイナリを復号するコードが\r\n出てきたことが確認できます。\r\nhttps://engineers.ffri.jp/entry/2022/11/30/141346\r\nPage 8 of 13\n\n図15 デコンパイル結果\r\nこの処理以降は第一世代と同じ stack strings を利用した API 動的解決の処理に入ります。\r\nRtlDecompressBuffer も LZNT1 復号に利用されており、XOR 復号のコードは変わっているもののこの辺\r\nりのローダーとしての処理は第一世代と同じと見て良いでしょう。\r\n第一世代と同じく PE ヘッダーを持つバイナリが復号されメモリに展開されますが、マジックナンバー\r\nが改変されている物となっております。\r\n図16 XV ヘッダー\r\n第三世代\r\n第三世代の機能面における変化は P2P 機能の搭載などが報告されています[10]。\r\nしかし、ローダー部分に関しては XV というマジックナンバーの出現個数の変化などの変更はあるもの\r\nの、 XOR 復号はもちろん大まかな流れには変化が無いように見受けられました。\r\nhttps://engineers.ffri.jp/entry/2022/11/30/141346\r\nPage 9 of 13\n\n第四世代\r\nPoisonIvy のコードを一部流用している[11]ということで第四世代として分類されるこの世代では、 ド\r\nロッパー自体は第三世代から引き続き自己解凍書庫であるものの、ローダー部分にも多くの変更が入\r\nっています。 例えば、簡単なものであればマルウェア dll の entry 関数から早速 NOP、DEC、INC 命令\r\nを使った無駄な処理を大量に配置しています。\r\n図17 entry 関数の NOP\r\nただし、Ghidra のデコンパイル結果には影響しておらず、比較的除去が簡単な処理になっています。\r\n図18 entry 関数のデコンパイル結果\r\nhttps://engineers.ffri.jp/entry/2022/11/30/141346\r\nPage 10 of 13\n\nまた、今までの世代では VirtualAlloc で取得したメモリへの展開は memcpy を利用していましたが、こ\r\nの世代からはバイナリファイルを直接 ReadFile で読み込む処理に変わっています。 ReadFile 経由の読\r\nみ込みはユーザーランドにおける WinDbg のハードウェアブレークポイントでは止まらないので、 メ\r\nモリアドレスへの書き込みイベントで止めることが出来ず、より解析が困難になっています。\r\nWinDbg のクエリ結果から見ても、突然メモリに 0x3f の値が出てきていることが確認できます。\r\n図19 Time Travel Debugging で確認できるメモリ操作\r\n上記のクエリ結果の中にある Write は復号処理であることが確認できます。\r\n図20 ReadFile で読み込んだメモリ領域を復号する箇所\r\nまた、子プロセス生成までに必要な API の取得において stack strings は利用しなくなり、代わりに随時\r\nハッシュ値から関数アドレスを復元する形になっています。\r\n図21 CreateServiceA の呼び出し例\r\nこの関数アドレス取得の手法は子プロセス生成後にも沢山利用されております。 この手法は Poison Ivy\r\nと酷似していることが報告されています[11]。\r\nAPI 解決に必要なモジュールのアドレス解決においては、対象のモジュール名がメモリ上にそのまま存\r\n在しています。\r\nhttps://engineers.ffri.jp/entry/2022/11/30/141346\r\nPage 11 of 13\n\n図22 メモリ上にある kernel32\r\n現在\r\nPlugX と呼ばれる検体は現在も変化し続けていますが、 基本的に正規 exe、マルウェアである dll、そ\r\nしてバイナリファイルを同じディレクトリに配置するというドロップ方式は変わっていないようで\r\nす。\r\n一方で解析をより困難にするため C2 サーバーと接続出来なければ次の段階に進まないような改良が見\r\nられるようになりました。\r\n図23 検体の C2 サーバーへの接続試行\r\nまた、Go 言語製の PlugX ローダーが存在していることも報告されています[11]。 この dll のインポー\r\nト関数からも確認できます。\r\n図24 インポート関数の一部\r\nこの Go 言語製の dll も C2 サーバーと接続できなければ動作しないようになっていたため、 現在の主\r\n流は解析を困難にするため、 C2 サーバー側にドロップさせたい物を配置する形式になってきたと思わ\r\nれます。\r\n終わりに\r\nhttps://engineers.ffri.jp/entry/2022/11/30/141346\r\nPage 12 of 13\n\nPlugX は長い活動期間を通して、機能の高度化以外にもローダー部分における難読化も施していること\r\nが確認できました。 こうした変化によりマルウェア解析用のスクリプトが正常に動作しないこともあ\r\nり、検知を回避し、解析の妨害に一役買っています。\r\n今回調査した PlugX の検体など多くのマルウェアは、以上のような検知回避や難読化などを行ってお\r\nりますが、FFRI yarai は検知エンジンの新規開発や改善などを継続的に行うことで、検知可能となって\r\nおりますのでご安心ください。 (※ただし、全ての PlugX が検出できることを保証するものではありま\r\nせん)。\r\nエンジニア募集\r\nＦＦＲＩセキュリティではマルウェアの解析などセキュリティの研究開発を行っています。採用に関\r\nしては こちら をご覧ください。\r\n参考文献\r\n[1] 標的型攻撃に利用されるPlugXの脅威とは | トレンドマイクロ 脅威データベース\r\n[2] Mustang Panda, TA416, RedDelta, BRONZE PRESIDENT, Group G0129 | MITRE ATT\u0026CK®\r\n[3] The Good, the Bad, and the Web Bug: TA416 Increases Operational Tempo Against European Governments as\r\nConflict in Ukraine Escalates | Proofpoint US\r\n[4] Hijack Execution Flow: DLL Side-Loading, Sub-technique T1574.002 - Enterprise | MITRE ATT\u0026CK®\r\n[5] JTB、約793万人分の個人情報流出の恐れ - 有効パスポート番号4,300件含む | マイナビニュース\r\n[6] 「PlugX」はどんなマルウェア? JTBを狙った標的型攻撃をファイア・アイが解説 | マイナビニュー\r\nス\r\n[7] 一太郎の脆弱性を突くマルウェア、人事情報装うメールで日本に「着弾」 | ITmedia エンタープライ\r\nズ\r\n[8] PlugX - The Next Generation | Sophos\r\n[9] From the Labs: New PlugX malware variant takes aim at Japan | Naked Security\r\n[10] マルウエアPlugXの新機能 (2015-01-22) - JPCERT/CC Eyes | JPCERTコーディネーションセンター公\r\n式ブログ\r\n[11] Poison Ivyのコードを取り込んだマルウエアPlugX(2017-01-12) - JPCERT/CC Eyes | JPCERTコーディ\r\nネーションセンター公式ブログ\r\n[12] TA416 Goes to Ground and Returns with a Golang PlugX Malware Loader | Proofpoint US\r\nSource: https://engineers.ffri.jp/entry/2022/11/30/141346\r\nhttps://engineers.ffri.jp/entry/2022/11/30/141346\r\nPage 13 of 13",
	"extraction_quality": 1,
	"language": "JA",
	"sources": [
		"Malpedia"
	],
	"origins": [
		"web"
	],
	"references": [
		"https://engineers.ffri.jp/entry/2022/11/30/141346"
	],
	"report_names": [
		"141346"
	],
	"threat_actors": [
		{
			"id": "aa90ad17-8852-4732-9dba-72ffb64db493",
			"created_at": "2023-07-11T02:00:10.067957Z",
			"updated_at": "2026-04-10T02:00:03.367801Z",
			"deleted_at": null,
			"main_name": "RedDelta",
			"aliases": [],
			"source_name": "MISPGALAXY:RedDelta",
			"tools": [],
			"source_id": "MISPGALAXY",
			"reports": null
		},
		{
			"id": "b69037ec-2605-4de4-bb32-a20d780a8406",
			"created_at": "2023-01-06T13:46:38.790766Z",
			"updated_at": "2026-04-10T02:00:03.101635Z",
			"deleted_at": null,
			"main_name": "MUSTANG PANDA",
			"aliases": [
				"Stately Taurus",
				"LuminousMoth",
				"TANTALUM",
				"Twill Typhoon",
				"TEMP.HEX",
				"Earth Preta",
				"Polaris",
				"BRONZE PRESIDENT",
				"HoneyMyte",
				"Red Lich",
				"TA416"
			],
			"source_name": "MISPGALAXY:MUSTANG PANDA",
			"tools": [],
			"source_id": "MISPGALAXY",
			"reports": null
		},
		{
			"id": "6daadf00-952c-408a-89be-aa490d891743",
			"created_at": "2025-08-07T02:03:24.654882Z",
			"updated_at": "2026-04-10T02:00:03.645565Z",
			"deleted_at": null,
			"main_name": "BRONZE PRESIDENT",
			"aliases": [
				"Earth Preta ",
				"HoneyMyte ",
				"Mustang Panda ",
				"Red Delta ",
				"Red Lich ",
				"Stately Taurus ",
				"TA416 ",
				"Temp.Hex ",
				"Twill Typhoon "
			],
			"source_name": "Secureworks:BRONZE PRESIDENT",
			"tools": [
				"BlueShell",
				"China Chopper",
				"Claimloader",
				"Cobalt Strike",
				"HIUPAN",
				"ORat",
				"PTSOCKET",
				"PUBLOAD",
				"PlugX",
				"RCSession",
				"TONESHELL",
				"TinyNote"
			],
			"source_id": "Secureworks",
			"reports": null
		},
		{
			"id": "b5449533-0ff1-4048-999d-7d4bfd8e6da6",
			"created_at": "2022-10-25T16:07:24.114365Z",
			"updated_at": "2026-04-10T02:00:04.869887Z",
			"deleted_at": null,
			"main_name": "RedDelta",
			"aliases": [
				"Operation Dianxun",
				"TA416"
			],
			"source_name": "ETDA:RedDelta",
			"tools": [
				"Agent.dhwf",
				"Agentemis",
				"Chymine",
				"Cobalt Strike",
				"CobaltStrike",
				"Darkmoon",
				"Destroy RAT",
				"DestroyRAT",
				"Gen:Trojan.Heur.PT",
				"Kaba",
				"Korplug",
				"PlugX",
				"Poison Ivy",
				"RedDelta",
				"SPIVY",
				"Sogu",
				"TIGERPLUG",
				"TVT",
				"Thoper",
				"Xamtrav",
				"cobeacon",
				"pivy",
				"poisonivy"
			],
			"source_id": "ETDA",
			"reports": null
		},
		{
			"id": "9baa7519-772a-4862-b412-6f0463691b89",
			"created_at": "2022-10-25T15:50:23.354429Z",
			"updated_at": "2026-04-10T02:00:05.310361Z",
			"deleted_at": null,
			"main_name": "Mustang Panda",
			"aliases": [
				"Mustang Panda",
				"TA416",
				"RedDelta",
				"BRONZE PRESIDENT",
				"STATELY TAURUS",
				"FIREANT",
				"CAMARO DRAGON",
				"EARTH PRETA",
				"HIVE0154",
				"TWILL TYPHOON",
				"TANTALUM",
				"LUMINOUS MOTH",
				"UNC6384",
				"TEMP.Hex",
				"Red Lich"
			],
			"source_name": "MITRE:Mustang Panda",
			"tools": [
				"CANONSTAGER",
				"STATICPLUGIN",
				"ShadowPad",
				"TONESHELL",
				"Cobalt Strike",
				"HIUPAN",
				"Impacket",
				"SplatCloak",
				"PAKLOG",
				"Wevtutil",
				"AdFind",
				"CLAIMLOADER",
				"Mimikatz",
				"PUBLOAD",
				"StarProxy",
				"CorKLOG",
				"RCSession",
				"NBTscan",
				"PoisonIvy",
				"SplatDropper",
				"China Chopper",
				"PlugX"
			],
			"source_id": "MITRE",
			"reports": null
		},
		{
			"id": "2ee03999-5432-4a65-a850-c543b4fefc3d",
			"created_at": "2022-10-25T16:07:23.882813Z",
			"updated_at": "2026-04-10T02:00:04.776949Z",
			"deleted_at": null,
			"main_name": "Mustang Panda",
			"aliases": [
				"Bronze President",
				"Camaro Dragon",
				"Earth Preta",
				"G0129",
				"Hive0154",
				"HoneyMyte",
				"Mustang Panda",
				"Operation SMUGX",
				"Operation SmugX",
				"PKPLUG",
				"Red Lich",
				"Stately Taurus",
				"TEMP.Hex",
				"Twill Typhoon"
			],
			"source_name": "ETDA:Mustang Panda",
			"tools": [
				"9002 RAT",
				"AdFind",
				"Agent.dhwf",
				"Agentemis",
				"CHINACHOPPER",
				"China Chopper",
				"Chymine",
				"ClaimLoader",
				"Cobalt Strike",
				"CobaltStrike",
				"DCSync",
				"DOPLUGS",
				"Darkmoon",
				"Destroy RAT",
				"DestroyRAT",
				"Farseer",
				"Gen:Trojan.Heur.PT",
				"HOMEUNIX",
				"Hdump",
				"HenBox",
				"HidraQ",
				"Hodur",
				"Homux",
				"HopperTick",
				"Hydraq",
				"Impacket",
				"Kaba",
				"Korplug",
				"LadonGo",
				"MQsTTang",
				"McRAT",
				"MdmBot",
				"Mimikatz",
				"NBTscan",
				"NetSess",
				"Netview",
				"Orat",
				"POISONPLUG.SHADOW",
				"PUBLOAD",
				"PVE Find AD Users",
				"PlugX",
				"Poison Ivy",
				"PowerView",
				"QMAGENT",
				"RCSession",
				"RedDelta",
				"Roarur",
				"SPIVY",
				"ShadowPad Winnti",
				"SinoChopper",
				"Sogu",
				"TIGERPLUG",
				"TONEINS",
				"TONESHELL",
				"TVT",
				"TeamViewer",
				"Thoper",
				"TinyNote",
				"WispRider",
				"WmiExec",
				"XShellGhost",
				"Xamtrav",
				"Zupdax",
				"cobeacon",
				"nbtscan",
				"nmap",
				"pivy",
				"poisonivy"
			],
			"source_id": "ETDA",
			"reports": null
		}
	],
	"ts_created_at": 1775434165,
	"ts_updated_at": 1775826715,
	"ts_creation_date": 0,
	"ts_modification_date": 0,
	"files": {
		"pdf": "https://archive.orkl.eu/6d9d67d93fa7cc83fe150bac08003047e53d9096.pdf",
		"text": "https://archive.orkl.eu/6d9d67d93fa7cc83fe150bac08003047e53d9096.txt",
		"img": "https://archive.orkl.eu/6d9d67d93fa7cc83fe150bac08003047e53d9096.jpg"
	}
}