Три месяца назад при разборе инцидента в финтехе я ковырял pcap трёхнедельной давности и не мог понять, как бот обновляет payload - на эндпоинте ни одного нового PE-файла, а C2-трафик шёл GET-запросами к легитимному CDN. Ответ нашёлся в WAV-файлах: шеллкод был упакован в младшие биты аудиосэмплов, а загрузчик на хосте извлекал его при каждом «скачивании». Файл воспроизводился как обычная музыка без слышимых артефактов, EDR молчал - для него это был медиафайл. Просто музыка. Ничего подозрительного.
Стеганография в аудиофайлах - не теоретическая экзотика из CTF-задач. В 2019 году Symantec зафиксировала, что группа Turla (Waterbug) использует WAV для доставки кода на заражённые хосты, а исследователи Cylance (ныне BlackBerry) в том же году нашли криптомайнеры и Metasploit-шеллы внутри аудиофайлов. С тех пор техника только развивается, а detection в большинстве организаций стоит на нуле.
Почему WAV: что делает аудиоформат удобным контейнером для малвари
WAV (RIFF WAVE) хранит аудио в несжатом PCM-формате. Каждый сэмпл - 16-битное целое число от -32768 до 32767. Изменение младшего бита меняет амплитуду на 1/65536 от полного диапазона - это физически неразличимо на слух. Трёхминутный стерео-файл при 44.1 кГц весит около 30 МБ и содержит порядка 15.8 миллионов сэмплов. Один бит на сэмпл - почти 2 МБ ёмкости. Для шеллкода, конфигурации C2 или компактной DLL - за глаза.С точки зрения атакующего, WAV-контейнер закрывает сразу несколько проблем.
Межсетевые экраны и DLP классифицируют аудиофайлы как безопасный медиаконтент. Скачивание WAV с публичного CDN или музыкального сервиса не генерирует алертов - для сетевого фильтра это «пользователь слушает музыку». Поведенческий анализ EDR срабатывает на исполняемые файлы и скрипты, а WAV сам по себе не исполняется - payload извлекает отдельный загрузчик, уже сидящий на хосте. В SIEM скачивание аудио тонет в общем потоке HTTP-запросов. Кто будет расследовать GET на
.wav?Согласно классификации stegomalware, техника относится к Type I (Update): стеготекст и ключ скачиваются с удалённого сервера в runtime, а алгоритм извлечения зашит в загрузчик. Атакующий может обновлять payload без изменения кода на эндпоинте - заменил WAV на CDN, и бот уже тянет свежий шеллкод.
Применимость: техника работает на второй стадии атаки (post-initial access). Initial access - через классику: фишинг, эксплуатацию уязвимостей. WAV используется для скрытного обновления payload и covert channel при C2-коммуникации. Годится и для внешних пентестов (exfiltration через легитимные сервисы), и для внутренних (передача данных через SMB-шары).
Методы встраивания payload в WAV файлы
LSB стеганография аудио: классический и самый распространённый подход
Метод наименее значащих битов (LSB) - рабочая лошадка сокрытия полезной нагрузки в аудио. Младший бит каждого 16-битного сэмпла заменяется битом payload. Ухо не уловит изменение амплитуды в 1 единицу из 65536 - это за пределами человеческого восприятия.По данным Cylance (октябрь 2019), именно LSB-загрузчики были одним из трёх типов, обнаруженных в реальной кампании. Загрузчики декодировали и запускали полноценные PE-файлы из младших битов аудиоданных. При воспроизведении часть файлов звучала как обычная музыка - «that had no discernible quality issues or glitches». Без артефактов, без щелчков, без подозрений.
Ограничения для атакующего: LSB уязвим к статистическому стегоанализу (тест хи-квадрат), если payload не зашифрован перед встраиванием. В реальных кампаниях шифрование перед встраиванием - стандарт, что нейтрализует простые статистические тесты. Ещё одна проблема: метод не переживает lossy-сжатие (MP3, OGG, Opus). Если файл пройдёт через транскодер - payload разрушится. Атакующий привязан к форматам без потерь.
Детект EDR: ни CrowdStrike Falcon, ни Microsoft Defender for Endpoint, ни SentinelOne не инспектируют содержимое аудиофайлов. Поведенческий анализ сработает только на этапе исполнения извлечённого payload. Сам WAV проходит незамеченным.
Фазовое кодирование и спектральное встраивание
Фазовое кодирование модифицирует фазу начального сегмента аудиосигнала, кодируя данные в фазовых разностях между последовательными сегментами. Ёмкость ниже, чем у LSB, зато метод устойчивее к обработке сигнала и некоторым видам сжатия.Спектральное встраивание помещает данные в определённые частотные диапазоны - обычно выше 14–16 кГц, где человеческий слух наименее чувствителен. На спектрограмме такие данные видны как аномальные паттерны. Подход широко используется для цифровых водяных знаков в музыкальной индустрии - Nielsen People Meter встраивает идентификаторы станций и временные метки под программное аудио, что отслеживается портативными устройствами у слушателей.
Эхо-стеганография кодирует данные через введение микрозадержек эха в аудиосигнал. Самый устойчивый вариант к аналоговым искажениям, но ёмкость - единицы килобайт на минуту аудио. Для серьёзного payload не годится.
Применимость: фазовое кодирование и эхо-стеганография - для сценариев, где аудио может проходить через lossy-транскодирование (VoIP-каналы, стриминговые платформы). В малвари встречаются значительно реже LSB: сложнее в реализации, а выигрыш для атакующего невелик, если есть lossless-канал.
rand()-based loader: обфускация под видом аудио
В кампании 2019 года, описанной Cylance, часть загрузчиков использовала не стеганографию, а декодирование на основеrand() с фиксированным seed. WAV-файл содержал данные, которые при воспроизведении звучали как белый шум (статика), но после применения PRNG-последовательности превращались в PE-файл или шеллкод. По сути - матрёшка, только вместо деревянных кукол внутри лежит Metasploit reverse shell.Cylance классифицировала три типа загрузчиков в одной кампании:
- LSB-стеганография - извлечение и запуск PE-файла из младших битов легитимного аудио
- rand()-based PE - PRNG-декодирование полноценного исполняемого файла из данных, звучащих как шум
- rand()-based shellcode - PRNG-декодирование и прямое исполнение шеллкода в памяти
Ограничение для защитника: rand()-based метод - не стеганография в строгом смысле. Стегоанализ здесь бесполезен. Файл со статикой не содержит «скрытых» данных в легитимном аудио - весь файл и есть обфусцированный payload. Детектировать можно по поведению загрузчика (процесс читает WAV, затем запускает шеллкод) или по сетевым аномалиям (регулярное скачивание WAV одинакового размера с одного источника).
Реальные кампании: аудио стеганография в кибератаках
Turla/Waterbug: WAV как covert channel для APT
В июне 2019 года Symantec зафиксировала, что группа Turla (Waterbug) - российская кибершпионская APT - использует WAV-файлы для передачи вредоносного кода с C2-серверов на ранее заражённые хосты. Это не initial access - WAV-стеганография применялась как covert channel для обновления payload на уже скомпрометированных машинах.Контекст: до этого stegomalware фиксировали преимущественно в изображениях. Среди ранних примеров - Operation Shady RAT (2011), где IP-адреса C2 прятали в цифровых изображениях, и Duqu (2011), встраивавший данные жертв в JPEG перед эксфильтрацией. Zeus/Zbot, Gatak/Stegoloader, TeslaCrypt использовали PNG и JPEG для payload. Переход Turla на WAV - расширение вектора от изображений к аудио. Логичная эволюция: аудиофайлы крупнее, вмещают больше данных, и на них вообще никто не смотрит.
Для пентестера: модель Turla показывает сценарий, где initial access уже получен (через spear-phishing или watering hole), а WAV-канал обеспечивает скрытное обновление инструментария. При моделировании APT во внутреннем пентесте подобный covert channel позволяет обходить сетевой мониторинг на этапах lateral movement и privilege escalation.
Cylance 2019: три типа загрузчиков в одной инфраструктуре
В октябре 2019 года BlackBerry Cylance опубликовала детальное исследование кампании с DLL-файлами внутри WAV. Малварь, уже сидящая на заражённом хосте, скачивала WAV-файл, извлекала DLL побитно и запускала её. Результат - установка XMRrig для майнинга Monero.Принципиальное отличие от Turla: если Turla - nation-state шпионаж, то кампания Cylance - «run-of-the-mill crypto-mining operation», обычная финансово мотивированная атака. WAV-стеганография и сокрытие данных в медиафайлах перестали быть инструментом только APT-группировок. Техника доступна рядовым операторам малвари - порог входа снизился.
Обнаружение стеганографии в WAV: практический detection workflow
Требования к окружению
- ОС: Linux (Kali 2023.x+, Ubuntu 22.04+) или Windows 10/11 с WSL2
- Python: 3.8+, библиотеки numpy, scipy; модуль wave из стандартной библиотеки
- Audacity: 3.x для визуального спектрального анализа
- binwalk: 2.3+ для энтропийного анализа и поиска встроенных артефактов
- YARA: 4.x для автоматизированного сканирования
- RAM: минимум 4 ГБ (для анализа файлов до 100 МБ)
- Права: обычный пользователь, root не требуется
- Сеть: workflow полностью offline-совместим
Энтропийный анализ и первичная разведка
Первый шаг
🔓 Часть контента скрыта: Эксклюзивный контент для зарегистрированных пользователей.
- убедиться, что WAV-файл соответствует заявленному формату.
Энтропийный график (
Ограничение: если атакующий распределяет payload равномерно по всему файлу через LSB, общий энтропийный профиль практически не отличается от нормального аудио. Энтропийный анализ ловит только грубые реализации, где payload добавлен отдельным блоком или дописан в хвост файла. Против аккуратного LSB - бесполезен.
Результат
Критическое ограничение: если атакующий шифрует payload перед LSB-встраиванием (а в реальных кампаниях, включая описанную Cylance, это стандарт), распределение младших битов будет выглядеть статистически случайным. Тест хи-квадрат не сработает. Это фундаментальная слабость статистического стегоанализа - он ловит только «ленивые» реализации без предварительного шифрования. По документам метод рабочий, на практике - ловит новичков.
Правило детектит PE-заголовки (
Ограничение: зашифрованный или LSB-распределённый payload не содержит этих байтовых последовательностей в непрерывном виде. Для таких случаев можно добавить правило, сверяющее заявленный размер data-чанка с расчётным (sample_rate × bit_depth × channels × duration) - расхождение указывает на дописанные данные. Не панацея, но лучше, чем ничего.
file suspicious.wav покажет, корректен ли RIFF-заголовок и параметры аудио (sample rate, bit depth, channels). Дальше - binwalk suspicious.wav для поиска встроенных артефактов: PE-заголовков, ZIP-архивов, скриптов, добавленных после аудиопотока. Иногда payload дописывают в конец файла «как есть» - и binwalk вытаскивает его за секунду. Наивно, но встречается.Энтропийный график (
binwalk -E suspicious.wav) визуализирует распределение энтропии по длине файла. В нормальном WAV с музыкой энтропия колеблется в зависимости от громкости и сложности сигнала. Плоский участок с аномально высокой энтропией (близкой к 8.0 бит на байт) в конкретном сегменте - индикатор зашифрованного или сжатого payload, встроенного блоком.Ограничение: если атакующий распределяет payload равномерно по всему файлу через LSB, общий энтропийный профиль практически не отличается от нормального аудио. Энтропийный анализ ловит только грубые реализации, где payload добавлен отдельным блоком или дописан в хвост файла. Против аккуратного LSB - бесполезен.
Статистический анализ LSB: тест хи-квадрат
Для обнаружения LSB стеганографии в аудио применяется тест хи-квадрат на распределение младших битов сэмплов. В нормальном аудиосигнале биты 0 и 1 в LSB-плоскости встречаются примерно с равной частотой. Если payload не зашифрован перед встраиванием, его статистические свойства нарушают это равновесие.
Python:
import wave, numpy as np
from scipy.stats import chisquare
def check_lsb(path):
with wave.open(path, 'r') as w:
samples = np.frombuffer(w.readframes(w.getnframes()), dtype=np.int16)
lsbs = samples & 1
zeros = np.count_nonzero(lsbs == 0)
ones = np.count_nonzero(lsbs == 1)
total = zeros + ones
_, p = chisquare([zeros, ones], [total / 2, total / 2])
return f"samples: {total} | p-value: {p:.6f} | {'ANOMALY' if p < 0.05 else 'NORMAL'}"
p-value < 0.05 указывает на статистически значимое отклонение от случайного распределения LSB - возможный индикатор стеганографии. Но низкий p-value может быть вызван и особенностями аудиосигнала: тишина, синусоидальный тон, цифровая пауза - всё это даёт неравномерное распределение LSB без всякого скрытого кода. Ложные срабатывания - боль этого метода.Критическое ограничение: если атакующий шифрует payload перед LSB-встраиванием (а в реальных кампаниях, включая описанную Cylance, это стандарт), распределение младших битов будет выглядеть статистически случайным. Тест хи-квадрат не сработает. Это фундаментальная слабость статистического стегоанализа - он ловит только «ленивые» реализации без предварительного шифрования. По документам метод рабочий, на практике - ловит новичков.
Спектральный анализ в Audacity
Открываем WAV в Audacity, переключаем отображение дорожки на Spectrogram (клик по имени дорожки → Spectrogram). В Spectrogram Settings выставляем диапазон: Min Frequency = 0, Max Frequency = 22050 Hz (для файлов 44.1 kHz). Что искать:- Аномальные горизонтальные полосы в высокочастотной области (выше 15 кГц) - признак спектрального встраивания
- Изображения или текст, проявляющиеся в спектрограмме при сужении диапазона (4000–14000 Гц) - да, некоторые прячут картинки прямо в спектре, это больше CTF, но встречается
- Равномерный шум в узком частотном диапазоне, отсутствующий в оригинальном аудио
YARA-правила для WAV стеганографии и вредоносного ПО
Для автоматизированного сканирования файловых хранилищ и карантинных зон - YARA-правило, ищущее структурные аномалии в WAV:
Код:
rule wav_embedded_payload {
meta:
description = "WAV file with potential embedded executable payload"
strings:
$riff = "RIFF" at 0
$wave = "WAVE" at 8
$mz = { 4D 5A }
$elf = { 7F 45 4C 46 }
$sc64 = { fc 48 83 e4 f0 }
condition:
$riff and $wave and any of ($mz, $elf, $sc64)
}
MZ), ELF-заголовки и типичные прологи x64-шеллкода внутри WAV-файлов. Работает против наивных реализаций, где payload встроен блоком без шифрования.Ограничение: зашифрованный или LSB-распределённый payload не содержит этих байтовых последовательностей в непрерывном виде. Для таких случаев можно добавить правило, сверяющее заявленный размер data-чанка с расчётным (sample_rate × bit_depth × channels × duration) - расхождение указывает на дописанные данные. Не панацея, но лучше, чем ничего.
Слепые зоны: где стандартная защита не видит скрытый код в аудио
Стандартный стек безопасности организации не рассчитан на обнаружение стеганографии в медиафайлах:| Средство защиты | Что видит | Что пропускает |
|---|---|---|
| EDR (CrowdStrike, MDE) | Поведение загрузчика при извлечении payload | Сам WAV с embedded payload |
| Network DLP | Факт скачивания, метаданные | Payload внутри аудиоданных |
| Антивирус (сигнатурный) | PE/shellcode в открытом виде | Зашифрованный payload в LSB |
| SIEM | Сетевые события (DNS, HTTP) | Нет правил для анализа энтропии файлов |
| Sandbox | Исполняемые файлы | WAV не запускается - sandbox его не анализирует |
Для пентестера это означает: WAV-стеганография - рабочий covert channel в средах с modern EDR (Elastic 8.x, CrowdStrike, SentinelOne), при условии, что загрузчик на хосте уже прошёл начальный детект. Beacon-периодичность маскируется под скачивание медиаконтента.
Для blue team ключевой вектор детекта - не анализ содержимого WAV (это дорого и при зашифрованном payload ненадёжно), а поведенческие индикаторы:
- Регулярное скачивание WAV одинакового или близкого размера с одного источника (SIEM-корреляция по user-agent + URL pattern)
- Процесс, который читает WAV-файл и в течение 60 секунд порождает дочерний процесс или исходящее сетевое соединение (EDR telemetry)
- Аномальный объём скачанных медиафайлов для конкретного пользователя или endpoint (baseline deviation)
Стеганография в аудио - одна из тех техник, про которые все знают, но почти никто не включает в модель угроз. За последние годы анализа инцидентов с covert channels я вижу устойчивый паттерн: SOC-команды строят детекшн вокруг исполняемых файлов, скриптов и сетевых сигнатур, а медиафайлы проходят сквозь мониторинг как фоновый шум. Инструменты есть - binwalk, YARA, Python-скрипты для стегоанализа доступны без ограничений. Проблема в приоритетах: аудиофайлы не попадают в scope, потому что «это же просто музыка».
И проблема глубже. Даже если добавить энтропийный анализ в file inspection pipeline, зашифрованный payload в LSB вы не поймаете статистикой. Спектральный анализ каждого WAV в потоке - нереалистичная задача для организации, где через прокси проходят тысячи медиафайлов в день. Единственный масштабируемый подход - поведенческий: не пытаться детектить обфускацию вредоносного кода в файле, а ловить аномалии в том, что происходит после скачивания. Процесс прочитал WAV и полез в сеть? Это уже alert. Но для этого нужно перестроить корреляционные правила, а не просто добавить ещё одну YARA-сигнатуру в сканер.
Подозреваю, что в ближайшие пару лет мы увидим рост стеганографических каналов не только в WAV, но и в видео, подкастах, стримах. Генеративные модели уже создают синтетический аудиоконтент с идеальным спектром - готовый покровный файл для payload, который не перехватит ни один WAF. Попробуйте прогнать свои SIEM-правила через описанный выше сценарий: endpoint скачивает WAV, через минуту - исходящее соединение. Если алерт не прилетит - у вас та же слепая зона, что и у 90% SOC-команд. На WAPT эту цепочку - от встраивания payload до поведенческого детекта - проходят в модулях по covert channels с лабами.