Upload. Scan. Detect. Emulate. Report.
- About
- Features
- Tech Stack
- Project Structure
- Architecture
- Getting Started
- Available Scripts
- Application Pages
- API Overview
- Database Schema
- Theming
- Roadmap
- Known Limitations
- FAQ
- License
- Maintainers
FirmStrike (internally named Viv Scanner) is a full-stack cybersecurity platform built for security researchers, IoT manufacturers, and pentesters who need to analyze embedded and IoT firmware at scale.
Instead of juggling a dozen separate command-line tools, FirmStrike gives you one dashboard to:
- Upload a firmware image
- Extract and statically analyze its contents
- Cross-reference known vulnerabilities against CVE databases
- Scan for malware signatures and hardcoded secrets
- Emulate the firmware in a QEMU sandbox to observe real runtime behavior
- Generate a shareable, downloadable security report
The goal is to compress what normally takes hours of manual firmware reverse engineering into a guided, repeatable workflow.
Note: This project is under active development. Some scan pipelines currently run against simulated/seeded data while the live analysis engines are being wired in β see Known Limitations.
- Upload firmware images directly through the web UI
- Automatic file extraction and content inventory
- Per-scan telemetry: file counts, extraction progress, timestamps
- Detection of hardcoded secrets (API keys, credentials, tokens)
- Flagging of dangerous/unsafe function usage
- Automated severity scoring per finding
- CVSS score breakdown for matched vulnerabilities
- Direct links out to NVD (National Vulnerability Database)
- Matched security advisories tied to detected components
- Hash-based matching against known malware signatures (VirusTotal-style)
- Visual threat-score meters for quick triage
- Boot firmware images inside an ARM emulator
- Discover open network ports and running services at runtime
- Useful for validating whether a static finding is actually exploitable
- Live threat metrics, vulnerability trend charts, and risk distribution
- AI-assisted risk summaries and exploit-probability estimates
- One-click downloadable PDF reports for stakeholders
- Login/registration flow with session-based authentication
| Layer | Technology |
|---|---|
| Monorepo tooling | pnpm workspaces, Node.js 24, TypeScript 5.9 |
| Frontend | React, Vite, Wouter (routing), Recharts (charts), Framer Motion (animation), Tailwind CSS v4, shadcn/ui |
| Backend / API | Express 5 |
| Database | PostgreSQL |
| ORM | Drizzle ORM (+ drizzle-zod) |
| Validation | Zod (zod/v4) |
| API contract & codegen | OpenAPI spec, generated via Orval into typed React Query hooks |
| Build tooling | esbuild (CJS bundle output) |
| Formatting | Prettier |
FirmStrike/
βββ artifacts/
β βββ viv-scanner/ # React frontend (cyberpunk dark theme)
β β βββ src/
β β βββ pages/
β β β βββ Dashboard.tsx
β β β βββ FirmwareLibrary.tsx
β β β βββ ScanDetails.tsx
β β β βββ SecurityAnalysis.tsx
β β β βββ CveIntelligence.tsx
β β β βββ MalwareDetection.tsx
β β β βββ QemuEmulation.tsx
β β β βββ ReportsAi.tsx
β β β βββ Login.tsx
β β β βββ Register.tsx
β β βββ components/
β β βββ Layout.tsx # Sidebar + main content shell
β β βββ theme-provider.tsx
β β βββ ui/ # shadcn/ui components
β β
β βββ api-server/
β βββ src/
β βββ routes/
β βββ auth.ts
β βββ firmware.ts
β βββ scanner.ts
β βββ security.ts
β βββ cve.ts
β βββ malware.ts
β βββ qemu.ts
β βββ reports.ts
β βββ dashboard.ts
β
βββ lib/
β βββ api-spec/
β β βββ openapi.yaml # Source-of-truth OpenAPI contract
β βββ api-client-react/ # Generated React Query hooks + Zod schemas
β βββ db/
β βββ src/schema/ # Drizzle ORM schema (users, firmware, scans, security, index)
β
βββ scripts/ # Workspace-level scripts
βββ attached_assets/ # Static/reference assets
βββ .gitignore
βββ package.json
βββ pnpm-lock.yaml
βββ pnpm-workspace.yaml
βββ tsconfig.base.json
βββ tsconfig.json
βββ replit.md # Internal engineering notes
- Contract-first API β
lib/api-spec/openapi.yamlis the single source of truth. Both the server-side validation schemas and the frontend's typed React Query hooks are generated from it via Orval, so the client and server never drift out of sync. - Monorepo via pnpm workspaces β the frontend (
viv-scanner), backend (api-server), and shared packages (api-spec,api-client-react,db) live side by side and are typechecked/built together. - Session-based auth β implemented with
express-sessionand aSESSION_SECRET, with the full login/registration flow scaffolded and ready to be wired up end-to-end. - Routing convention β all API routes are served under the
/api/prefix; the frontend SPA is served at/. - Cyberpunk dark theme β built with Tailwind CSS v4 custom variants (
@custom-variant dark (&:is(.dark *))), toggled by adding a.darkclass to<html>viatheme-provider.tsx.
βββββββββββββββββββββββ OpenAPI spec βββββββββββββββββββββββ
β lib/api-spec β ββββββββββββββββββββββββββΆ β Orval codegen β
β (openapi.yaml) β β β
βββββββββββββββββββββββ ββββββββββββ¬βββββββββββ
β
ββββββββββββββββββββββββββ΄βββββββββββββββββββββββββ
βΌ βΌ
βββββββββββββββββββββββββ βββββββββββββββββββββββββ
β lib/api-client-react β β api-server route β
β (typed hooks + Zod) β β validation (Zod schemas)β
ββββββββββββ¬βββββββββββββ ββββββββββββ¬ββββββββββββ
β β
βΌ βΌ
βββββββββββββββββββββββββ βββββββββββββββββββββββββ
β viv-scanner frontend β ββββ HTTP /api/* βββββΆ β Express 5 API server β
β (React + Vite) β β β
βββββββββββββββββββββββββ ββββββββββββ¬ββββββββββββ
βΌ
βββββββββββββββββββββββββ
β PostgreSQL + Drizzle β
βββββββββββββββββββββββββ
- Node.js 24+
- pnpm β this workspace is pnpm-only. The
preinstallscript actively blocksnpm/yarninstalls and will exit with an error telling you to use pnpm. - A running PostgreSQL instance
git clone https://github.com/Redkrossresearch/FirmStrike.git
cd FirmStrike
pnpm installCreate a .env file (or export these in your shell) before running the API server:
| Variable | Required | Description |
|---|---|---|
DATABASE_URL |
β | PostgreSQL connection string |
SESSION_SECRET |
β | Secret used to sign session cookies |
Run the frontend and API server in separate terminals:
# Terminal 1 β API server (http://localhost:8080)
pnpm --filter @workspace/api-server run dev
# Terminal 2 β React frontend (http://localhost:25439)
pnpm --filter @workspace/viv-scanner run devThen open http://localhost:25439 in your browser.
| Command | Description |
|---|---|
pnpm install |
Install all workspace dependencies |
pnpm run typecheck |
Typecheck every package in the workspace |
pnpm run build |
Typecheck, then build all packages |
pnpm --filter @workspace/api-server run dev |
Start the Express API server in dev mode |
pnpm --filter @workspace/viv-scanner run dev |
Start the React frontend in dev mode |
pnpm --filter @workspace/api-spec run codegen |
Regenerate API hooks & Zod schemas from openapi.yaml |
pnpm --filter @workspace/db run push |
Push Drizzle schema changes to the database (dev only) |
β οΈ Do not runpnpm add --no-frozen-lockfilein this workspace β it can desync the lockfile across packages.
| Page | Purpose |
|---|---|
| Dashboard | Live threat metrics, vulnerability trends, risk distribution overview |
| Firmware Library | Upload, browse, and manage firmware images |
| Scan Details | Per-scan extraction telemetry and progress |
| Security Analysis | Hardcoded secrets, dangerous functions, severity scores |
| CVE Intelligence | CVSS breakdowns, NVD links, matched advisories |
| Malware Detection | Hash-based threat matching and scoring |
| QEMU Emulation | Boot firmware, inspect open ports and running services |
| Reports & AI | Risk summaries, exploit probability, PDF export |
| Login / Register | Session-based account access |
All backend routes are namespaced under /api/ and grouped by domain in artifacts/api-server/src/routes/:
| Route file | Responsibility |
|---|---|
auth.ts |
Login, registration, session handling |
firmware.ts |
Firmware upload and library management |
scanner.ts |
Scan orchestration and progress tracking |
security.ts |
Static/binary security analysis findings |
cve.ts |
CVE matching and CVSS data |
malware.ts |
Malware hash matching |
qemu.ts |
QEMU emulation control and results |
reports.ts |
Report generation (including AI summaries) |
dashboard.ts |
Aggregated metrics for the dashboard view |
The full contract lives in lib/api-spec/openapi.yaml. After changing it, regenerate the typed client with:
pnpm --filter @workspace/api-spec run codegenSchema is defined with Drizzle ORM in lib/db/src/schema/, covering:
usersβ accounts and auth datafirmwareβ uploaded firmware image recordsscansβ scan jobs and their progress/statussecurityβ findings from static/binary analysisindexβ shared schema exports
Seed data currently includes 4 firmware records (D-Link β critical, TP-Link β high, Netgear β scanning, Asus β pending), 12 vulnerabilities, 6 CVEs, 7 malware hashes, and 6 activity events β useful for local development and demos.
FirmStrike ships with a dark "cyberpunk" theme by default:
- Accent: electric teal
#00e5cc - Background: near-black
#0a0f14 - Implemented with Tailwind CSS v4 custom properties scoped to a
.darkclass, applied viatheme-provider.tsx
If you're extending the UI, keep in mind a few Recharts/shadcn quirks encountered in this codebase:
- Recharts
<Cell>must be imported and capitalized β a lowercase<cell>is invalid JSX - The
RadialBarprop isisClockWise, notclockWise, in the current Recharts version - shadcn's
Progresscomponent doesn't acceptindicatorColorβ use a Tailwind arbitrary selector like[&>div]:bg-...instead useGetRunningServicesreturns anEmulationLog[]array, not a single object β access it asservices?.[0]?.runningServices
- Replace simulated scan progression with real static/binary analysis pipelines
- Wire up live firmware extraction (e.g. Binwalk-based) end to end
- Connect CVE Intelligence to a live NVD/CVE feed
- Real malware hash lookups against an external threat-intel source
- Harden QEMU emulation sandboxing for untrusted firmware
- Full end-to-end auth flow (password reset, email verification)
- CI pipeline for typecheck/build/test on pull requests
Have an idea or priority you'd like bumped up? Open an issue!
- Some scan flows currently simulate progression via
setTimeoutrather than performing live analysis β this is being replaced incrementally. - APIs and schemas may change without notice while the project is in active development.
- No automated test suite yet.
Q: Why does it say "Use pnpm instead" when I try npm install?
This workspace enforces pnpm via a preinstall script. Install pnpm (npm i -g pnpm) and use that instead.
Q: Is the security analysis using real tools like Binwalk or Ghidra right now? Not yet end-to-end β some pipelines currently run against simulated/seeded data while live integrations are built out. See Roadmap.
Q: What ports do the frontend and API run on locally?
Frontend: 25439. API server: 8080.
Distributed under the MIT License. See LICENSE for details (add one if not already present).
Maintained by Redkrossresearch.
Made with β and a healthy paranoia about firmware.