Вступление: сначала нацельте его на себя
Нацельте REA на своё приложение раньше, чем кто-то другой разберёт его на части. Мы запустили его на нашем живом сайте из одноразовой облачной песочницы, исправили найденное и отправили pull request.
REA - это навык реверс-инжиниринга, который целая волна видео направляла на чужой софт. На нашем сайте ему понадобилось меньше тринадцати минут и ни одного запроса на запись, чтобы показать: любой сайт мог наполнить нашу рассылку адресами. Ещё он нашёл дневной лимит нашего бота для комментариев прямо внутри JavaScript, который скачивается с нашего сайта. После исправления запрос, который раньше проходил, отклоняется.
Итог - шесть правил, как провести такой же аудит своего приложения: одноразовая песочница, точная цель, сортировка находок, конфиг в вашем бандле, тормоза на эндпоинтах и проверка исправления.
Что такое REA и как его установить
REA расшифровывается как Reverse Engineer Anything: набор инструментов, с помощью которого Claude Code разбирает приложение, которое вы выпускаете. Реверс-инжиниринг - это выяснение того, как что-то устроено, по готовому изделию, как механик читает автомобиль без заводских чертежей.
Вместо исходного кода REA читает бандл, то есть JavaScript, который ваш сайт на самом деле отправляет каждому посетителю. Из этого бандла он составляет список маршрутов, эндпоинтов, которые вызывают ваши страницы, и всего, что вы случайно там оставили. Исходный код он вам не вернёт: вы получаете только свидетельства, и в его собственной документации сказано, что это тоже не песочница.
Чтобы установить его:
- Установите REA из официального пакета и зафиксируйте версию, потому что за одну неделю вышло шесть релизов.
- Запустите его настройку для Claude Code.
- Включите компактный профиль, потому что в вашу сессию загружается заметно больше сотни инструментов.
- Ставьте только из официального репозитория, потому что поддельные копии с вредоносным кодом уже ходят по сети.
Когда мы выполнили установку в нашей песочнице, агент сначала проверил, что пакет ведёт на официальный репозиторий, и только потом что-то тронул. Настройка установила навык, но не сервер инструментов, поэтому Claude Code просто использовал консольные версии тех же инструментов REA. Если после настройки инструменты не появились, перезапускать ничего не нужно: вызовите те же шаги из терминала.
Правило 1: запускайте там, где он не навредит
Первое правило - о том, где запускать. Вы собираетесь позволить агенту управлять браузером и запускать скачанные инструменты против вашего боевого приложения. На ноутбуке этот агент находится рядом с вашими ключами, другими проектами и всеми аккаунтами, в которые вы вошли. В собственных заметках REA по безопасности это сказано прямо: это не песочница.
Песочница - это одноразовая машина: что бы ни пошло не так, это останется внутри, и вы её удалите. Откройте одноразовую песочницу на своём репозитории и проведите весь аудит там, никогда на собственной машине.
Мы использовали Kosuke, который запускает Claude Code на вашей собственной подписке внутри одноразовой облачной машины. Вы выбираете репозиторий, говорите deploy-агенту, как запускается приложение, и получаете превью, ссылку, по которой показывается ваше работающее приложение. У каждого чата своя ветка, то есть своя копия кода, и заканчивается он pull request. Когда мы импортировали наш сайт, агент сам установил менеджер пакетов и headless-браузер, измерил память и выбрал размер машины. Через несколько минут наш настоящий сайт работал рядом с чатом, в ветке, которой никто больше не касается.
Одна ловушка из более раннего теста: свежее приложение на Next.js появилось в превью, но на странице ничего не реагировало. Исправление - одна строка в конфиге Next, разрешающая адрес превью, и страница оживает.
Ограничение в том, что это тот же Claude Code, только в коробке, поэтому локальная виртуальная машина или контейнер справятся не хуже. Важна коробка, а не бренд.
Раскрытие информации: Kosuke дал нам бесплатный доступ к своему топовому тарифу. Введите код AIDIVE2026 в поле «Promo code» сразу после регистрации и получите кредиты на тридцать долларов вместо обычных десяти.
Правило 2: один точный URL, все записи заблокированы
Второе правило - что именно вы говорите REA. Если просто написать «проверь моё приложение», навык REA остановится и спросит, какое приложение.
REA также никогда сам не открывает браузер, поэтому вы запускаете его с портом отладки: это дверь, через которую инструмент видит всё, что делает страница. Настройте в таком порядке:
- Держите порт отладки на loopback, адресе, доступном только вашей машине, и дайте браузеру чистый профиль.
- Заблокируйте все запросы на запись до загрузки любой страницы, чтобы аудит мог читать ваш сайт, но не мог отправить форму или что-то изменить.
- Только после этого дайте REA точные страницы, которые он должен прочитать.
В нашем промпте мы назвали две страницы нашего бесплатного клуба и написали одно правило простыми словами: никогда не отправлять запись на живой сайт. Это было важно, потому что форма на этих страницах питает настоящую рассылку с настоящими людьми. Агент отнёсся к правилу серьёзно и написал собственный небольшой фильтр, который пропускал чтение и останавливал всё остальное. За время аудита этот фильтр остановил шесть попыток от скрипта аналитики, и ни один запрос не дошёл до нашей формы подписки.
Затем REA сделал свою часть: осмотрел каждую страницу, прочитал каждый бандл, сделал скриншоты и выгрузил скрипты за пределы репозитория.
Ограничение в том, что REA видит только то, что загружается, пока он подключён, поэтому всё, что произошло раньше, остаётся в отчёте неизвестным. Но теперь у вас есть отчёт о вашем собственном живом приложении, составленный без прикосновения к его данным.
Правило 3: отсортируйте все находки, прежде чем чинить
Третье правило: сначала сортируйте, потом чините. Такой отчёт полон тревожных строк, и вам захочется исправить всё сразу.
Навык REA требует, чтобы каждый вывод был помечен как наблюдение, вывод по косвенным признакам или неизвестное, с идентификатором свидетельства. Это то, что он увидел, то, что он предположил, и то, что он увидеть не мог, а идентификатор свидетельства - это квитанция, которую можно проверить. Сначала отсортируйте так каждую находку, глядя только со стороны постороннего, и зафиксируйте эту версию в коммите, прежде чем открывать хоть один исходный файл. Затем прочитайте исходный код и пометьте каждую строку: настоящая утечка, так задумано или ложное срабатывание.
В нашем отчёте было пятнадцать находок:
| Находка | Что увидел REA | Наш вердикт |
|---|---|---|
| Эндпоинт подписки | Нет ни лимита, ни проверки, какой сайт его вызывает, поэтому любой сайт мог заставить браузер посетителя подписать любой адрес на нашу рассылку | Настоящая утечка, худшая из всех |
| Email-гейт на бесплатных паках | Весь пак уже лежит в загружаемой странице; одна строка в консоли браузера убирает гейт, а режим чтения показывает текст | Так задумано |
| Source maps, ключи, cookies | Ничего в бандлах, нигде нет cookies | Хорошая новость |
Гейт сделан намеренно, потому что паки бесплатны специально, а наш собственный код гласит, что сломанная форма никогда не должна скрывать бесплатную страницу.
Ограничение - колонка неизвестного. REA не видит, что делает ваш сервер, поэтому эти строки вы закрываете чтением серверного кода.
Правило 4: ваш бандл несёт ваш конфиг
Четвёртое правило - о том, что несёт ваш бандл, потому что один общий файл настроек может доехать до каждого посетителя без вашего ведома.
Вот как это происходит. Вы импортируете конфиг в одном помощнике, а этот помощник используют два небольших интерактивных компонента. Сборщик, инструмент, который упаковывает ваш код в файлы, скачиваемые браузером, не может понять, какие ключи им нужны, и отправляет все.
Именно это REA нашёл в нашем JavaScript. Весь конфиг нашего сайта лежал в одном файле: идентификатор нашей рассылки, наши папки сборки и лимиты бота, отвечающего на комментарии под нашими видео. Там было даже сказано, сколько ответов этот бот отправляет в день, сто, и сколько ошибок включают его предохранитель. Два компонента, которые его подтянули, читали только название сайта и список языков.
Правило: поищите в отправляемом JavaScript собственные ключи конфига и давайте клиентским компонентам только те поля, которые они читают. В нашей песочнице агент разделил конфиг на крошечную браузерную версию с этими полями, а остальное осталось на сервере. Он также добавил шаг сборки, который падает, если серверный ключ снова окажется в отправляемом файле, так что откатиться назад не получится.
Ничто из этого не было паролем, но всё, что лежит в таком файле, публично, поэтому ваши секреты должны жить только в серверных переменных.
Правило 5: у каждого открытого эндпоинта есть тормоз
Пятое правило исправило нашу настоящую утечку, и оно применимо всегда, когда у вас есть публичная форма, вызывающая платный сервис: ваш список рассылки, ваша модель ИИ или ваш шлюз текстовых сообщений. Вы вызываете его через крошечную серверную функцию, написанную за один вечер. Наша принимала email и передавала его прямо в рассылку, и любой другой сайт мог заставить браузер посетителя отправить ей запрос.
Собственный чеклист мира безопасности говорит об этом прямо: ваш контроль доступа работает только в коде, который злоумышленник не может изменить, то есть на вашем сервере. Поэтому поставьте тормоза на каждый такой эндпоинт:
- Проверка Origin. Заголовок Origin - это штамп, который браузер ставит на запрос, чтобы указать, какой сайт его отправил, поэтому форма на чужом сайте получает отказ.
- Rate limit. Ограничение на число запросов, которые один посетитель может отправить за короткий промежуток.
- Согласие, проверяемое на сервере. Галочка, которую вы ставите, действительно едет вместе с запросом.
В нашей песочнице агент записал все три в наш Worker, небольшую функцию, которая работает перед вашими страницами, когда вы их открываете. Затем он проверил их на поддельном почтовом сервисе, никогда на настоящем, и каждый запрос был отклонён ровно там, где нужно. Отправка с чужого сайта отклоняется. Ваш шестой запрос за минуту тоже отклоняется, а без согласия вас отвергают.
Ограничение в том, что скрипт может подделать штамп Origin, а rate limit считает по расположению, поэтому настоящее решение для этого - двойное подтверждение по email.
Правило 6: запустите снова, проверьте вручную, отправьте PR
Шестое и последнее правило - доказать исправление, потому что стена зелёных галочек - как раз тот момент, когда вы перестаёте смотреть. Один разработчик, протестировавший REA на десктопном приложении, написал на HackerNoon, что тот пропустил точки входа, которые в приложении действительно были.
Поэтому запустите те же шаги REA ещё раз на исправленной сборке, проверьте каждое исправление вручную из терминала и только потом откройте pull request.
На исправленной сборке запрос, который раньше проходил через нашу форму подписки, отклоняется. Наших серверных ключей не было ни в одном отправляемом файле, заголовки безопасности были на месте, а тесты Worker перешли из падающих в проходящие. Гейт на наших бесплатных паках остался открытым, как мы и решили, и отчёт говорит об этом рядом с каждой строкой.
Затем агент открыл pull request. Отчёты в нём есть только потому, что мы попросили об этом в промпте. Чеклист тестирования, который строит Kosuke, остался внутри сессии, и в самом pull request ничего не опубликовано. Если ваш ревьюер читает только GitHub, добавьте отчёты до и после в pull request сами.
Затем мы перенесли то же изменение в наш собственный код, и оно выйдет вместе со следующим деплоем нашего сайта.
Вердикт: когда нацеливать REA на себя
Весь прогон - это REA, нацеленный на наш живой сайт из одноразовой песочницы, каждая находка отсортирована, настоящие утечки исправлены, аудит проведён заново и отправлен как pull request. Находка, которая всё оправдала, была первой: любой сайт мог наполнить нашу форму подписки чьими угодно адресами.
Проводите этот аудит перед запуском всего, у чего есть публичная форма или платный сервис за спиной, и снова всякий раз, когда меняете то, что выходит в мир. Не запускайте его на софте, который вам не принадлежит, потому что собственный дисклеймер REA ограничивает его софтом, которым вы владеете или который вы вправе исследовать. И он никогда не заменяет чтение серверного кода, потому что именно там живут неизвестные.
Если запомнить одно правило, пусть это будет это: запускайте на себе, в коробке, и чините только то, что отсортировали.
Точный промпт, таблица сортировки и исправление Worker, которое мы выпустили, лежат в бесплатном наборе к этому видео.
AIDive