В Мос­кве 21 и 22 августа прош­ла шес­тая кон­ферен­ция по прак­тичес­кой кибер­безопас­ности OFFZONE. Она вновь объ­еди­нила под одной кры­шей хакеров, раз­работ­чиков, биз­несме­нов и про­чих нерав­нодуш­ных к инфо­секу людей. Сегод­ня вспом­ним, как про­ходил ивент, и раз­берем пять док­ладов, которые показа­лись нам наибо­лее инте­рес­ными.

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 уго­щал жела­ющих вкус­ным кофе с печень­ем.

И это лишь малая часть орга­низо­ван­ных активнос­тей!

Спавн конкурса «Hack in 15 min». Самые внимательные увидят на фото сок и бутылку текилы
Спавн кон­курса «Hack in 15 min». Самые вни­матель­ные уви­дят на фото сок и бутыл­ку текилы

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

Обычно я много шучу, но про татуировки я пишу вполне серьезно. Смотри фото!
Обыч­но я мно­го шучу, но про тату­иров­ки я пишу впол­не серь­езно. Смот­ри фото!
Ес­ли набь­ешь логотип OFFZONE, то обес­печишь себе бес­плат­ные про­ход­ки на эту кон­ферен­цию в будущем. Котики и сер­дечки такого сущес­твен­ного бонуса не при­носят, зато выпол­няют­ся про­фес­сиональ­ными тату‑мас­терами. «Hack in 15 min» — хакер­ская вер­сия PvP: на взлом дают пят­надцать минут и налива­ют алко­голь.
Доктор ENZO высматривает сбежавших пациентов. Шучу, высматривает багхантеров
Док­тор ENZO выс­матри­вает сбе­жав­ших паци­ентов. Шучу, выс­матри­вает баг­ханте­ров

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

Илья показывает, как выглядят ачивки в реальной жизни
Илья показы­вает, как выг­лядят ачив­ки в реаль­ной жиз­ни

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

info

Есть мне­ние, что через пару лет наг­нать лор мероп­риятия будет весь­ма зат­рудни­тель­но, так что не ленись и начинай вни­кать в него уже сей­час.

Медвежатница за работой
Мед­вежат­ница за работой

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

 

Доклады

Клю­чевым док­ладчи­ком OFFZONE 2025 стал Евге­ний Кас­пер­ский, рас­ска­зав­ший слу­шате­лям про «киберим­мунитет для циф­ровой эры».

Евгений Касперский открыл OZ 2025 своим выступлением
Ев­гений Кас­пер­ский открыл OZ 2025 сво­им выс­тупле­нием

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

Анна призывает багхантеров не стесняться и иногда работать ручками
Ан­на при­зыва­ет баг­ханте­ров не стес­нять­ся и иног­да работать руч­ками

За­писи док­ладов уже любез­но под­готов­лены и опуб­ликова­ны орга­низа­тора­ми, так что выбирай любой и смот­ри. Мы тоже выб­рали пять док­ладов, о которых рас­ска­жем под­робнее.

 

Успешные ошибки: новые техники code injection и SSTI

Поч­ти десять лет не было пуб­личных сооб­щений о новых под­ходах в 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("test"). Код выведет сооб­щение об ошиб­ке: ValueError: invalid literal for int() with base 10: 'test'. Но ока­залось, что метод огра­ничи­вает дли­ну сооб­щения об ошиб­ке 199 сим­волами. Про­читать /etc/passwd не получит­ся, ответ будет обре­зан. С задачей луч­ше спра­вит­ся getattr("", "test"), у которо­го нет огра­ниче­ния по дли­не.

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 // true
strlen('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

В руки иссле­дова­телей из «Лабора­тории Кас­пер­ско­го» Алек­сан­дра Коз­лова и Сер­гея Ануф­риен­ко попал авто­мобиль­ный муль­тимедий­ный блок на 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 и добились вывода на экран собс­твен­ного сооб­щения.

Выведенное число, на самом деле это 0xaabbccdd
Вы­веден­ное чис­ло, на самом деле это 0xaabbccdd

Мо­дифи­циро­вав цепоч­ку 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

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии