Содержание статьи
- Место, билеты и тусовка
- Зоны и активности
- Доклады
- Успешные ошибки: новые техники code injection и SSTI
- Эксплуатация SoC: история Unisoc
- Как научить AI понимать контекст приложения: новый подход к поиску уязвимостей бизнес-логики в API
- GitLab + DefectDojo + AI: как я автоматизировала поиск багов в bug bounty
- Ложь инкорпорейтед: эволюция эксплоитов для ИИ (2023–2025) и надвигающиеся угрозы
- Аутро
info
О том, как конференция прошла в 2024 году, читай в статье «Отчет с OFFZONE 2024. Как я слушал доклады, дегустировал пиво и чудом не потерялся».
Место, билеты и тусовка
Гостей конференции вместил лофт GOELRO на Большой Почтовой улице в Москве. Это уютное место, оно отлично подходит под формат мероприятия (и под легенду CUB_3 заодно). Кирпичные конструкции, неон и хайтек, хакеры и временами серое небо над головой — вот и киберпанк к нам ближе, чем мы думали.

Да, входной билет стал дороже. Скачок не резкий, к тому же тем, кто покупал билет, выдали классный welcome pack. Для студентов были традиционные скидки, а для всех желающих — конкурсы, где можно выиграть проходку. Опытные же бойцы приходят с докладом и получают все заслуженные плюшки, начиная от проходки и специальных условий и заканчивая набором с мерчем и приглашением на спикер‑пати. В общем, способы проникнуть на OFFZONE есть на любой вкус.

Здания GOELRO компактные, из‑за чего временами была толкучка — как внутри них, так и снаружи. Я слышал и жалобы на очереди, но мне кажется, странно об этом говорить: толкучка и очередь — это признак того, что тусовка удалась! Сайт конференции сообщает о том, что в этом году собралось больше 2500 участников.

Зоны и активности
Для удобства посетителей пространство лофта было разделено на тематические зоны, в каждой — уникальная программа.
- Main track — главная зона конференции, на которую пришлись ключевые доклады, а также открытие и закрытие конференции.
- Fast track — стремительные доклады продолжительностью до пятнадцати минут, когда не требуется уходить в детали и раскрывать всю тему основательно.
- Threat.Zone — деловая зона, где обсуждались темы новых видов угроз и эффективной борьбы с ними.
- AntiFraud.Zone — тут обсуждали способы противодействия мошенничеству и защиты от финансовых преступлений.
- AI.Zone — зона, посвященная теме искусственного интеллекта и его применения в кибербезопасности.
- AppSec.Zone — зона с докладами про безопасность мобильных и веб‑приложений.
- Community track — зона с активностями от сообщества.

Стоит упомянуть и активности, которые подготовили организаторы и партнеры конференции, а также участники сообщества:
- «Т‑Банк» организовал лаундж‑коворкинг для отдыха и вовлечения нас в нестандартный CTF-квест. Разумеется, с призами.
- «Совкомбанк Технологии» приглашал заглянуть в их зону киберразвлечений с настольными играми с — внимание! — ИИ, квизом по кибербезопасности и CTF. Без призов также не обошлось.
- AvitoTech решил не мелочиться и организовать бар, в котором «пьют по TLS и строят доверие без уязвимостей».
- Wildberries устроили небольшое CTF-соревнование и предложили желающим порешать задачи по Universal Harvester. Самые стойкие подписались еще и на прохождение киберквестов.
- Swordfish Security не отставали от коллег по цеху, запустив свой веб-CTF, AppSec-бинго и игру «Pokémon или Security Tool?».
- Умельцы из Kaspersky соорудили свою лаунж‑зону с конкурсами и офкоинами.
- Solar, Ngenix, Metascan, Secure-T порадовали задачами, мемами, квизами, тестами и квестами. Всё с разнообразными призами.
- Curator угощал желающих вкусным кофе с печеньем.
И это лишь малая часть организованных активностей!

Не обошлось и без классики. Craft.Zone — специальная зона, где учат правильному обращению с паяльником, без всяких там шуточек. В этой же зоне, кстати, можно было сварганить себе аддон для бейджа, чем многие и занимались. Tattoo.Zone — считай, настоящий тату‑салон в рамках конференции.


На стенде BI.ZONE Bug Bounty целая команда в белых халатах (есть все же какая‑то едва уловимая связь между багбаунти и людьми в белых халатах) ждала охотников за багами, предлагая секретную ачивку на платформе, эксклюзивный мерч и, конечно же, приятное общение с перерывами на кислый мармелад.

Параллельно шли три квеста: OFFZONE-квест, квест от BI.ZONE и квест в зоне CUB_3. Все три разные, но они объединены общей концепцией, что интересно укладывается в легенду мероприятия. Успешные игроки смогли обогатиться валютой конференции — офкоинами.
info
Есть мнение, что через пару лет нагнать лор мероприятия будет весьма затруднительно, так что не ленись и начинай вникать в него уже сейчас.

Не давали заскучать и представители сообществ Lockpick (Autopsy Will Tell) и OSINT Mindset. Первые притягивали живущих под девизом «наши руки не для скуки» и теоретиков в духе «вскрыть сейф — это как два байта переслать» (спойлер — нет, это не так просто), вторые очаровывали навыками поиска всего и вся — рафинированный OSINT без границ и рамок от практиков. Интересное общение, конкурсы и задачи и, разумеется, разнообразный памятный мерч. Всё как мы любим!
Доклады
Ключевым докладчиком OFFZONE 2025 стал Евгений Касперский, рассказавший слушателям про «кибериммунитет для цифровой эры».

В этом году на семь тематических зон пришлось 99 докладов, а излагали их присутствующим более 120 спикеров. Доклады имели три уровня сложности: легкий (easy), средний (medium) и хардкор (hard), что облегчало сортировку и составление собственной программы на два дня.

Записи докладов уже любезно подготовлены и опубликованы организаторами, так что выбирай любой и смотри. Мы тоже выбрали пять докладов, о которых расскажем подробнее.
Успешные ошибки: новые техники code injection и SSTI
- Зона: main track
- Сложность: hard
- Докладчик: Владислав Корчагин
- Подробности о докладе, видео и слайды
Почти десять лет не было публичных сообщений о новых подходах в server-side template injection (SSTI). Все использовали Renderer, с прямым выводом в код ответа, и time-based blind — с определением успешности по времени задержки ответа. В 2023 году была предложена техника polyglot-based detection. Она позволяет быстро определить используемые шаблоны, но чувствительна к контексту внедрения, и ее сложно дорабатывать под новые реалии.
В своем докладе Владислав Корчагин поделился двумя новыми подходами: error-based SSTI и boolean error-based blind SSTI. Доклад построен на личном опыте, в рамках разработки собственного инструмента SSTImap.
Первые результаты автор получил в работе с JSONPath Plus. Используя prototype pollution, получилось выполнить команду id
:
const { JSONPath } = require("jsonpath-plus");const exampleObj = { example: true }const userControlledPath = "$..[?(p="console.log(this.process.mainModule.require('child_process').execSync('id').toString())";a=''[['constructor']][['constructor']](p);a())]";JSONPath({ json: exampleObj, path: userControlledPath});

Однако метод зависит от контекста. Если полезная нагрузка внедрена в конце строки, можно полностью управлять результатом и определить вывод. В других случаях, даже если сработает команда, воспользоваться данными не получится.
Развитие техника получила, когда автор тестировал конструктор ботов для Discord с функцией калькулятора. Калькулятор работал на expr-eval
с известной уязвимостью. Но получить результат напрямую не вышло, так как конструктор приводит результат к числу и не дает вывести произвольные строки. Автор попробовал адаптировать технику error-based SQL injection. Чтобы реализовать технику, надо найти сообщение об ошибке, содержащее входные данные, и вызвать эту ошибку, передав собственные данные.
Например, в Python можно попробовать привести текст к int: int(
. Код выведет сообщение об ошибке: ValueError:
. Но оказалось, что метод ограничивает длину сообщения об ошибке 199 символами. Прочитать /
не получится, ответ будет обрезан. С задачей лучше справится getattr(
, у которого нет ограничения по длине.
Error-based SSTI требует понимания языка программирования и шаблонизатора. Например, для Jira2 не сработает нагрузка с получением атрибута строки. Зато сработает такая нагрузка:
{{ cycler.__init__.__globals__.__builtins__.getattr("", "test") }}
Другой пример для PHP и Twig:
v2+: {% set body={"ls -la": "shell_exec"}|map("call_user_func")|join %}`
Автор привел много примеров для PHP, Ruby, Node.js, Java и других языков. Метод универсальный, но придется приложить усилия для выстраивания пейлоада.

Что, если сервер возвращает стандартную страницу ошибки или каким‑то другим способом мешает выводу текста ошибки? Поможет техника boolean error-based blind SST.

Техника похожа не предыдущую, но ошибку вызывать нужно, если код не выполнился. Иначе не получится отличить успешное выполнение кода от опечатки.
Автор предлагает использовать полезные нагрузки парами. Так получится отличить успешное выполнение от той же блокировки WAF. Пример парной нагрузки для PHP:
strlen('2') == 1 // truestrlen('1') == 2 // false
Пары нагрузок для Java и шаблонизатора Velocity:
#if(false)#include("Y:/A:/true")#end // OK#if(true)#include("Y:/A:/false")#end // Error// Другая пара#set($o=1.0)#if($o.equals(0.1))#include("Y:/A:/xxx")#end // OK#set($o=1.0)#if($o.equals(1.0))#include("Y:/A:/xxx")#end // Error
Доклад Владислава Корчагина показывает, что эволюция техник эксплуатации не останавливается. Даже там, где кажется, что все уже известно, можно найти новые универсальные приемы, которые делают атаки практичнее, а защиту — сложнее.
Эксплуатация SoC: история Unisoc
- Зона: main track
- Сложность: hard
- Докладчики: Александр Кoзлов, Сергей Ануфриенко
- Подробности о докладе, видео и слайды
В руки исследователей из «Лаборатории Касперского» Александра Козлова и Сергея Ануфриенко попал автомобильный мультимедийный блок на Unisoc UIS-7862A. Этот чип построен на классической схеме system-on-chip (SoC) — системе, состоящей из большого числа аппаратных компонентов, расположенных на одном кристалле.
Ключевые компоненты, подверженные уязвимостям:
- AP (application processor) — 64-битный ARM-кластер с Android;
- 32-битный CP (communication processor), отвечающий за работу с 3G/4G/5G;
- общая память для двух процессоров.
Чип можно встретить не только в головных устройствах, но и в смартфонах, планшетах и некоторых промышленных IoT-девайсах. Поэтому обсуждаемые проблемы безопасности гораздо шире, чем просто проблема в автомобиле.

Архитектура взаимодействия между компонентами — это черный ящик. Документации от вендора нет. Всё через реверс! Для начала авторы доклада считали eMMC + DDR, восстановили Android и прошивку модема.
Большой интерес вызвало модемное ядро, так как исследователи уже работали с модемами других производителей и там были серьезные проблемы безопасности.
Первая найденная уязвимость — Integer underflow в драйвере RLC. Когда с базовой станции на модем приходит несколько сообщений одним пакетом, можно подставить свои данные в идентификаторы length, вызвав переполнение Integer. В свою очередь, это приведет к переполнению кучи. Но эксплуатация уязвимости затруднена, поэтому исследователи пошли дальше.
При подключении к сети 4G производится парсинг имени сети (MCC/MNC). Программисты ошиблись и вместо 0x100 выделили под имя сети 100 байт. Исследователи подключили модем к собственной базовой станции с именем, превышающим 100 байт, и получили переполнение кучи. Уже интереснее, но пока не существенно.
У модема есть два режима работы: Acknowledged Mode (с подтверждением) и Unacknowledged (без подтверждения). Оба они практически идентичны с точностью до типа пакетов. Разница — в методе парсинга пакетов от базовой станции. Во втором режиме считывание будет происходить, пока флаг E, указывающий, есть ли еще данные, равен единице.
Можно добиться удобного stack overflow и выполнения произвольного кода. Исследователи нашли подходящую функцию для построения ROP и добились вывода на экран собственного сообщения.

Модифицировав цепочку ROP, исследователи смогли писать в защищенную область памяти MPU. В результате получилось пропатчить протокол Non-Access Stratum. Теперь система не только принимала данные, но и возвращала их в виде ошибки.
Нужно было найти способ достучаться из CP в AP. Очевидный канал — это общая память, в которой реализован ring-буфер. Тесты привели к пониманию того, что драйвер модема на уровне Android слепо доверяет данным, которые communication processor кладет в ring-буфер. Значит, есть канал передачи пейлоадов, которые будет исполнять application processor.
Чтобы код сработал, нужно захукать какой‑то системный вызов. Исследователи эвристически составили таблицу символов внутри ядра Android и получили адреса sys_call_table
, call_usermodehelper
и selinux_enforcing
. Первая функция позволила найти адрес и захукать сискол getpriority
. Вторая запускает юзермод‑процессы в Linux. Третья отключает SELinux.

Исследователи смогли написать шелл‑код, который загрузили в память AP. В качестве PoC через найденные уязвимости на устройство установили Doom и прошли на уровне Nightmare.
Как научить AI понимать контекст приложения: новый подход к поиску уязвимостей бизнес-логики в API
- Зона: AI.Zone
- Сложность: hard
- Докладчик: Руслан Махмудов
- Подробности о докладе, видео и слайды
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее