
HikCentral Professional - Утечка ActiveCode лицензии до аутентификации
Перед загрузкой чего-либо, что уже есть в открытом доступе:
| Источник | Что говорит |
|---|---|
| Консультация по безопасности Hikvision | "Отсутствие проверок аутентификации на конечных точках API", рекомендация обновиться до V2.6.3 / V3.0.1 |
| NVD CVE-2025-39247 | Метрики CVSS; вектор: сетевой, без аутентификации, изменённый объём, высокая конфиденциальность |
| Wiz, ZeroPath, SentinelOne, OffSeq, gbhackers, cybersecuritynews summaries | Все повторяют консультацию; никаких технических деталей, ни одного PoC, ни одного названного затронутого конечного пункта |
| GitHub PoC aggregators (poc-in-github, 0xMarcio/cve, etc.) | Нет проиндексированных PoC |
| Forums (ipcamtalk, cctvforum, reddit), torrent indexers | Нет PoC, нет утекших установщиков; на ipcamtalk есть тема об использовании HikCentral, но ничего связанного с эксплуатацией |
По состоянию на дату анализа, ни одна публичная техническая статья не раскрывает ошибку. Любое воспроизведение начинается с двоичного сравнения.
После публикации CVE-2025-39247 страница загрузки V2.6.2 была удалена, но файл на CDN никогда не был удалён. Имя файла можно восстановить из стороннего зеркала, которое проиндексировало страницу до удаления (FileHorse — опубликовал имя файла и MD5). С этим именем файла простой GET-запрос к CDN Hikvision — с использованием только обычного User-Agent браузера и соответствующего заголовка Referer — всё ещё отдаёт его.```bash
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0"
-H "Referer: https://www.hikvision.com/en/support/download/software/hikcentral-professional-v2-6-2/"
-O
"https://www.hikvision.com/content/dam/hikvision/en/support/download/vms/hcp-2-6-2/HikCentral-Professional_Full-Pack_V2.6.2.202501211507_Win_x64_Installer.exe"
Результат:
- Размер: 1,314,043,792 байт (1.22 ГБ)
- MD5: `76d42e7cb16dc0e177b9a35d0fed7ced` — совпадает со значением, опубликованным FileHorse, что подтверждает подлинность установщика, подписанного Hikvision (не сторонняя перепаковка)
- Заголовки ответа CDN: `HTTP/2 200`, `content-type: application/x-msdownload`, `eo-cache-status: HIT`, `age: 2520395` (≈ 29 дней в пограничном кэше Tencent EdgeOne без вытеснения)
**Замечание, которое стоит сообщить в Hikvision PSIRT:** «снятие» страницы V2.6.2 является косметическим. Оставшийся без присмотра файл доступен на CDN без аутентификации и без шлюза подписанных URL. Полные пакеты V2.5.1 и V2.6.0 реагируют аналогично.
### 2.2 Исправленный установщик (V2.6.3 Base Pack)
В настоящее время ссылка со страницы загрузки V2.6.3; тот же метод получения:```
https://www.hikvision.com/content/dam/hikvision/en/support/download/vms/hcp-2-6-3/HikCentral-Professional_Base-Pack_V2.6.3.202508280142_Win_x64_Installer.exe
Всё ещё доступен по ссылке со страницы загрузки V2.6.2 (Hikvision хочет, чтобы пользователи его применили):``` https://www.hikvision.com/content/dam/hikvision/en/support/download/vms/cve-2025-39247-security-vulnerability-patch/HikCentral-Professional_CVE-2025-39247_FixPack_V2.3.1-V2.6.2V3.0.0_20250904.exe
- Размер: 32,599,504 байт (31 МБ)
---
## 3. Статическое извлечение
Все три представляют собой оболочки PE в стиле InstallShield. `7z` извлекает их в два прохода:```bash
# pass 1 — extract PE resources
7z x -o./extracted/v262/pe downloads/<v2.6.2 installer>
7z x -o./extracted/v263/pe downloads/<v2.6.3 installer>
# pass 2 — extract the nested 7-Zip streams hiding in PE resources
# (note: the resource-type label says "ZIP" but the byte signature is 7-Zip)
for ver in v262 v263; do
for z in extracted/$ver/pe/.rsrc/2052/ZIP/*; do
sz=$(stat -c %s "$z"); [ "$sz" -lt 1048576 ] && continue
7z x -o"extracted/$ver/payload/$(basename $z)" "$z"
done
done
Оба установщика распаковываются примерно в два десятка именованных архивов с полезной нагрузкой. Каталоги верхнего уровня раскрывают архитектуру:
| Архив | Содержимое |
|---|---|
246/Nginx + 246/www | Веб-уровень Nginx (входная дверь) и SPA веб-интерфейс |
244/bin | Нативные C++ бинарники служб + сертификаты |
240 | Встроенный PostgreSQL + скрипты инициализации БД |
238 | Среда выполнения Bee* (BeeAgent, BeeGuard, …) |
282 | Службы приложений и дополнения (основная часть C++ бэкенда) |
281, 283-284, 396, 398-399, 513, 520, 538-541, 573 | Мелкие дополнения, плагины, заглушки обновления/удаления |
Критически важно: нигде нет Java JAR/WAR. Бэкенд — это C++ на Nginx — важно, потому что сразу ясно: любые уязвимости аутентификации будут в скомпилированных бинарниках, а не в WAR/JAR байткоде, где декомпиляция тривиальна.
for ver in v262 v263: find . -type f -print0 | xargs -0 md5sum | sort -k2 > inv_$ver.txt
v262 = {ln[34:]: ln[:32] for ln in open("inv_v262.txt")} v263 = {ln[34:]: ln[:32] for ln in open("inv_v263.txt")} common = set(v262) & set(v263) changed = [p for p in common if v262[p] != v263[p]]
Результат: 239 изменённых файлов в общих путях. Распределение:
| Bucket | Count | Comment |
|---|---|---|
| `246/www/*.js` (чанки веб-интерфейса) | ~200 | В основном обновлённые хэши ресурсов — игнорировать |
| `246/Nginx/conf/nginx_location.conf` | **1** | **Дельта конфига Nginx в одном файле — начать отсюда** |
| `246/Nginx*/install.bat` | 6 | Сценарии установки, не связаны |
| `244/bin/*.{exe,dll}` | 6 | Нативные бинарники (`DistributionFilter.dll`, `FilterChain.dll`, медиа-инструменты) |
| `282/*.{exe,dll}` | 55 | Службы приложения (самый крупный кластер — `platform.dll`, `PersonCredential.dll`, `baseacs.*`, …) |
| `240/bin/pg_*` | 6 | Пересборка Postgres, не связана |
| `284/hplugin/dahua_plugin/*` | 4 | Обновление SDK вендора (+10.97 МБ) — не связано |
| `284/hplugin/onvif_plugin/*` | 4 | Обновление SDK вендора (+0.99 МБ) — не связано |
| заглушки обновления/удаления, краш-репортеры | ~30 | Пересборка PE-таймстампов того же размера, игнорировать |
После фильтрации обновлений SDK вендора, дрейфа временных меток системы сборки и чисто косметических обновлений ресурсов, *фактические* изменения, относящиеся к безопасности, сводятся к:
- Одному файлу конфигурации Nginx
- Небольшому числу C++ бинарников в `282/` (прежде всего `platform.dll`, внутренняя служба HCMP, +57 КБ)
---
## 5. Разница в Nginx: бесплатная локация ошибки
`diff -u nginx_location.conf` между V2.6.2 и V2.6.3 даёт ровно один ханк: новый блок `location =` в V2.6.3.```nginx
#禁止非127.0.0.1和::1的重置密码 ← "Forbid non-127.0.0.1/::1 password reset"
location = /ISAPI/Bumblebee/Platform/V0/Permission/ChangeDefaultUserPassword {
if ($remote_addr ~ ^(127\.0\.0\.1|::1)$) { set $allowed 1; }
if ($allowed != "1") { return 403; }
if ($scheme = "http") { proxy_pass http://http_backend; }
if ($scheme = "https") { proxy_pass http://http2_backend; }
}
Эта единственная добавка из 21 строки — это и есть всё исправление CVE-2025-39247 на уровне front-door, и она говорит вам обо всём: