
HikCentral Professional - Perdita Pre-Auth di ActiveCode della licenza
Prima di scaricare qualsiasi cosa, cosa è già pubblico:
| Fonte | Cosa ci dice |
|---|---|
| Hikvision security advisory | "Controlli di autenticazione mancanti sugli endpoint API", consiglio di aggiornare a V2.6.3 / V3.0.1 |
| NVD CVE-2025-39247 | Metriche CVSS; vettore è rete, nessuna autenticazione, ambito modificato, riservatezza alta |
| Riepiloghi di Wiz, ZeroPath, SentinelOne, OffSeq, gbhackers, cybersecuritynews | Tutti ripetono l'avviso; nessun dettaglio tecnico, nessun PoC, nessun endpoint interessato nominato |
| Aggregatori GitHub PoC (poc-in-github, 0xMarcio/cve, ecc.) | Nessun PoC indicizzato |
| Forum (ipcamtalk, cctvforum, reddit), indicizzatori torrent | Nessun PoC, nessun installer trapelato; ipcamtalk ha un thread sull'uso di HikCentral ma niente relativo a exploit |
Quindi, alla data dell'analisi, nessun documento tecnico pubblico espone il bug. Qualsiasi riproduzione parte dal diff binario.
Dopo la pubblicazione di CVE-2025-39247, la pagina di download di V2.6.2 è stata rimossa dalla lista, ma il file sul CDN non è mai stato eliminato. Il nome del file può essere recuperato da un mirror di terze parti che ha indicizzato la pagina prima della rimozione (FileHorse — ha pubblicato il nome del file e l'MD5). Con quel nome file, una semplice GET al CDN di Hikvision — utilizzando solo un normale User-Agent del browser e un header Referer corrispondente — lo serve ancora.```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"
Risultato:
- Dimensione: 1,314,043,792 byte (1.22 GB)
- MD5: `76d42e7cb16dc0e177b9a35d0fed7ced` — corrisponde al valore pubblicato da FileHorse, confermando l'installer genuino firmato Hikvision (non un re-bundle di terze parti)
- Intestazioni della risposta CDN: `HTTP/2 200`, `content-type: application/x-msdownload`, `eo-cache-status: HIT`, `age: 2520395` (≈ 29 giorni nella cache perimetrale di Tencent EdgeOne senza sfratto)
**Osservazione collaterale degna di essere segnalata al PSIRT di Hikvision:** la "rimozione" della pagina V2.6.2 è solo estetica. Il file orfano è raggiungibile sulla CDN senza autenticazione e senza un gate URL firmato. I Full Pack V2.5.1 e V2.6.0 rispondono allo stesso modo.
### 2.2 Installer corretto (V2.6.3 Base Pack)
Attualmente collegato dalla pagina di download di V2.6.3; stesso metodo di recupero:```
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
Ancora collegato dalla pagina di download V2.6.2 (Hikvision vuole che gli utenti lo applichino):``` 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
- Dimensione: 32,599,504 bytes (31 MB)
---
## 3. Estrazione statica
Tutti e tre sono wrapper PE di tipo InstallShield. `7z` li estrae in due passaggi:```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
Both installers expand into roughly two dozen named payload archives. The top-level dirs reveal the architecture:
| Archivio | Contenuto |
|---|---|
246/Nginx + 246/www | Livello web Nginx (la porta d'ingresso) e l'interfaccia web SPA |
244/bin | Binari nativi C++ del servizio + certificati |
240 | PostgreSQL in bundle + script di inizializzazione DB |
238 | Runtime Bee* (BeeAgent, BeeGuard, …) |
282 | Servizi applicativi e addon (la maggior parte del codice backend C++) |
281, 283-284, 396, 398-399, 513, 520, 538-541, 573 | Addon più piccoli, plugin, stub di aggiornamento/disinstallazione |
Fondamentalmente, non ci sono JAR/WAR Java da nessuna parte. Il backend è C++ su Nginx — importante perché ti dice subito che qualsiasi vulnerabilità di autenticazione sarà nei binari compilati, non nel bytecode WAR/JAR dove la decompilazione è banale.
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]]
Risultato: 239 file modificati in percorsi comuni. Distribuzione:
| Bucket | Conteggio | Commento |
|---|---|---|
| `246/www/*.js` (blocchi Web UI) | ~200 | Per lo più hash di asset aggiornati per versione; ignora |
| `246/Nginx/conf/nginx_location.conf` | **1** | **Delta configurazione Nginx a file singolo — inizia da qui** |
| `246/Nginx*/install.bat` | 6 | Script di installazione, non correlati |
| `244/bin/*.{exe,dll}` | 6 | Binari nativi (`DistributionFilter.dll`, `FilterChain.dll`, strumenti multimediali) |
| `282/*.{exe,dll}` | 55 | Servizi applicativi (il cluster più grande — `platform.dll`, `PersonCredential.dll`, `baseacs.*`, …) |
| `240/bin/pg_*` | 6 | Rebuild di Postgres, non correlato |
| `284/hplugin/dahua_plugin/*` | 4 | Aggiornamento SDK fornitore (+10.97 MB) — non correlato |
| `284/hplugin/onvif_plugin/*` | 4 | Aggiornamento SDK fornitore (+0.99 MB) — non correlato |
| stub di upgrade/disinstallazione, crash reporter | ~30 | Ricostruzioni timestamp PE della stessa dimensione, ignora |
Dopo aver filtrato l'aggiornamento SDK del fornitore, lo scostamento timestamp del sistema di build e i puri incrementi estetici degli asset, i delta *effettivamente* rilevanti per la sicurezza si riducono a:
- Un file di configurazione Nginx
- Un piccolo numero di binari C++ in `282/` (principalmente `platform.dll`, il servizio backend HCMP, +57 KB)
---
## 5. Il diff di Nginx: individuazione gratuita del bug
`diff -u nginx_location.conf` tra V2.6.2 e V2.6.3 produce esattamente un hunk: un blocco `location =` completamente nuovo in 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; }
}
Quella singola aggiunta di 21 righe costituisce l'intera correzione di CVE-2025-39247 a livello di front-door, e ti dice tutto: