Исследователи кибербезопасности SANS Internet Storm Center, обнаружили в VirusTotal новый троянец удаленного доступа (RAT - Remote Access Trojan), написанный на Python, который применяет передовые полиморфные и самомодифицирующиеся методы. Это позволяет вредоносной программе изменять свою сигнатуру при каждом запуске и успешно уклоняться от обнаружения традиционными антивирусными средствами.
Описание
Анализ образца показал, что он получил всего 2 балла из 64 в системе проверки VirusTotal, что свидетельствует о крайне низком уровне детектирования. Ключевой особенностью данного вредоносного ПО стали три функции с характерными названиями: self_modifying_wrapper(), decrypt_and_execute() и polymorph_code(). Их наличие указывает на способность троянца к динамическому изменению собственного кода.
Полиморфное вредоносное программное обеспечение изменяет свой код или сигнатуры данных во время выполнения, чтобы избежать статического обнаружения. Используя модули интроспекции и сериализации Python, этот RAT постоянно трансформирует свой внешний вид, гарантируя, что каждый образец выглядит по-разному для механизмов антивирусного сканирования, основанных на сигнатурах.
Принцип самомодификации демонстрируется функцией self_modifying_wrapper(). Она извлекает сериализованный байт-код критической секции, применяет к нему XOR-шифрование со случайным ключом, а затем дешифрует и распаковывает его обратно в исполняемый объект кода. Этот процесс имитирует упаковку и распаковку вредоносного кода в памяти без записи расшифрованных нагрузок на диск, что позволяет обходить традиционное файловое сканирование.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # Self-modifying code wrapper (simulates packing) def self_modifying_wrapper(): """Wrap critical code in a self-modifying layer.""" log_path = resource_path('debug.log') try: # Simulate packed code by XORing critical sections critical_code = inspect.getsource(main).encode() xor_key = random.randint(1, 255) packed_code = bytes(b ^ xor_key for b in critical_code) # Unpack at runtime unpacked_code = bytes(b ^ xor_key for b in packed_code) code_obj = marshal.loads(zlib.decompress(unpacked_code)) exec(code_obj) with open(log_path, "a") as f: f.write("[+] Self-modifying code executed\n") return True except Exception as e: with open(log_path, "a") as f: f.write(f"[-] Self-modifying code failed: {e}\n") return False |
Дополнительный уровень скрытности обеспечивает функция polymorph_code(). Она внедряет случайный бесполезный код, переименовывает переменные, перемешивает определения функций и добавляет процедуры-пустышки для нарушения шаблонов сигнатур. В результате каждое выполнение троянца генерирует уникальную файловую сигнатуру, что радикально снижает показатели обнаружения.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | def polymorph_code(code): """Obfuscate code with advanced randomization and junk code.""" log_path = resource_path('debug.log') try: # Advanced variable renaming var_map = {var: ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(random.randint(8, 12))) for var in code.split() if var.isidentifier()} for old_var, new_var in var_map.items(): code = code.replace(old_var, new_var) # Insert complex junk code junk_snippets = [ "def _unused_{}(): return None\n".format(''.join(random.choice(string.ascii_letters) for _ in range(8))), "x = [0] * {}; x = [y for y in x]\n".format(random.randint(10, 100)), "import time; time.sleep({})\n".format(random.uniform(0.01, 0.1)), "try: pass\nexcept: pass\n" ] lines = code.split('\n') for _ in range(random.randint(10, 20)): lines.insert(random.randint(0, len(lines)), random.choice(junk_snippets)) code = '\n'.join(lines) # Shuffle function order code = code.replace('\r\n', '\n') # Normalize line endings functions = re.findall(r'(def .+?\n\s*return .+?\n)', code, re.DOTALL) if functions: random.shuffle(functions) code = code.replace(''.join(functions), ''.join(functions)) with open(log_path, "a") as f: f.write("[+] Advanced polymorphic transformation applied\n") return code except Exception as e: with open(log_path, "a") as f: f.write(f"[-] Polymorphic transformation failed: {e}\n") return code |
Помимо продвинутых методов маскировки, RAT обладает обширным набором вредоносных функций, реализованных через асинхронные операции. Он способен сканировать сети, проверять учетные данные по умолчанию, эксплуатировать уязвимости маршрутизаторов, доставлять и выполнять полезные нагрузки, похищать и передавать данные, а также самостоятельно распространяться по сети.
Среди его возможностей - выполнение таких операций, как socket_network_scan(), deliver_payload(), spread_to_network(), encrypt(), mine(), screenshot(), listen(), upload(), download(), а также перехват нажатий клавиш через функции keylog_start() и keylog_stop(). Для управления троянцем используется бот-интерфейс с командами, включая /commands, /encrypt, /mine, /run и /archive, что позволяет злоумышленникам осуществлять дистанционное управление после внедрения.
Появление такого сложного Python-RAT подчеркивает растущую тенденцию к использованию скриптовых языков для создания гибких и труднообнаруживаемых угроз. Специалисты по безопасности отмечают, что традиционные методы защиты, основанные исключительно на сигнатурном анализе, становятся все менее эффективными против подобных адаптивных вредоносных программ. Для противодействия таким угрозам необходимы многоуровневые системы защиты, включающие поведенческий анализ и мониторинг активности в режиме реального времени.
Индикаторы компрометации
SHA256
- 7173e20e7ec217f6a1591f1fc9be6d0a4496d78615cc5ccdf7b9a3a37e3ecc3c