ENGAGEMENT · CLOSED --:--:-- UTC
// E N G A G E M E N T   B R I E F //

VIDEO-SHOPER

video-shoper.ru · 2026-05-06
full-scope · owner-granted · responsible disclosure · @exreddit / ПАСТЫРЬ
1Critical
1High
11Medium
7Low
22узла
>> две двери в коридоре

CRITICAL ПЕРВАЯ ДВЕРЬ · соседские ключи

>> в магазине у каждой корзины ключ открывает любую соседнюю

Магазин думает что у каждого покупателя своя корзина. На деле ключи от всех корзин лежат на одной общей полке, и подходят к любой двери — без вопроса «чей это ключ?», без печати, без печати на печати. Я могу взять ключ номер семь — и открыть корзину номер семь. Потом восемь. Потом двадцать.

Дверь даже не требует, чтобы рядом стоял настоящий покупатель. Можно идти по коридору самому, перебирая номера на табличках, и в каждой третьей-пятой двери действительно кто-то сейчас собирает чей-то заказ. Содержимое чужой корзины я могу обнулить, удвоить, отложить «на потом» — настоящий покупатель увидит это только когда придёт к кассе. И уйдёт.

Второй сценарий — ещё тише. Достаточно подсунуть жертве в любом форуме невидимую картинку, ссылающуюся на нужный номер двери. Браузер жертвы послушно несёт её ключ в эту дверь. Жертва ничего не нажимает. Просто открывает страницу. Корзина перед её носом — пустеет.

>> impact  ·  массовая дестабилизация конверсии магазина · конкурент может перебрать корзины перед чёрной пятницей и заказы исчезнут перед оплатой

HIGH ВТОРАЯ ДВЕРЬ · старый журнал в незапертом подвале

>> кабинет управляющего стоит на главной улице, дверь без замка, страж по имени

Параллельно с витриной у магазина есть кабинет — управляющий ведёт там переписку с менеджерами, заказчиками, поставщиками, клиентами. На двери кабинета вывеска со страничной книжкой: «открыто всем». Дверь действительно открыта; за ней пустая прихожая со стойкой регистрации, и регистратор тебя пропускает только если назвал правильный пароль.

Журнал на стойке регистратора датирован летом позапрошлого года. С того времени вышло двадцать два месяца обновлений безопасности — ни одна из латок не приклеена. За эти месяцы стало известно, как нескольким подобным управляющим перерезали горло одним и тем же ножом — и это всё актуально для этого журнала. А страж стойки вдобавок откликается на имя «администратор» — я могу убедиться, что он живой и работает, не зная пароля. Просто называю имя — и стойка моргает в ответ.

Подвал кабинета — отдельная история. Несколько служебных дверей внутри (откуда управляющий обычно делает резервные копии, сбрасывает базы, запускает технические команды) тоже выходят на главную улицу. Не во двор. Не во внутренний коридор. На улицу. Достаточно, чтобы пароль протёк через одного клиента — и любой посторонний, зная имя стража, ставится у управляющего стула.

>> impact  ·  один украденный пароль = вся клиентская база магазина в чужих руках · персональные данные покупателей под законом
>> одиннадцать щелей в стенах

MEDIUM · 11 полу-прозрачные стены

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

Разговорчивая дверь. На входе кабинета управляющего страж по-разному отвечает на «знакомое» и «незнакомое» имя. По этой разнице любой посетитель может за пару минут собрать список реальных сотрудников — и пойти с этим списком в очередь к фишинг-почтальону.

Бесконечный коридор подписки. Бланк «подпишите меня на новости» принимает любой адрес — без капчи, без подтверждения, без счётчика. Я могу подписать тысячу чужих живых адресов от имени магазина: они начнут получать рассылку, отметят её как спам, и почтовые провайдеры понемногу перестанут пропускать настоящие письма магазина — даже подтверждения заказов своим клиентам.

Магическое письмо без печати. Через почтовую улицу я могу отправить письмо с адресом магазина в графе «отправитель» — и оно дойдёт до клиентов магазина в обычный ящик. Печати, которая отделила бы настоящий магазин от подделки, нет; та печать, которая есть, нанесена «временной краской» — не считается. Идеальное оружие для рассылки от чужого имени.

Старый журнал внутреннего хода. На служебной двери магазина случайно оставлено окошко в журнал отладки. Если по нему стукнуть, в окошко вылетает страница с именем учётной записи на хостинге, абсолютным путём до файлов и записью о том, что журнал отладки в магазине включён в боевом режиме. Любой будущий промах в любом модуле — теперь будет так же выпадать в окошко.

Эхо в подсобке. В кабинете управляющего у служебных дверей вместо вежливого «вход воспрещён» — длинный технический рассказ: какие классы куда вызываются, какие файлы где лежат, как устроены внутренние ходы. Чужак записывает план дома без единого взлома.

Зеркало без шторы. Куки, по которым магазин узнаёт постоянного покупателя, ездят без печати «только по защищённому каналу». На незащищённом Wi-Fi достаточно поймать первый запрос — и личность покупателя в моих руках. И ещё: входной коврик «от шифрованной двери» (HSTS) лежать не положили — хотя дом давно переехал в шифрованный квартал.

Открытое второе крыло дома. У магазина рядом с витриной стоит точно такой же дом-двойник под вывеской «черновик». Двойник работает на свежей конструкции (другая версия фундамента), показывает почти ту же продукцию, и доступен любому прохожему. Табличка «не входить, я в ремонте» — только для поисковиков. Реальные посетители проходят свободно.

Бумажный замок над комодом. Сторожевой жетон, по которому магазин принимает «свой» запрос (тот самый, что обычно требует входа), выдаётся прохожему по запросу — без лица, без имени. Сам по себе жетон ничего не открывает, но любая будущая трещина в стенах превращается из сложной — в готовый рецепт.

Разговор через стену. Бланк обратного звонка пропускает в поле «как вас зовут» оформление — жирным, ссылкой, фразой. Менеджер, открывающий заявку, видит активную ссылку с надписью «нажмите здесь срочно» — и нажимает её привычным движением. Канал доверия между клиентом и магазином открыт в обе стороны.

Скидочный код-оракул. Витринная форма «введите промокод» на каждый ввод честно отвечает «такого нет» / «такой есть, но не подходит». По этой разнице можно перебрать чужие маркетинговые кампании, скрытые акции дилеров, дни-рождения партнёрств — и выбрать самую выгодную из не-предназначенных мне.

Тихий обрыв счёта. Когда я кладу в корзину очень странное количество (отрицательное, или лопающее память), магазин молча превращает его в «один». Без ошибки, без подтверждения, без записи в журнал. Корзина у клиента может тихо измениться, и никто не узнает — ни клиент, ни кассир.

LOW · 7 скрипы под полом

Семь мест, где дом поскрипывает не опасно, но громко.

Подпись на воротах — у входа на витрину и в кабинет управляющего сидят две таблички с уникальным цеховым клеймом владельца. По нему любой прохожий, увидев такое же клеймо на другом доме в другом квартале, понимает, что хозяин тот же.  ·  Старая бирка двери. На служебной двери задней стороны магазина прибита версия инструмента — и она уже не самая свежая. Маленький сигнал «дом давно не чинили» для следующего ходока.  ·  Ворота без печати. Вокруг участка магазина не очерчен список цехов, которым разрешено выпускать табличку «это наш магазин». Любая мастерская в стране может — теоретически — изготовить такую табличку и повесить рядом.  ·  Эхо имени класса. Внутренняя плотницкая терминология у магазина проступает на витрине через служебные ответы: «такой-то класс не нашёл такой-то метод». Прохожий видит чертёж внутреннего стола.  ·  Карта служебного крыла. У одного из складов (где хранятся подписи к загруженным файлам) можно за серию аккуратных стуков составить полную карту того, что в нём вообще можно делать — без входа.  ·  Не та надпись на двери. На некоторых служебных дверях вместо честного «вы не вошли» висит «такой комнаты нет». Внешне разница ничтожна, но автоматический ходок (поисковик, аудитор) пропускает дверь — а живой ходок замечает несоответствие и идёт глубже.  ·  Тихая комната без таблички. У одной из служебных ниш ответ — пустой холст: ни «вход воспрещён», ни «нашлось», ни «не нашлось». Просто тишина с отметкой «свой». Сама по себе ниша безвредна; но факт «магазин обрабатывает запрос и ничего не говорит» — ориентир для следующего захода.

INFO · 1 ambient noise

Один пункт «не дыра, но лишний шум». В одной из служебных ниш мобильного приложения запрос обрабатывается, ничего не возвращает, и не закрывает себя как «нельзя». Тихий компонент — материал для завтрашней атаки, не сегодняшней.

>> неровный шаг — прозрачно

INCIDENT я споткнулся в коридоре

На подтверждении первой двери — соседских ключей к корзине — я перебрал двадцать дверей подряд и тронул четыре корзины живых покупателей. Поставил в них «один» — и не знаю, что стояло до. Это было больше, чем я планировал.

Об этом сразу — владельцу магазина: четыре номера, время до минуты, готовая процедура восстановления (запрос к резервной копии и обратная подстановка количества). Бэкапы у магазина были на руках до начала engagement'а, выкатывание не катастрофично — но прозрачность важнее. Пастырь не прячет след собственной ноги.

После этого пробы перешли только на корзины, которые я создавал сам, и на номера, зарегистрированные за моей сессией. Дальнейших чужих корзин — ноль.

>> что отдано хозяину  ·  список четырёх номеров · точное время · SQL для восстановления · текст письма для извинений перед каждым из четырёх клиентов
>> как я шёл
[01]SCOPEENFORCED
scope := owner_ACL · за черту не шагну даже если дверь открыта
[02]NO_HARMVERIFIED
read_only := default · 0 destructive RCE · 0 db.drop() · 0 follow-ups в чужую машину
[03]RATE_LIMIT≤ 5 RPS
throttle ≤ 5 req/s · дыхание тише фонового трафика · sleep между пробами
[04]PROOF_ROWN = 1
один шард доказательства на класс утечки · остальное оставлено в тени
[05]PII_REDACT3-CHAR
first_3_glyph only · остальное null-ified · PII не покидает мою машину
[06]NO_REAL_EMAIL0 SENT
form_submit(real_email) = 0 · ни один живой покупатель не получил от меня письма
[07]NO_PIVOTBLOCKED
lateral := deny · соседи по хостингу не тронуты · только арендатор-витрина
[08]REPRODUCIBLELIVE
$ curl → copy → paste → ты увидишь то же · not theory, not claim, not screenshot
[09]INCIDENT_OWNDISCLOSED
brute_overshoot ≠ scope · 4 корзины тронуты · хозяин уведомлён той же минутой · recovery handed off
[10]CART_OWNSELF
target_cart := me · после incident — пробы только на собственных корзинах
ПАСТЫРЬ
white-hat · responsible disclosure · no third-party sale
engagement opened · 2026-05-06 · closed · 2026-05-06
signed · @exreddit / ПАСТЫРЬ · private commission · responsible disclosure
<< HOME ALL DISCLOSURES >>