
HikCentral Professional - Vazamento de ActiveCode de Licença Pré-Autenticação
Antes de descarregar algo, o que já está público:
| Fonte | O que nos diz |
|---|---|
| Aviso de segurança da Hikvision | "Faltam verificações de autenticação em endpoints da API", recomendação de atualizar para V2.6.3 / V3.0.1 |
| NVD CVE-2025-39247 | Métricas CVSS; vetor é rede, sem autenticação, âmbito alterado, confidencialidade alta |
| Resumos da Wiz, ZeroPath, SentinelOne, OffSeq, gbhackers, cybersecuritynews | Todos repetem o aviso; nenhum detalhe técnico, nenhum PoC, nenhum endpoint afetado nomeado |
| Agregadores de PoC no GitHub (poc-in-github, 0xMarcio/cve, etc.) | Nenhum PoC indexado |
| Fóruns (ipcamtalk, cctvforum, reddit), indexadores de torrent | Nenhum PoC, nenhum instalador vazado; o ipcamtalk tem um tópico de uso do HikCentral mas nada relacionado a exploração |
Portanto, na data de análise, não existe nenhum artigo técnico público que exponha a falha. Qualquer reprodução começa com diff binário.
Após a publicação do CVE-2025-39247, a página de descarregamento do V2.6.2 foi removida, mas o ficheiro na CDN nunca foi eliminado. O nome do ficheiro pode ser recuperado a partir de um espelho de terceiros que indexou a página antes da remoção (FileHorse — publicou nome do ficheiro e MD5). Com esse nome de ficheiro, um simples GET à CDN da Hikvision — usando apenas um User-Agent de navegador normal e um cabeçalho Referer correspondente — ainda o serve.```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"
Resultado:
- Tamanho: 1,314,043,792 bytes (1.22 GB)
- MD5: `76d42e7cb16dc0e177b9a35d0fed7ced` — corresponde ao valor publicado pelo FileHorse, confirmando se tratar do instalador genuíno assinado pela Hikvision (não um reempacotamento de terceiros)
- Cabeçalhos da resposta CDN: `HTTP/2 200`, `content-type: application/x-msdownload`, `eo-cache-status: HIT`, `age: 2520395` (≈ 29 dias no cache de borda do Tencent EdgeOne sem remoção)
**Observação adicional que vale a pena reportar ao Hikvision PSIRT:** a "deslistagem" da página V2.6.2 é cosmética. O arquivo órfão está acessível no CDN sem autenticação e sem proteção de URL assinada. Os Pacotes Completos V2.5.1 e V2.6.0 respondem da mesma forma.
### 2.2 Instalador corrigido (Pacote Base V2.6.3)
Atualmente vinculado à página de download do V2.6.3; mesmo método de obtenção:```
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
Ainda vinculado da página de download V2.6.2 (Hikvision deseja que os usuários o apliquem):``` 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
Tamanho: 32,599,504 bytes (31 MB)
---
## 3. Extração estática
Todos os três são wrappers PE no estilo InstallShield. `7z` extrai-os em duas passagens:```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
Ambos os instaladores se expandem em aproximadamente duas dúzias de arquivos de payload nomeados. Os diretórios de nível superior revelam a arquitetura:
| Arquivo | Conteúdo |
|---|---|
246/Nginx + 246/www | Camada web Nginx (a porta de entrada) e a interface web SPA |
244/bin | Binários de serviço C++ nativos + certificados |
240 | PostgreSQL agregado + scripts de inicialização do banco de dados |
238 | runtime Bee* (BeeAgent, BeeGuard, …) |
282 | Serviços de aplicação e addons (a maior parte do código backend C++) |
281, 283-284, 396, 398-399, 513, 520, 538-541, 573 | Addons menores, plugins, stubs de atualização/desinstalação |
Crucialmente, não há JARs/WARs Java em nenhum lugar. O backend é C++ sobre Nginx — importante porque informa desde o início que qualquer falha de autenticação estará em binários compilados, não em bytecode WAR/JAR onde a descompilação é trivial.
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]]
Resultado: 239 arquivos alterados em caminhos comuns. Distribuição:
| Bucket | Count | Comment |
|---|---|---|
| `246/www/*.js` (Web UI chunks) | ~200 | Principalmente hashes de assets com versão atualizada; ignore |
| `246/Nginx/conf/nginx_location.conf` | **1** | **Delta de configuração Nginx em arquivo único — comece aqui** |
| `246/Nginx*/install.bat` | 6 | Scripts de instalação, não relacionados |
| `244/bin/*.{exe,dll}` | 6 | Binários nativos (`DistributionFilter.dll`, `FilterChain.dll`, ferramentas de mídia) |
| `282/*.{exe,dll}` | 55 | Serviços de aplicação (o maior cluster — `platform.dll`, `PersonCredential.dll`, `baseacs.*`, …) |
| `240/bin/pg_*` | 6 | Reconstrução do Postgres, não relacionada |
| `284/hplugin/dahua_plugin/*` | 4 | Atualização do SDK do fornecedor (+10.97 MB) — não relacionada |
| `284/hplugin/onvif_plugin/*` | 4 | Atualização do SDK do fornecedor (+0.99 MB) — não relacionada |
| upgrade/uninstall stubs, crash reporters | ~30 | Reconstruções de timestamp PE do mesmo tamanho, ignore |
Após filtrar a atualização do SDK do fornecedor, desvios de timestamp do sistema de build e meros ajustes cosméticos de assets, os *verdadeiros* deltas relevantes para segurança se reduzem a:
- Um arquivo de configuração Nginx
- Um pequeno número de binários C++ em `282/` (principalmente `platform.dll`, o serviço backend HCMP, +57 KB)
---
## 5. O diff do Nginx: localização de bug sem custo
`diff -u nginx_location.conf` entre V2.6.2 e V2.6.3 produz exatamente um hunk: um bloco `location =` totalmente novo no 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; }
}
Essa única adição de 21 linhas é toda a correção do CVE-2025-39247 na camada de entrada, e isso diz tudo: