Сьогодні 1 квітня, але ця стаття — не жарт.
Цілий день я спостерігав за висвітленням "витоку" Claude Code — VentureBeat, Fortune, Gizmodo, The Register, Hacker News. 512 000 рядків! Feature flags! Системні промпти! Переписаний з нуля на Rust проєкт (щоб обійти DMCA) набрав 100K зірок на GitHub менш ніж за добу — світовий рекорд. Зараз уже 110K і далі зростає.
Вони всі помиляються. Цей код уже був публічним. На npm. Відкритим текстом. Роками. Відкрийте unpkg.com/@anthropic-ai/claude-code/cli.js прямо зараз — це весь CLI Claude Code, в один клік, прямо у вашому браузері. Ніякого витоку не потрібно.
Те, що "витекло", — це файл source map, який додав внутрішні коментарі розробників поверх коду, який і так ніколи не був захищений, плюс структуру директорій та вихідних файлів.
Що насправді сталося
Файл .map (source map) — призначений для внутрішнього налагодження — випадково потрапив у версію 2.1.88 пакету @anthropic-ai/claude-code на npm. Дослідник безпеки Chaofan Shou помітив його, написав про це на X, і інтернет зробив решту.
Anthropic підтвердили помилку: "Це була проблема пакування релізу, спричинена людською помилкою, а не порушення безпеки." Пакет було видалено, але на той момент його вже встигли скопіювати скрізь.
Найкумедніше? Це вже вдруге. Практично ідентичний витік source map стався у лютому 2025 року. Той самий продукт, та сама помилка, тринадцять місяців різниці.
Що сталося за 24 години
Те, що сталося далі, було по-справжньому вражаючим. За одну добу:
-
Дампи коду з'явилися на GitHub — наприклад, nirholas/claude-code, який Anthropic видалили через DMCA за лічені години, але до того його встигли форкнути сотні разів.
-
Claw Code — повне переписування архітектури Claude Code на Rust — набрав 50 000 зірок на GitHub за 2 години, ставши найшвидшим репозиторієм в історії, який досяг цієї позначки. Зараз він активно розвивається як open-source фреймворк для AI-агентів програмування.
-
ccleaks.com — сайт з детальним розбором, що каталогізує кожну неанонсовану функцію, приховану команду та build-прапорець, знайдені у вихідному коді. З картками для кожного відкриття, включаючи "BUDDY" (AI-компаньйон у вигляді домашнього улюбленця), "ULTRAPLAN" (30-хвилинний режим віддаленого планування) та 44 інші feature flags:
- Десятки аналітичних статей на DEV Community, YouTube та технічних блогах, що розбирали кожну деталь.
Усе це. За один день. У епоху ШІ софтверна індустрія зовсім здуріла.
Але код і так вже був там
Ось що пропустили більшість ЗМІ: Claude Code поставляється як один зібраний JavaScript-файл — cli.js — через npm. Це 13 МБ, 16 824 рядки JavaScript. І він лежав там, публічно доступний, з моменту запуску продукту.
Ми проаналізували цей файл в AfterPack як частину кейсу з деобфускації. Що ми виявили: він мініфікований, а не обфускований.
У чому різниця? Мініфікація — те, що кожен бандлер (esbuild, Webpack, Rollup) робить за замовчуванням — скорочує імена змінних та видаляє пробіли. Це зменшує розмір коду для доставки. Мініфікацію ніколи не було створено для того, щоб щось приховувати.
Обфускація шифрує рядки, вирівнює потік управління, вставляє мертвий код, додає механізми захисту від модифікації. Вона створена для того, щоб зворотна розробка стала обчислювально дорогою.
У Claude Code є перше. Другого — нуль.
| Техніка | Присутня? |
|---|---|
| Скорочення імен змінних | Так (стандартна мініфікація) |
| Видалення пробілів | Так (стандартна мініфікація) |
| Шифрування/кодування рядків | Ні |
| Вирівнювання потоку управління | Ні |
| Вставка мертвого коду | Ні |
| Самозахист / захист від модифікації | Ні |
| Ротація масивів рядків | Ні |
| Скорочення імен властивостей | Ні |
Усі 148 000+ рядкових літералів лежать відкритим текстом. Кожен системний промпт, кожен опис інструменту, кожна поведінкова інструкція — прямо там у JavaScript, читабельна в будь-якому текстовому редакторі. Жодних source maps не потрібно.
Ми попросили Claude деобфускувати самого себе
Ось тут стає цікаво. Нам не потрібні були source maps, щоб витягнути внутрішню будову Claude Code. Ми попросили Claude — власну модель Anthropic — проаналізувати та деобфускувати мініфікований файл cli.js.
Це спрацювало. Надзвичайно добре.
За допомогою простого скрипту на основі AST ми розібрали повний 13-мегабайтний файл за 1,47 секунди та витягнули 147 992 рядки. Після категоризації:
- 1 017 системних промптів та інструкцій
- 431 опис інструментів
- 837 унікальних назв подій телеметрії (усі з префіксом
tengu_— внутрішня кодова назва Claude Code) - 504 змінні середовища, що контролюють поведінку продукту
- 3 196 повідомлень про помилки
- Захардкоджені ендпоінти, OAuth URL-адреси, API-ключ DataDog, повний каталог моделей
Кожен рядок. Витягнутий менш ніж за 2 секунди. Без розшифрування. Без деобфускації. Просто парсинг.
І ми не єдині, хто це зрозумів. Geoffrey Huntley опублікував повну "cleanroom-транспіляцію" Claude Code за місяці до цього витоку — використовуючи LLM для конвертації мініфікованого JavaScript у читабельний, структурований TypeScript. Його ключовий висновок: "LLM шокуюче добре справляються з деобфускацією, транспіляцією та перетвореннями між структурами."
Source maps не розкрили код. Код і так уже був розкритий. Source maps лише додали коментарі та структуру дерева вихідних файлів зверху.
Що насправді додали source maps
Варто визнати — source maps все ж розкрили деяку по-справжньому чутливу інформацію, яку було нелегко витягнути з мініфікованого бандлу:
Внутрішні коментарі у коді. Нотатки розробників, TODO, обґрунтування рішень. Те, що ви пишете, очікуючи, що це прочитають тільки колеги.
Точна файлова структура. Повне дерево проєкту з 1 884 файлів з оригінальними іменами, межами модулів та залежностями.
Feature flags з кодовими назвами. Такі імена, як tengu_amber_flint, tengu_cobalt_frost і tengu_miraculo_the_bard — внутрішні назви експериментів, які розкривають продуктову стратегію та структуру A/B-тестів.
Режим під прикриттям. Функція, що видаляє внутрішні кодові назви та посилання, коли Claude Code використовується в репозиторіях, що не належать Anthropic — щоб модель випадково не сказала "Tengu" чи "Capybara" публічно.
KAIROS. Ще не випущений автономний режим демона — фонові агентні воркери з cron-циклами та підписками на GitHub webhook.
Механізми захисту від дистиляції. Claude Code надсилає anti_distillation: ['fake_tools'] в API-запитах, вставляючи фальшиві визначення інструментів у промпти, щоб отруїти тренувальні дані, якщо хтось записує API-трафік для навчання конкурентної моделі.
Це чутлива інформація. Внутрішні коментарі — це реальний витік. Але сама логіка вихідного коду — промпти, інструменти, архітектура, ендпоінти — все це вже було в cli.js. Завжди було.
Це трапляється частіше, ніж ви думаєте
Ось що може вас здивувати: це не проблема лише Anthropic. Це загальноприйнята практика у всій індустрії.
Ми запустили Security Scanner від AfterPack на власному сайті GitHub — одній із найпотужніших інженерних організацій у світі. Ось що ми знайшли:
Email-адреси. Назви змінних середовища. Внутрішні URL. Все це лежить у продакшн JavaScript та source maps, публічно доступне. Подивіться повні результати сканування самі.
А на власному сайті Anthropic — claude.ai — та сама проблема. Їхній продакшн JavaScript за адресою s-cdn.anthropic.com/s.js розкриває email-адреси співробітників:
Про це ніхто не говорить. Немає заголовка у VentureBeat про те, що GitHub публікує email-адреси у своїх JS-бандлах. Немає обговорення на Hacker News про внутрішні URL, що потрапили у CDN-скрипти Anthropic. Але це точно той самий клас проблеми — продакшн JavaScript, що розкриває інформацію, яка ніколи не мала бути публічною.
Перевірте свій власний сайт прямо зараз: afterpack.dev/security-scanner, або з терміналу:
| npx afterpack audit https://your-site.com |
Чому ШІ змінює рівняння
Ось реальність, яку ілюструє витік Claude Code — навіть якщо більшість людей зачепилася за іншу історію:
Мініфікація ніколи не була захистом. Це оптимізація розміру. Перейменування змінних, яке сповільнює людей-читачів, для LLM — тривіальне. ШІ читає мініфікований код так само, як ви читаєте відформатований.
Системні промпти — це нові комерційні таємниці. Компанії витрачають місяці на інженерію промптів, що формують їхні продукти. Промпти Claude Code від Anthropic — секції "# Doing tasks", "# Executing actions with care", "# Tone and style" — це серйозна робота з prompt engineering. І все це доставляється відкритим текстом у JavaScript.
Назви телеметрії розкривають дорожню карту продукту. 837 подій tengu_*, які ми витягнули, точно показують, що Anthropic розробляє, тестує та вимірює. Назви подій на кшталт tengu_desktop_upsell_shown та tengu_review_overage_dialog_shown розкривають стратегію монетизації.
Змінні середовища розкривають те, що ви ще не готові випускати. 504 описові назви змінних — CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS, CLAUDE_CODE_DISABLE_AUTO_MEMORY, MAX_THINKING_TOKENS — розкривають ранні функції та експериментальні ендпоінти, які ще не готові для продакшну. Для зловмисників це дорожня карта до найменш протестованої, найвразливішої поверхні. Для конкурентів — весь ваш pipeline фіч. А для ваших користувачів — список налаштувань, про які вони не мали дізнатися.
І це стосується не лише Anthropic. Кожен JavaScript-застосунок — React-фронтенди, десктопні застосунки на Electron, мобільні застосунки на React Native, CLI на Node.js — поставляє код, який ШІ тепер може читати, аналізувати, реконструювати та копіювати. Платіжні шлюзи з feature flags. SaaS-продукти з логікою ціноутворення. Потоки автентифікації із захардкодженими ендпоінтами.
Ми готуємо повне дослідження того, наскільки добре моделі ШІ здатні зворотно розбирати популярні JavaScript-обфускатори — не просто мініфікований код, а код, який був навмисно захищений. Claude Code (на базі Opus) наразі є найсильнішою моделлю для задач міркування та програмування, і він лякаюче добре з цим справляється. Підписуйтесь, щоб не пропустити:
Проблема поточного "захисту"
Ось у чому підступ. Стаття, яку ви щойно прочитали, доводить, що мініфікація — це не захист. Але ось що більшість людей не усвідомлює: традиційна обфускація — теж ні. Вже ні.
Кожен існуючий JavaScript-обфускатор був створений до появи Opus 4.6. Їхні техніки — шифрування рядків, вирівнювання потоку управління, вставка мертвого коду — це послідовні, зворотні трансформації. Кожен крок має зворотний. Моделі ШІ, навчені на мільйонах прикладів коду, можуть ідентифікувати та скасувати ці патерни, часто за секунди.
Викрутіть налаштування на максимум — і так, ви зможете сповільнити аналіз, але ціною 10-кратного збільшення коду та серйозного падіння продуктивності. На цьому етапі ви зробили свій застосунок непридатним для використання, щоб захистити його від читання.
Саме цю прогалину закриває AfterPack.
Чому я створюю AfterPack
AfterPack підходить до цього інакше. Замість нашаровування зворотних трансформацій одна на одну, AfterPack використовує нелінійні, незворотні трансформації — ближче до того, як працює хеш-функція, ніж до традиційного обфускатора. Результат функціонально еквівалентний вхідним даним, але трансформація знищує семантичний зміст таким чином, що його неможливо відновити — навіть самому AfterPack. Немає зворотної функції. Немає секретного ключа, що відкриє оригінал.
Основна ідея: не просто ускладнити читання коду. Знищити інформацію, потрібну зловмиснику для відтворення — так само, як хеш-функція знищує свій вхід. 40+ трансформацій застосовуються у псевдовипадковому порядку — складність зворотного відтворення не лінійна, а комбінаторна. І кілька ключових трансформацій справді знищують інформацію: навіть якщо ви визначите, що було застосовано, оригінальна інформація непоновлювана.
І так — ви все ще можете дебажити свій код. AfterPack генерує зашифровані source maps, що відображають обфускований вихід назад на ваш оригінальний код. Захист однонаправлений для зловмисників, не для вас.
Написаний на Rust задля швидкості — достатньо швидкий, щоб запускати на кожному білді, кожному коміті, навіть на edge на Cloudflare Workers. З безкоштовним тарифом, достатньо щедрим, щоб не було виправдань ним не скористатися.
Поточний стан — коли компанія вартістю $60B+ поставляє свій найчутливіший клієнтський код лише з мініфікацією бандлера — довго не протримається. Я будую AfterPack, тому що вважаю, що захист має бути стандартним кроком у кожному build pipeline, а не запізнілою думкою. Якщо цікаво, спробуйте сканер на своєму сайті — ви можете здивуватися, що саме відкрито.
