ESCalator
7.44K subscribers
558 photos
3 videos
18 files
226 links
Tips and tricks от команды экспертного центра безопасности Positive Technologies (PT ESC)
Download Telegram
Почему IDA не сворачивает константы и как это исправить 👨‍💻

В последнее время в ВПО все чаще встречается обфускация, где константы заменяют на арифметические выражения. Подобный прием, например, есть в OLLVM.

😑 В чем тут проблема: часть констант, из которых собирается итоговое выражение, хранится в памяти. Из-за этого IDA по умолчанию не может нормально применить constant propagation и автоматически «свернуть» такие конструкции в исходные значения (скриншот 1).

Особенно неприятно, когда таким способом маскируют еще и адреса вызываемых функций. На практике это выливается в конструкции вида:

mov   <reg>, <const>
add <reg>, cs:<offset_*>
call <reg>


Для статического анализа это, конечно, лишняя головная боль 🧱

Но есть нюанс: если явно указать, что данные по адресу cs:<offset_*> — это константные qword/dword, то во время декомпиляции IDA сама подтянет значение из памяти, пересчитает выражение и свернет его обратно в исходную константу.

Перед тем как явно проставлять таким данным const, стоит убедиться, что значение действительно readonly. Один из простых способов — посмотреть на перекрестные ссылки: если все обращения к адресу идут только на чтение, то это хороший кандидат на const (скриншот 2).

Заодно полезно отфильтровать значения, которые на самом деле являются указателями, чтобы не испортить типизацию (скриншот 3).

😎 Все это можно автоматизировать небольшим IDAPython-скриптом (IDA 9.0+), который проходит по сегменту .data (или любому другому нужному сегменту), находит значения, используемые только на чтение, исключает те, что похожи на адреса, и явно проставляет им const byte/word/dword/qword в зависимости от размера.

В результате псевдокод становится заметно чище и понятнее (скриншот 4).

#tips #reverse
@ptescalator (X, Max)
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👏8👍61
ESCalator
Почему IDA не сворачивает константы и как это исправить 👨‍💻 В последнее время в ВПО все чаще встречается обфускация, где константы заменяют на арифметические выражения. Подобный прием, например, есть в OLLVM. 😑 В чем тут проблема: часть констант, из которых…
А вот и этот IDAPython-скрипт:

import ida_bytes
import ida_segment
import ida_typeinf
import idautils
import ida_xref
import idaapi
from collections import namedtuple

PTR_SIZE = 8 if idaapi.inf_is_64bit() else 4


TypeInfo = namedtuple('SizeInfo', ['get_data', 'typename', 'badaddr'])

SIZE_TO_TYPE_INFO_MAP = {
1: (TypeInfo(ida_bytes.get_byte, "byte", 0xFF)),
2: (TypeInfo(ida_bytes.get_word, "word", 0xFFFF)),
4: (TypeInfo(ida_bytes.get_dword, "dword", 0xFFFFFFFF)),
8: (TypeInfo(ida_bytes.get_qword, "qword", 0xFFFFFFFFFFFFFFFF))
}


def apply_const_type(ea: int) -> bool:
flags = ida_bytes.get_flags(ea)
if not ida_bytes.is_data(flags):
return False

item_size = ida_bytes.get_item_size(ea)
type_info = SIZE_TO_TYPE_INFO_MAP.get(item_size)
if type_info is None:
return False

if type_info.get_data(ea) == type_info.badaddr:
return False

typeinfo_str = "const " + type_info.typename
tif = ida_typeinf.tinfo_t(typeinfo_str)

ida_bytes.clr_op_type(ea, 0)
return ida_typeinf.apply_tinfo(ea, tif, 1)


def is_addr_readonly(target_addr: int) -> bool:
flags = ida_bytes.get_full_flags(target_addr)
return ida_bytes.has_xref(flags) and \
all(ref.type == ida_xref.dr_R for ref in idautils.XrefsTo(target_addr))


def apply_const_type_if_readonly(target_addr: int) -> bool:
return apply_const_type(target_addr) if is_addr_readonly(target_addr) else False


def data_is_offset(ea:int) -> bool:
item_size = ida_bytes.get_item_size(ea)
if item_size != PTR_SIZE:
return False

type_info = SIZE_TO_TYPE_INFO_MAP.get(item_size)
if type_info is None:
return False

value = type_info.get_data(ea)
return (idaapi.getseg(value)) is not None


def main():
print("Casting readonly memory values to consts ")
print("---------------------------------")

segment_name = ".data"

seg = ida_segment.get_segm_by_name(segment_name)
if not seg:
print("No {segment_name} segment")
return

ea = seg.start_ea
fixed_consts_num = 0

while ea < seg.end_ea:
ea_size = ida_bytes.get_item_size(ea)
if ea_size <= 0:
ea += 1
continue

if not data_is_offset(ea) and apply_const_type_if_readonly(ea):
fixed_consts_num += 1

ea += ea_size

print("---------------------------------")
print(f"Done. fixed = {fixed_consts_num} consts")
print("Decompile again to view results: F5")


if __name__ == "__main__":
main()


#tips #reverse
@ptescalator (X, Max)
👍15🤯8🔥52😁2
Please open Telegram to view this post
VIEW IN TELEGRAM
🤡8😁73🔥3🌭1
Copy.Fail 🐧

Исследователи обнаружили баг в ядре Linux, который существовал в системах с 2017 года и затрагивает практически все дистрибутивы.

Уязвимость CVE-2026-31431, которую мы считаем трендовой, состоит из четырех шагов:

1️⃣ Пользователь открывает сокет AF_ALG и инициализирует AEAD-алгоритм без привилегий;

2️⃣ Через splice() страницы кэша целевого файла попадают в буфер операции;

3️⃣ Ошибка в authencesn дает запись 4 байт за границы буфера прямо в страницы кэша;

4️⃣ Ядро исполняет модифицированный setuid-файл из кэша → выполнение кода с правами root.

Данная цепочка уязвимости частично схожа с Dirty Pipe (CVE-2022-0847), которая также использует системные вызовы:

pipe — создает однонаправленный канал передачи данных;

splice — позволяет передавать данные между файловыми дескрипторами без промежуточного копирования.

Так как данная уязвимость уже обнаруживалась в PT Sandbox при анализе ПО в образе Astra Linux, процесс эксплуатации новой уязвимости Copy Fail также обнаруживалась в PT Sandbox еще до выхода публичного эксплойта.

Благодаря этому эксплойту можно перезаписывать не только suid-файлы, но и проводить другие модификации, делая системные изменения более скрытными.

Как исправить 🔧

Если вы администрируете Linux-системы — обновите ядро. Патч зафиксирован в коммите a664bf3d603d. Основные дистрибутивы начали выпускать исправленные пакеты с 29 апреля. После обновления потребуется перезагрузка.

Если немедленное обновление невозможно — временная мера: отключить модуль algif_aead:


echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf

rmmod algif_aead 2>/dev/null


#cve #tip
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👍9🆒64👎1🤮1
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚12🔥6💔4👨‍💻2
Группа киберразведки PT ESC представила обзор кибератак за I квартал 2026 года ✍️

В отчете проанализирована активность хакерских группировок, нацеленных на российские организации: от госсектора и ВПК до финансов, промышленности и телекоммуникаций.

Описана активность шпионских группировок Rare Werewolf, PhaseShifters, PhantomCore, Goffee, IAmTheKing, Tolik, BO Team, а также финансово мотивированных Hive0117 и Fluffy Wolf.

✉️ Основные векторы первоначального доступа:

Таргетированный фишинг с легендами деловой переписки
Запароленные архивы с LNK-ярлыками, NSIS-инсталляторами с двойным расширением .pdf.exe, HTA-, XLL-, RTF- и SFX-файлами
Эксплуатация уязвимостей в клиентском ПО
Рассылки со скомпрометированных почтовых ящиков для обхода репутационных фильтров

Ознакомиться с отчетом можно в нашем блоге.

#TI #APT #Malware #Phishing
@ptescalator (X, Max)
Please open Telegram to view this post
VIEW IN TELEGRAM
16👍16🔥9
😁11👀9👍3
Dirty Frag 🐧💥

Спустя неделю после нашумевшего Copy.Fail исследователь v4bel раскрыл новую технику повышения привилегий в ядре Linux — Dirty Frag.

По состоянию на 8 мая у Dirty Frag нет CVE-номера и, что более критично, официального патча от мейнтейнеров ядра тоже нет. Dirty Frag относится к тому же классу, что Dirty Pipe и Copy.Fail, но использует другой механизм: вместо pipe_buffer атакуется структура sk_buff.

Общие механизмы работы позволяют надежно блокировать эксплойт поведенческой экспертизой в PT Sandbox (Exploit.Linux.CVE-2022-0847.a, Exploit.Linux.CVE-2026-31431.a, Backdoor.Linux.Generic.a) — смотрите на скриншоте.

Как это работает? 🧐

Dirty Frag — это цепочка из двух уязвимостей, которые дополняют друг друга, чтобы охватить все основные дистрибутивы:

1️⃣ Page-Cache Write (с 2017 года): предоставляет возможность для записи 4 байт в кэш страниц, но требует права на создание пользовательских пространств имен, что в некоторых системах (например, Ubuntu) может блокироваться AppArmor.

2️⃣ RxRPC Page-Cache Write (с июня 2023 года): не требует прав на пространства имен, но модуль rxrpc.ko присутствует только в некоторых дистрибутивах, включая Ubuntu, где он загружен по умолчанию.

Объединив их, атакующий получает рабочий эксплойт на любой системе, что позволяет:

• Подменить suid-файлы (например, /usr/bin/su) на свою версию
• Изменить /etc/passwd, очистив пароль root-пользователя

Кто под угрозой? ⛳️

Практически все системы с ядром Linux, выпущенные с 2017 года. Исследователь подтвердил работу эксплойта на следующих версиях: Ubuntu 24.04.4, RHEL 10.1, openSUSE Tumbleweed, CentOS Stream 10, AlmaLinux 10, Fedora 44 и других.

Как защититься? 🔧

Так как официального патча от мейнтейнеров ядра пока нет, единственный способ защиты — немедленно отключить и выгрузить уязвимые модули ядра.

Команда для отключения:

sh -c "printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' > /etc/modprobe.d/dirtyfrag.conf; rmmod esp4 esp6 rxrpc 2>/dev/null; true"


Некоторые дистрибутивы (например, AlmaLinux) начали выпускать собственные патчи, не дожидаясь апстрима.

UPD: уязвимость получила идентификатор — CVE-2026-43284, патч добавлен в код ядра (f4c50a4034e6).

#avlab #cve #linux #sandbox
@ptescalator (X, Max)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥109👍6
Please open Telegram to view this post
VIEW IN TELEGRAM
😁122👍2👎2🤡2🔥1🎄1