Как не надо проводить расследования

На YouTube вышло видео, автор которого утверждает, что сайт Sailau 2026 (election.jurttyn.kz) о выборах в Курултай сделан «специалистами ФСБ» и подаёт материал «в кремлёвской интерпретации». Доказательства три: хостинг поддомена, отсутствие комментариев в коде и библиотека core-js, написанная российским разработчиком.

Здесь разбираются только технические доводы видео. Содержание сайта, позицию канала Jurttyñ Balasy и политическую сторону вопроса я не оцениваю и ни с одной из сторон не связан. Формулировки о ФСБ и Кремле — цитаты автора видео, а не мои выводы.

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

Мне, как человеку, немного разбирающемуся в OSINT и в устройстве современного интернета, трудно было пройти мимо ошибок в этом разборе. Ниже — по порядку.

Домен и хостинг

Начнём с того, что автор плохо представляет, что именно показывают WHOIS и сервисы, которые собирают сведения о домене и IP-адресе.

Сводка по IP-адресам jurttyn.kz и election.jurttyn.kz: Tilda в Алматы и Vercel, Inc с городом Уолнат, США
Кадр из видео, 02:50. «Уолнат» здесь — город из регистрационных данных блока 64.29.17.0/24, принадлежащего Vercel, а не место, где стоит сервер.

В видео показан скриншот сервиса, предположительно 2ip. Такие сервисы сводят в одну таблицу данные из нескольких разных источников. К самим данным претензий нет. Претензия к тому, как их прочитали.

ИсточникОткуда данныеЧто показываетЧего не показывает
WHOIS доменаРеестр .kz (nic.kz)Регистранта, регистратора, NS-серверыГде стоит сервер
WHOIS IP-адресаРегиональный реестр (ARIN, RIPE NCC)Организацию, которой выделен блок адресов, и её юридический адресКлиента этой организации и место сервера
Геолокация IPКоммерческие базы (MaxMind, IP2Location и др.)Оценку местоположения по регистрационным данным и эвристикамГарантированное физическое место

«Американская деревушка»

Автор утверждает, что «сервер расположен в американской деревушке». По IP-адресу получают не адрес дата-центра, а юридический адрес организации, на которую зарегистрирован блок адресов. Блок 64.29.17.0/24 принадлежит Vercel, Inc., и в его регистрационных данных указан адрес 340 S Lemon Ave #4133, Walnut, CA. Вся «деревушка» — это строчка почтового адреса компании в реестре.

whois 64.29.17.1 | grep -iE "orgname|address|city|cidr"
CIDR:           64.29.17.0/24
OrgName:        Vercel, Inc
Address:        340 S LEMON AVE #4133
City:           Walnut

Физически сервера «в Уолнате» нет, и по устройству сети быть не может: 64.29.17.1 — anycast-адрес. Один и тот же IP анонсируется из многих точек присутствия Vercel, и запрос обслуживает ближайшая к пользователю. Это легко проверить замером задержки из Алматы. Для контроля возьмём дата-центр во Фремонте, Калифорния.

$ mtr -T -P 443 -rwc 20 speedtest.fremont.linode.com
Start: 2026-10-28T16:53:49+0500
HOST                                      Loss%  Snt   Last    Avg   Best   Wrst  StDev
  ... (промежуточные хопы скрыты)
 12.|-- ve353.core3.fra2.he.net            30.0%   20  5228.  2877.   93.8  7273. 3126.0
 13.|-- port-channel10.core3.fra1.he.net   10.0%   20  7329.  1508.   94.0  7329. 2247.9
 14.|-- be47.core4.fra1.he.net              0.0%   20  1156.  149.8   94.9  1156.  236.9
 15.|-- be1.core3.par2.he.net               0.0%   20  1269.  398.2  241.0  1307.  380.2
 16.|-- be10.core2.ash1.he.net              0.0%   20  245.2  348.4  243.3  1295.  316.3
 17.|-- be9.core1.pao1.he.net               0.0%   20  244.0  245.7  244.0  257.0    2.8
 18.|-- be9.core2.fmt2.he.net               0.0%   20  244.1  245.0  242.7  246.8    1.0

$ mtr -T -P 443 -rwc 20 64.29.17.1
Start: 2026-10-28T16:54:36+0500
HOST                                      Loss%  Snt   Last    Avg   Best   Wrst  StDev
  ... (промежуточные хопы скрыты)
 19.|-- 64.29.17.1                          0.0%   20   94.7   95.4   94.0   98.4    1.2

До Фремонта пакеты идут через Франкфурт, Париж, Эшберн и Пало-Альто, и последний маршрутизатор в Калифорнии отвечает примерно за 245 мс. «Калифорнийский» 64.29.17.1 отвечает за 95 мс — столько же, сколько франкфуртские маршрутизаторы на первом маршруте. От Алматы до Калифорнии больше 10 800 км. Даже по идеальному оптоволокну по прямой это не меньше 110 мс в обе стороны. Сервер, который ответил быстрее, физически не может стоять в Калифорнии.

Пугаться потерь и задержек в тысячи миллисекунд на промежуточных хопах не стоит: маршрутизаторы отвечают на служебные ICMP-запросы по остаточному принципу. Значение имеет только последняя строка.

Где именно стоит ответивший сервер, Vercel сообщает сам, в заголовке ответа:

$ curl -sI https://election.jurttyn.kz | grep -i x-vercel-id
x-vercel-id: fra1::nrkvt-1793188992825-05b33d233b25

Первая часть значения — код точки присутствия, которая приняла запрос: fra1 — Франкфурт-на-Майне. Если ответа нет в кэше, Vercel передаёт запрос дальше, в регион, где работает серверная часть приложения, и в заголовке появляется второй код. На скриншоте ниже это fra1::iad1, где iad1 — Вашингтон. Калифорнии нет ни в одном из кодов, а задержка в 95 мс подтверждает, что из Алматы запросы принимает Франкфурт.

Firefox DevTools, вкладка «Сеть» на election.jurttyn.kz: список запросов к домену сайта и заголовки ответа — server: Vercel, x-vercel-cache: MISS, x-vercel-id: fra1::iad1
Вкладка «Сеть» на election.jurttyn.kz. В заголовках ответа: server: Vercel, x-vercel-cache: MISS и x-vercel-id: fra1::iad1 — запрос принял Франкфурт и при промахе кэша передал в регион iad1 (Вашингтон). Параметр dpl=dpl_… в адресах файлов — идентификатор деплоя Vercel.

Поддомен выдаёт владельца лучше любого WHOIS

election.jurttyn.kz — не отдельный сайт неизвестного происхождения, а поддомен jurttyn.kz. Запись для него создаёт тот, кто управляет DNS-зоной основного домена, то есть его владелец. Автор сам показывает, что jurttyn.kz зарегистрирован открыто и данные владельца видны. Осталось посмотреть, кто и куда направил поддомен.

$ dig +short NS jurttyn.kz
ns3.ps.kz.
ns2.ps.kz.
ns1.ps.kz.

$ dig +short election.jurttyn.kz
96d1211965938eef.vercel-dns-017.com.
216.150.16.193
216.150.1.193

Зона jurttyn.kz обслуживается у казахстанского провайдера PS.kz, и именно в ней прописана CNAME-запись поддомена. Значение записи не общее для всех клиентов Vercel: у каждого проекта свой уникальный CNAME вида [хэш].vercel-dns-017.com. То есть владелец домена не «спрятал сайт в Америке», а явно привязал поддомен к одному конкретному проекту в Vercel. Искать, кто скрывается за поддоменом, бессмысленно: он подписан именем основного домена.

Для читателей, которые будут повторять проверку: IP-адрес поддомена у вас, скорее всего, окажется другим, и не тем, что в видео. Это нормально. CNAME ведёт на DNS Vercel, а тот от запроса к запросу отдаёт разные адреса из своих пулов: 64.29.17.0/24, 216.150.1.0/24, 216.150.16.0/24 и других. В видео показан лишь один из них — тот, что достался автору в момент проверки. Все эти блоки зарегистрированы на Vercel, Inc.

Анонимный хостинг, который не анонимен

Второй тезис — «хостинг искали такой, что данные не выдаст». Хостинг не анонимный. Для регистрации в Vercel нужна почта или Git-аккаунт, а для первого же проекта Git-аккаунт привязать придётся в любом случае. За каждым деплоем стоят аккаунт, репозиторий и история коммитов. Документов, как казахстанский регистратор домена, Vercel не спрашивает, но анонимным его это не делает: данные клиента у провайдера есть, их просто не публикуют в WHOIS. Так поступает любой хостинг, казахстанский в том числе.

Выбор Vercel, скорее всего, объясняется прозаичнее: бесплатный тариф и родная поддержка Next.js — Vercel сам этот фреймворк и разрабатывает. Основной сайт канала сделан на Tilda, а конструктор приложения на Next.js не запускает. Отсюда и разный хостинг у домена и поддомена.

Кто отвечает за содержимое

Ответственность за содержимое сайта несёт его владелец, и владелец здесь известен — это владелец домена. Закон «О масс-медиа» (№ 93-VIII от 19 июня 2024 года) относит интернет-ресурсы к масс-медиа (ст. 1, п. 20). Если распространение приостанавливают или прекращают по решению суда, исполнять его обязан собственник интернет-ресурса, а суд может на срок до трёх месяцев запретить использовать то же или схожее доменное имя (ст. 23). Конкретные составы нарушений вынесены в КоАП и УК, на них ссылается ст. 67. Адресат претензий во всей этой конструкции — владелец ресурса и его домена, а не хостинг-провайдер поддомена.

Хостингу можно направить требование ограничить доступ и запрос сведений о клиенте. Vercel в своей политике конфиденциальности прямо пишет, что раскрывает данные пользователей, когда этого требует закон: по решению суда, повестке или иному законному запросу. Для казахстанского госоргана американская компания напрямую не подотчётна, и запрос пойдёт через механизмы международной правовой помощи. Ограничить доступ к ресурсу внутри страны можно и вовсе без участия Vercel: это позволяет ст. 41-1 Закона «О связи».

Иными словами, у государства есть все инструменты, чтобы найти владельца сайта. Ни один из них здесь не понадобится: владелец известен — автор видео сам показывает данные регистранта основного домена.

Претензия, которую автор пропустил

Ирония в том, что у поддомена действительно есть проблема, и видна она из той же самой сводки, которую автор показывает в видео. Только это не ФСБ, а правила казнета.

Правила регистрации, пользования и распределения доменных имён в казахстанском сегменте интернета (приказ № 38/НҚ от 13 марта 2018 года) называют основанием для приостановки домена «размещение интернет-ресурсов на аппаратно-программных комплексах вне территории Республики Казахстан» (п. 16, пп. 6). Сами правила говорят об интернет-ресурсах в целом, а реестр nic.kz в памятке для владельцев уточняет прямо: хостинг должен быть в Казахстане и для основного домена, и для субдоменов. DNS- и почтовые записи при этом могут указывать на серверы в любой стране, а вот сайт — нет. Скрывать зарубежный хостинг за проксированием памятка тоже прямо называет нарушением.

На 28 октября 2026 года election.jurttyn.kz указывает на Vercel (см. вывод dig выше), а запросы из Алматы принимает точка присутствия во Франкфурте (fra1), откуда они уходят в регион iad1 в Вашингтоне. По букве правил это нарушение. Последствие тоже вполне конкретное: приостанавливается использование доменного имени, то есть jurttyn.kz целиком, вместе с основным сайтом на Tilda. Перед этим регистратор уведомляет владельца и даёт срок на исправление (п. 19).

Претензия эта регуляторная, а не шпионская: она о том, где лежит сайт, а не о том, кто его написал и по чьему заказу. Автор видео, искавший следы Кремля в полифиллах, прошёл мимо единственного нарушения, которое видно невооружённым глазом. Будь оно в видео, разговор с владельцем канала получился бы куда предметнее.

То, что видит браузер, — не исходный код

Дальше автор разбирает то, что сервер собрал и отдал браузеру, и называет это исходниками. Браузер получает HTML, CSS, JavaScript и медиаконтент, которые сервер или сборщик сгенерировали из исходного кода. Рядом с JavaScript может работать WebAssembly, но и его браузер получает уже скомпилированным.

Исходником ответ сервера можно считать, только если сайт написан на чистом HTML, CSS и JavaScript без сборки. В современном интернете это редкость. Сайт на Next.js — ровно обратный случай: код транспилирован, склеен в бандлы и минифицирован, а часть HTML сгенерирована на сервере.

По той же причине наличие или отсутствие комментариев в ответе сервера ни о чём не говорит. Комментарии живут в исходниках, то есть в репозитории разработчика. На сервере исходников может не быть вовсе: Vercel собирает проект и раздаёт результат сборки, а минификатор удаляет комментарии по умолчанию. Сервер их просто не отправит. Исключения — сайты на чистом HTML, CSS и JavaScript, комментарии, вписанные прямо в шаблон (смысла в этом немного), и лицензионные комментарии вида /*! */, которые некоторые сборщики сохраняют.

Так что «комментарии затёрли специально» (06:21–07:11 в видео) — это поведение сборщика по умолчанию, а не заметание следов.

Мы не в 90-х и не в нулевых, чтобы подписывать сайты, как художник подписывает картину. Сайт сегодня соберёт школьник за пару вечеров — криво и дыряво, но работать будет. ИИ сделает это за пять минут. Подпись в ответе сервера при таких условиях не нужна никому: её никто не увидит. Авторство фиксируется в другом месте — в истории коммитов и в профиле на GitHub, где смотрят на сам код, а не на подпись в нём.

Как определить стек за минуту

Если уж смотреть в ответ сервера, искать стоит следы, которые оставляют фреймворк и хостинг:

  • пути /_next/static/chunks/ и объект self.__next_f или __NEXT_DATA__ — Next.js;
  • хэши в именах файлов вроде polyfills-42372ed130431b0a.js — контентное хэширование сборщика;
  • заголовки server: Vercel, x-vercel-id, x-vercel-cache — хостинг Vercel;
  • для сравнения: /wp-content/ у WordPress, tildacdn у Tilda.

Wappalyzer или whatweb сделают то же самое быстрее.

Вкладка Network: заголовки ответа election.jurttyn.kz — server: Vercel, x-vercel-cache: MISS, x-vercel-id: fra1::iad1
Заголовки ответа election.jurttyn.kz. При промахе кэша (MISS) запрос принимает Франкфурт (fra1) и передаёт в регион iad1 (Вашингтон), где работает серверная часть.

Короткий экскурс в DevTools

  • Elements показывает живой DOM после выполнения JavaScript, а не то, что прислал сервер.
  • View Source (Ctrl+U) — то, что сервер отдал в ответ на запрос страницы.
  • Network — все запросы, их заголовки и тела ответов. Здесь видно, куда сайт обращается: аналитика, CDN, API.
  • Sources с кнопкой {} — читаемый вид минифицированного кода. Исходник по нему восстанавливается только через source maps, а Next.js по умолчанию не публикует их в продакшене.

Если бы автор искал настоящие следы, начинать стоило с вкладки Network: запросы к российским сервисам аналитики, CDN или API были бы аргументом. В видео до этой вкладки дело не доходит.

Библиотеки и их авторы

Непонятна и претензия к core-js. Не все библиотеки подключают разработчики: многие приходят как зависимости других библиотек. Здесь именно такой случай. core-js лежит в файле polyfills-*.js в каталоге /_next/static/chunks/. Это набор полифиллов для старых браузеров, который Next.js сам добавляет в каждую сборку. Разработчики сайта этот файл не писали и, скорее всего, даже не знали о его существовании.

Убедиться в этом можно, не открывая сайт вовсе. Та же строка с той же версией лежит в пакете самого Next.js:

npm pack next@15.5.0
tar xzf next-15.5.0.tgz package/dist/build/polyfills/polyfill-nomodule.js -O \
  | grep -o 'version:"3.38.1".\{0,90\}'

version:"3.38.1",mode:"global",copyright:"© 2014-2024 Denis Pushkarev (zloirock.ru)",license:"https://github...

Ещё нагляднее — собрать пустой проект и поискать ту же строку в результате сборки:

$ npx create-next-app@latest demo && cd demo
$ npm run build
▲ Next.js 16.4.3 (Turbopack)
...
$ grep -o 'version:"[0-9.]*",mode:"global",copyright:"[^"]*"' .next/static/chunks/*.js
.next/static/chunks/0cz1d0mv5g_q7.js:version:"3.38.1",mode:"global",copyright:"© 2014-2024 Denis Pushkarev (zloirock.ru)"

Проект, в котором не написано ни строчки кода и ничего не подключено вручную, после сборки содержит ровно тот «след», который в видео предъявлен сайту о выборах: ту же библиотеку, ту же версию, то же имя. Версию 3.38.1, которую автор назвал «старой», Next.js поставляет до сих пор. Её выбрала команда Next.js, а не разработчики сайта.

Если будете повторять проверку, имя файла у вас будет другим. Свежие версии Next.js собирают проект через Turbopack, который называет чанки иначе, чем polyfills-[хэш].js из видео. Ищите по содержимому, а не по имени.

По сути претензия звучит так, будто каждый разработчик обязан прописывать всё вручную или проверять автора каждой библиотеки, включая зависимости зависимостей. У типового проекта на Next.js их сотни.

$ npx create-next-app@latest demo
...
Installing dependencies:
- next
- react
- react-dom

Installing devDependencies:
- @tailwindcss/turbopack
- @types/node
- @types/react
- @types/react-dom
- eslint
- eslint-config-next
- tailwindcss
- typescript

added 364 packages, and audited 365 packages in 22s
found 0 vulnerabilities

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

Забавно, что core-js среди этих 364 пакетов нет вовсе: npm ls core-js возвращает пустой результат. Next.js поставляет полифиллы уже собранным файлом внутри собственного пакета. Чтобы «вычислить» Пушкарёва в таком проекте, разработчику пришлось бы читать скомпилированные файлы фреймворка.

Справедливости ради, на зависимости смотрят. Истории event-stream, node-ipc и xz-utils научили индустрию следить за цепочкой поставок. Но проверяют код, лицензии, известные уязвимости и смену мейнтейнеров — сканерами и npm audit, а не паспорт автора.

Почему имя автора пережило минификацию

Имя Дениса Пушкарёва видно в файле не потому, что его кто-то «прописал жёстко». Строка © 2014-2024 Denis Pushkarev (zloirock.ru) — не комментарий, а данные. core-js записывает в общий глобальный объект версию, режим, копирайт и ссылку на лицензию, чтобы обнаруживать несколько копий библиотеки на одной странице. Строковые значения в коде минификатор не трогает, поэтому строка и осталась.

// core-js/internals/shared-store.js (v3.38.1)
(store.versions || (store.versions = [])).push({
  version: '3.38.1',
  mode: IS_PURE ? 'pure' : 'global',
  copyright: '© 2014-2024 Denis Pushkarev (zloirock.ru)',
  license: 'https://github.com/zloirock/core-js/blob/v3.38.1/LICENSE',
  source: 'https://github.com/zloirock/core-js'
});
Увеличенный фрагмент polyfills-42372ed130431b0a.js со строкой version 3.38.1 и copyright Denis Pushkarev
Кадр из видео, 08:40. Строка с версией и копирайтом core-js в файле polyfills-*.js — тот же текст, что лежит в пакете самого Next.js.

Автор признаёт, что полифиллы подключаются автоматически, но настаивает: версия должна быть свежей, «актуальная — 53.50». Такой версии у core-js нет, как нет и 3.53.50. На момент выхода видео последней была 3.50.0, на 28 октября 2026 года — 3.51.0. Но дело не в цифре. Версию полифиллов фиксирует релиз Next.js, а не разработчик сайта, и, как показала сборка выше, даже Next.js 16.4.3 по-прежнему поставляет 3.38.1. По логике автора, «кремлёвским» придётся признать каждый сайт, собранный актуальной версией фреймворка

Зафиксированная версия — признак воспроизводимой сборки, а не умысла. Полифиллы закрывают пробелы старых браузеров, и новые версии core-js в основном добавляют поддержку свежих предложений стандарта, которые сайту о выборах вряд ли нужны. Обратный подход — чтобы библиотека «обновлялась сама», подгружаясь с внешнего CDN, — в 2024 году наглядно себя дискредитировал. Домен polyfill.io сменил владельца, и сотни тысяч сайтов, подключавших оттуда «всегда свежие» полифиллы, начали раздавать посетителям вредоносный код.

Итог

Лучший аргумент против видео автор приводит сам. В конце он вставляет фрагмент интервью Пушкарёва (~11:56), где тот рассказывает, как ему звонили американские и канадские журналисты: видим ваш код на сайте — вы русский хакер? Пушкарёв объяснял, что это его открытый код с GitHub. Видео, построенное на этой ошибке, заканчивается рассказом о ней же.

  • «Сервер в американской деревушке» — юридический адрес владельца блока IP-адресов. Запросы из Алматы принимает Франкфурт.
  • «Анонимный хостинг» — обычный аккаунт Vercel. Поддомен прямо указывает на владельца основного домена.
  • «Комментарии затёрли» — production-сборка удаляет их по умолчанию.
  • «Библиотека кремлёвского программиста» — полифиллы, которые Next.js добавляет сам.

Методология, при которой иностранный хостинг плюс фамилия автора библиотеки дают ФСБ, найдёт Кремль на изрядной доле сайтов в интернете. Открытыми остаются два вопроса. Первый — содержание сайта: его автор видео не разбирал. Второй — размещение поддомена вне Казахстана: это реальный вопрос к владельцу домена, только не шпионский. Всё остальное читатель проверит сам за десять минут: whois, dig, curl и вкладка Network.

Об использовании ИИ при подготовке статьи

Текст статьи написан автором: тезисы, структура, аргументы и выводы принадлежат ему. Claude Opus 5.5 (Anthropic) использовался как редактор: переписал черновик стилистически, предложил места для иллюстраций и проверил ряд технических фактов. Все правки, касающиеся смысла, автор проверил и утвердил. Ответственность за содержание статьи несёт автор.

Дата редактуры: 28.10.2026

Источники для самостоятельной проверки:

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Scroll to Top