-
Notifications
You must be signed in to change notification settings - Fork 166
Dashboard
The / page is the operator landing screen β at-a-glance health, scanner inventory, and EDR-fleet status. Everything is async-loaded by the page's JS so the initial render is instant and the live data fills in.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LitterBox v5.0.0 [Cleanup] β
β Sandbox status / fleet posture / quick links β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ββ Sandbox health βββββββββββ ββ Local scanners βββββββββββββ β
β β Upload folder OK β β Static yara, checkplz, β β
β β Result folder OK β β stringnalyzer β β
β β Doppelganger DB OK β β Dynamic yara, pe-sieve, β β
β β HolyGrail tool OK β β moneta, patriot, β β
β β β β hsb, rededr, β β
β β Issues: 0 β β hollows-hunter β β
β βββββββββββββββββββββββββββββ β HolyGrail enabled, found β β
β βββββββββββββββββββββββββββββββ β
β β
β ββ EDR fleet βββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β elastic β agent reachable Β· β Elastic stack Β· DESKTOP-... β β
β β fibratus β agent reachable Β· β Fibratus installed Β· ... β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββ Recent samples (last 10) βββββββββββββββββββββββββββββββββββ β
β β hash Β· filename Β· type Β· detection score Β· profiles β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
The dashboard makes two async fetches:
| Endpoint | Drives | Refresh |
|---|---|---|
GET /health |
Sandbox health + Local scanners + EDR fleet (one unified payload) | every 60s |
GET /files |
Recent samples | every 60s |
/health covers all three top cards in a single request β it returns scanner inventory under scanners.rows/counts, EDR reachability under edr_agents.agents, and boot-validation issues at the top level.
Polling pauses when the tab is hidden (document.visibilityState === 'hidden') and resumes β with one immediate refresh β when it becomes visible again.
Backed by /health's top-level status + issues. Status is ok (no issues) or degraded (one or more configuration problems β missing tool path, unwritable upload folder, etc.). The sandbox block reports upload_folder_accessible. The scanners and edr_agents blocks drive the other two cards on this page.
Issues are listed verbatim. The most common ones:
-
Tool path is missing for Xβ config hasenabled: truebut notool_path. Either point it at the binary or setenabled: false. -
Configured tool not found: <path>β path is set but file doesn't exist. Often a path-with-backslashes-on-different-machines issue. -
Upload folder does not existβ usually means LitterBox booted butUploads/wasn't created. Restart should fix.
Backed by /health's scanners.rows array. Per-scanner row with:
| Field | Meaning |
|---|---|
enabled |
enabled: true in config? |
tool_path |
Absolute path from config |
exists |
Does the file actually exist? |
status |
ok (enabled + exists), missing (enabled + no file), disabled (not enabled) |
The dashboard groups by static / dynamic / holygrail and color-codes:
- green dot β
ok - red dot β
missing(enabled but binary not on disk β needs attention) - gray dot β
disabled(deliberately off)
Backed by /health's edr_agents.agents array (which delegates to the same TTL-cached probe /api/edr/agents/status exposes). For each registered profile (one YAML under Config/edr_profiles/) it shows:
- Profile name + display name (from the YAML)
-
Kind β
elasticorfibratus -
Whiskers reachable β
GET /api/infosucceeded -
Backend reachable β for
kind: elastic, the Elastic cluster_cluster/health; forkind: fibratus, Fibratus presence flag from/api/info'stelemetry_sources -
Hostname / agent version β self-reported by
/api/info -
Lock state β
free/in_use(from/api/lock/status)
The probe is server-side cached with a 30s TTL and continuously pre-warmed by a background poller in app/services/edr_health.py. Steady-state fetches return instantly from cache. First request after boot waits one probe cycle.
?refresh=1 on /api/edr/agents/status forces a synchronous re-probe (debug aid).
Backed by /files. Lists every analysis result on disk: hash, original filename, file type, detection score, and which EDR profiles ran against it.
The _summary_cache.json (mtime-validated, written by app/services/summary_cache.py) keeps this card under 100 ms even with hundreds of saved samples. The cache regenerates per-sample only when its result-folder mtime changes; otherwise it's served from the JSON cache without re-walking the analyzer outputs.
- Application Architecture β full backend / frontend layout
- HTTP API Reference β every endpoint the dashboard calls
-
All in One Pipeline β the
/analyze/all/<target>page that runs everything in parallel
- π Home
- π§ Application Architecture
- π Dashboard
- π All in One Pipeline
- π― Detection Score Explained
- 𧬠Blender Scanner
- π FuzzyHash Scanner
- π‘οΈ HolyGrail BYOVD Scanner
- π YARA Rules Management