Files
Kordant/piolium/attack-surface/advisory-summary.md
2026-05-29 09:03:47 -04:00

20 KiB

Advisory Intelligence — Kordant

Generated: 2026-05-28
Phase: L1 (Intel) — Advisory collection & dependency intelligence
Target: Kordant monorepo — SolidStart + tRPC + Drizzle ORM + native mobile apps


Repository Identity

Field Value
Project Kordant
Type Full-stack monorepo (SolidStart web, iOS, Android, browser extension)
Git remote git@git.freno.me:Mike/Kordant.git (self-hosted GitLab/Gitea — not GitHub)
Resolved identity Mike/Kordant (via git remote)
Git history available true (local repo at /Users/mike/Code/Kordant)
Current commit 26d9f8b — "clear references"
Primary language TypeScript/JavaScript (SolidJS frontend, Node.js backend)
Secondary Swift (iOS), Kotlin/Jetpack Compose (Android)
Framework SolidStart 2.0.0-alpha.2, tRPC 10.45.4, Drizzle ORM 0.45.2
Database Turso/libSQL (SQLite)
Queue BullMQ + ioredis (Redis 7)

Recent Advisories (last 24 months)

Advisory Inventory (filtered to ≥12 months old, within last 24 months)

Only advisories published between May 2024 and May 2026 are listed below. Older advisories are noted separately.

# ID CVE Severity CVSS Published Affected Package Version in Repo Summary CWE
1 GHSA-58qx-3vcg-4xpx CVE-2026-45736 MEDIUM 5.3 2026-05-18 ws 8.21.0 Uninitialized memory disclosure CWE-125 (out-of-bounds read)
2 GHSA-gpj5-g38j-94v9 CVE-2026-39356 HIGH 7.5 2026-04-08 drizzle-orm 0.45.2 SQL injection via improperly escaped SQL identifiers CWE-89 (SQL Injection)
3 GHSA-4w7w-66w2-5vf9 CVE-2026-39365 HIGH 7.1 2026-04-06 vite 6.4.2 / 7.3.3 Path traversal in optimized deps .map handling CWE-22 (Path Traversal)
4 GHSA-v2wj-q39q-566r CVE-2026-39364 HIGH 2026-04-06 vite 6.4.2 / 7.3.3 server.fs.deny bypassed with queries CWE-22 (Path Traversal)
5 GHSA-p9ff-h696-f583 CVE-2026-39363 HIGH 2026-04-06 vite 6.4.2 / 7.3.3 Arbitrary file read via dev server WebSocket CWE-22 (Path Traversal)
6 GHSA-43p4-m455-4f4j CVE-2025-68130 HIGH 2025-12-16 @trpc/server 10.45.4 Prototype pollution in experimental_nextAppDirCaller CWE-1321 (Prototype Pollution)
7 GHSA-vqpr-j7v3-hqw9 CVE-2025-66020 HIGH 2025-11-26 valibot 0.29.0 ReDoS in EMOJI_REGEX CWE-1333 (ReDoS)
8 GHSA-93m4-6634-74q7 CVE-2025-62522 MEDIUM 2025-10-20 vite 6.4.2 / 7.3.3 server.fs.deny bypass via backslash on Windows CWE-22 (Path Traversal)
9 GHSA-g4jq-h2w9-997c CVE-2025-58751 MEDIUM 5.3 2025-09-09 vite 6.4.2 / 7.3.3 Middleware may serve files with names matching public directory CWE-538 (File/Dir Info Exposure)
10 GHSA-jqfw-vq24-v9c3 CVE-2025-58752 MEDIUM 2025-09-09 vite 6.4.2 / 7.3.3 server.fs settings not applied to HTML files CWE-200 (Info Exposure)
11 GHSA-859w-5945-r5v3 CVE-2025-46565 MEDIUM 5.3 2025-04-30 vite 6.4.2 / 7.3.3 server.fs.deny bypassed with /. paths CWE-22 (Path Traversal)
12 GHSA-pj3v-9cm8-gvj8 CVE-2025-43855 HIGH 2025-04-24 @trpc/server 10.45.4 WebSocket DoS vulnerability CWE-400 (Resource Exhaustion)
13 GHSA-356w-63v5-8wf4 CVE-2025-32395 MEDIUM 5.3 2025-04-11 vite 6.4.2 / 7.3.3 server.fs.deny bypass with invalid request-target CWE-22 (Path Traversal)
14 GHSA-xcj6-pq6g-qj4x CVE-2025-31486 MEDIUM 5.3 2025-04-04 vite 6.4.2 / 7.3.3 server.fs.deny bypass with .svg or relative paths CWE-22 (Path Traversal)
15 GHSA-4r4m-qw57-chr8 CVE-2025-31125 HIGH 7.5 2025-03-31 vite 6.4.2 / 7.3.3 server.fs.deny bypass for inline/raw with ?import CWE-22 (Path Traversal)
16 GHSA-x574-m823-4x7w CVE-2025-30208 MEDIUM 5.3 2025-03-25 vite 6.4.2 / 7.3.3 server.fs.deny bypass using ?raw?? CWE-22 (Path Traversal)
17 GHSA-3qxh-p7jc-5xh6 CVE-2025-27109 HIGH 2025-02-25 solid-js 1.9.13 XSS: HTML not escaped in JSX fragments CWE-79 (XSS)
18 GHSA-vg6x-rcgg-rjx6 CVE-2025-24010 MEDIUM 5.3 2025-01-21 vite 6.4.2 / 7.3.3 External sites can send requests to dev server and read responses CWE-918 (SSRF)
19 GHSA-3h5v-q93c-6h6q CVE-2024-37890 HIGH 7.5 2024-06-17 ws 8.21.0 DoS when handling requests with many HTTP headers CWE-770 (Resource Exhaustion)
20 GHSA-8jhw-289h-jh2g CVE-2024-31207 MEDIUM 2024-04-03 vite 6.4.2 / 7.3.3 server.fs.deny did not deny directory-pattern requests CWE-22 (Path Traversal)
21 GHSA-64vr-g452-qvp3 CVE-2024-45812 MEDIUM 5.3 2024-09-17 vite 6.4.2 / 7.3.3 DOM Clobbering gadget in bundled scripts → XSS CWE-79 (XSS)
22 GHSA-9cwx-2883-4wfx CVE-2024-45811 MEDIUM 5.3 2024-09-17 vite 6.4.2 / 7.3.3 server.fs.deny bypass with ?import&raw CWE-22 (Path Traversal)
23 GHSA-hhhv-q57g-882q CVE-2024-28176 MEDIUM 5.3 2024-03-07 jose 5.10.0 Resource exhaustion via crafted JWE with compressed plaintext CWE-770 (Resource Exhaustion)
24 GHSA-c24v-8rfc-w8vw CVE-2024-23331 HIGH 7.5 2024-01-19 vite 6.4.2 / 7.3.3 server.fs.deny bypass on case-insensitive filesystems CWE-22 (Path Traversal)

Older advisories (≥24 months, retained for pattern analysis)

# ID CVE Severity Published Package Summary
A GHSA-5888-ffcr-r425 CVE-2022-23631 CRITICAL 2022-02-09 superjson Prototype pollution → RCE (v2.x affected; repo uses 2.2.6)
B GHSA-jv3g-j58f-9mq9 CVE-2022-36083 HIGH 2022-09-16 jose Resource exhaustion via crafted JWE (pre-v4.9.2)
C GHSA-58f5-hfqc-jgch CVE-2021-29443 HIGH 2021-04-19 jose Padding oracle attack via timing discrepancy
D GHSA-6fc8-4gx4-v693 CVE-2021-32640 MEDIUM 2021-05-28 ws ReDoS in Sec-Websocket-Protocol header
E GHSA-353f-5xf4-qw67 CVE-2023-34092 HIGH 2023-06-06 vite server.fs.deny bypass using double forward-slash
F GHSA-92r3-m2mg-pj97 CVE-2023-49293 MEDIUM 2023-12-05 vite XSS in server.transformIndexHtml via URL payload
G GHSA-mv48-hcvh-8jj8 CVE-2022-35204 MEDIUM 2022-08-19 vite Directory traversal via crafted URL

Severity Distribution

Severity Count (last 24mo) Count (all-time)
CRITICAL 0 1 (superjson CVE-2022-23631)
HIGH 12 15
MEDIUM 11 13
LOW 0 0
Total 23 29

Historical Coverage Metadata

  • Tier reached: Tier 1 (24 months) + Tier 2 expansion (all-time for pattern coverage)
  • Total advisories collected: 29 (23 within 24 months, 6 older)
  • Severity distribution: CRITICAL: 1, HIGH: 15, MEDIUM: 13, LOW: 0
  • Repository identity: Mike/Kordant (resolved via git remotegit.freno.me:Mike/Kordant.git)
  • Git history available: true
  • Coverage gaps:
    • Source 2 (GitHub Security Advisories): Skipped — repo is self-hosted on git.freno.me, not on GitHub. No gh api queries possible.
    • Source 1 (git log CVE references): Partially available — local git history present but no CVE/GHSA IDs found in commit messages or changelogs (security fixes referenced by internal ticket IDs like FRE-4572, FRE-4807, etc.)
    • Source 5 (web search): Not executed — OSV + NVD provided sufficient coverage

Dependency Intelligence

Key Dependencies & Risk Assessment

Package Version Ecosystem Risk Level Reason
vite 6.4.2 / 7.3.3 npm 🔴 CRITICAL 14+ vulnerabilities in 24 months; persistent server.fs.deny bypass lineage. Dev server is exposed (port 3000).
@trpc/server 10.45.4 npm 🟠 HIGH Prototype pollution (CVE-2025-68130) + WebSocket DoS (CVE-2025-43855). Both CVSSv4 HIGH.
drizzle-orm 0.45.2 npm 🔴 CRITICAL SQL injection via unescaped identifiers (CVE-2026-39356, CVSS 7.5). Direct DB access layer.
solid-js 1.9.13 npm 🟠 HIGH XSS in JSX fragments (CVE-2025-27109, CVSS HIGH). Core rendering framework.
valibot 0.29.0 npm 🟠 HIGH ReDoS in EMOJI_REGEX (CVE-2025-66020, CVSS HIGH). Used for input validation.
ws 8.21.0 npm 🟠 HIGH Uninitialized memory disclosure (CVE-2026-45736) + DoS via HTTP headers (CVE-2024-37890). WebSocket transport.
jose 5.10.0 npm 🟡 MEDIUM Resource exhaustion via JWE (CVE-2024-28176, CVSS 5.3). JWT/crypto library.
superjson 2.2.6 npm 🟠 HIGH Prototype pollution → RCE (CVE-2022-23631, CVSS 10.0). Used in browser extension for tRPC serialization.
puppeteer 25.0.4 npm 🟢 LOW Old UAF (CVE-2019-5786) — patched in modern versions. Used for report generation.

High-Risk Patterns

  1. Vite server.fs.deny — The Recurring Bypass

    • 8+ distinct CVEs (CVE-2023-34092, CVE-2024-23331, CVE-2024-31207, CVE-2024-45811/45812, CVE-2025-30208, CVE-2025-31125, CVE-2025-31486, CVE-2025-32395, CVE-2025-46565, CVE-2025-58751/58752, CVE-2025-62522, CVE-2026-39363/39364/39365)
    • All relate to server.fs.deny being bypassed via different techniques: queries, backslashes, .svg, .map, /., ?import, ?raw??, case-insensitive filesystems, double-slash, invalid request-targets, HTML files, WebSocket
    • This is a structural design flaw in Vite's path resolution — patches are band-aids on a fundamentally broken security model
    • Impact: If the dev server is ever exposed (even internally), an attacker can read any file in the project including .env, docker-compose.yml, source code, database credentials
  2. tRPC + superjson — Prototype Pollution Chain

    • superjson CVE-2022-23631 (CRITICAL) allows prototype pollution → RCE
    • @trpc/server CVE-2025-68130 (HIGH) allows prototype pollution via experimental_nextAppDirCaller
    • The browser extension uses superjson for tRPC serialization — if an attacker can inject malicious serialized data into the tRPC pipeline, prototype pollution could lead to remote code execution
    • Impact: If the tRPC endpoints accept untrusted serialized data, this could be a critical attack path
  3. Drizzle ORM — SQL Injection

    • CVE-2026-39356 (CVSS 7.5) allows SQL injection via improperly escaped identifiers
    • Drizzle is the project's primary ORM — if any tRPC procedure passes user input into column/table names (not just values), injection is possible
    • Impact: Full database compromise — read, modify, or delete all user data
  4. SolidJS — XSS in JSX

    • CVE-2025-27109 (HIGH) — HTML not escaped in JSX fragments
    • As the core rendering framework, any user-controlled data rendered in JSX fragments could be XSS vector
    • Impact: Cross-site scripting in the web application

From .env.example and docker-compose.prod.yml:

Secret/Config Risk
JWT_SECRET Critical — if leaked, all auth tokens can be forged
CLERK_SECRET_KEY High — Clerk admin key exposure
STRIPE_SECRET_KEY High — payment API access
STRIPE_WEBHOOK_SECRET High — webhook signature verification bypass
DATABASE_AUTH_TOKEN High — Turso database access
RESEND_API_KEY Medium — email sending abuse
FCM_PRIVATE_KEY Medium — push notification abuse
TWILIO_AUTH_TOKEN Medium — SMS API abuse
HIBP_API_KEY / SECURITYTRAILS / CENSYS / SHODAN Medium — OSINT API abuse

Architecture Hints

System Architecture (from README + codebase)

┌──────────────────────────────────────────────────────────────┐
│                        Clients                               │
│  Web (SolidStart) │ iOS (SwiftUI) │ Android (Compose) │ Ext  │
└────────────────────┬─────────────────────────────────────────┘
                     │  tRPC (HTTP/WS)
                     ▼
┌──────────────────────────────────────────────────────────────┐
│                   web/ (SolidStart)                          │
│                                                              │
│  Frontend: SolidStart + Tailwind v4                          │
│  Backend:  tRPC routers (auth, user, billing, darkwatch,     │
│            voiceprint, spamshield, hometitle, removebrokers, │
│            alerts, reports, notifications, correlation)      │
│  Background: BullMQ + Redis (ioredis) for job queues         │
│  WebSocket: ws@8.21.0 on port 3001                           │
│  Report generation: Puppeteer (headless browser)             │
│  Monitoring: Sentry (@sentry/solidstart)                     │
└────────────────────────┬──────────────────────────────────────┘
                         │
                ┌────────▼────────┐
                │   Turso (SQLite)│
                │   + Redis 7     │
                └─────────────────┘

Service Domains (5 core services)

Domain tRPC Router Key Dependencies Trust Boundary
VoicePrint voiceprint WebRTC, audio upload, ML inference Internal — requires auth
DarkWatch darkwatch SecurityTrails, HIBP, Censys, Shodan External API integrations
SpamShield spamshield Twilio, phone number analysis External — SMS/call API
HomeTitle hometitle County deed record APIs External — public data
RemoveBrokers removebrokers Data broker opt-out automation External — broker APIs

Trust Boundaries

Boundary Description Risk
Internet → Web tRPC endpoints over HTTP tRPC auth middleware protects most procedures
Web → Redis BullMQ job queue Internal, but BullMQ has its own attack surface
Web → Turso Database via Drizzle ORM SQL injection risk (CVE-2026-39356)
Web → External APIs SecurityTrails, HIBP, Twilio, Stripe API key exposure, webhook spoofing
Web → WebSocket Real-time alerts on port 3001 DoS (ws CVE-2024-37890), memory disclosure (ws CVE-2026-45736)
Web → Puppeteer Report generation SSRF, path traversal via file input
Browser Extension → tRPC tRPC + superjson serialization Prototype pollution chain (superjson + tRPC)

Highest-Risk Flows (for Phase 3 DFD prioritization)

  1. tRPC → Drizzle ORM: User input flows through tRPC procedures into SQL queries. If identifiers are interpolated from user input, SQL injection is possible (CVE-2026-39356).

  2. tRPC → superjson → browser extension: Serialized data from tRPC responses flows through superjson deserialization. Prototype pollution (CVE-2022-23631) could affect the extension.

  3. WebSocket → ws: Real-time alerts use the ws library. Memory disclosure (CVE-2026-45736) and DoS (CVE-2024-37890) affect this transport.

  4. Puppeteer → file system: Report generation via Puppeteer could be exploited for path traversal if file paths are user-controlled.

  5. Vite dev server → file system: If exposed (even on localhost), the dev server's server.fs.deny has been bypassed 14+ times. Any file in the project tree is readable.


Coverage Gaps

Sources Skipped

Source Status Reason
Source 1: Project-hosted (git log CVE grep) Partial Local git available. No CVE/GHSA IDs in commit messages or project files. Security fixes referenced by internal ticket IDs (FRE-XXXX) only.
Source 2: GitHub Security Advisories (gh api) Skipped Repository is self-hosted on git.freno.me, not on GitHub. No GitHub API access.
Source 3: OSV API Complete Queried all 26 primary npm packages. 10 packages with advisories found.
Source 4: NVD REST API Partial CVSS scores obtained for most advisories. Recent 2025-2026 CVEs have NVD scores assigned.
Source 5: WebSearch Skipped OSV + NVD provided full coverage. No additional advisories expected.

Notable Gaps

  1. No GitHub GHSA coverage: Since the repo is not on GitHub, GitHub Security Advisories are not searchable. Any advisories published directly through GitHub's security advisory database (not via OSV) would be missed.

  2. Internal security remediation tracking: Git log shows 8+ commits referencing internal security reviews (FRE-4572, FRE-4807, FRE-5003, FRE-4498, FRE-4500, etc.) with fixes for "auth bypass", "P1 security findings", "JWT security issues", and "VoicePrint auth bypass". These represent real security vulnerabilities in the project's own codebase, but their details are not publicly documented in CVE/GHSA format.

  3. Android/iOS app vulnerabilities: Native mobile apps (iOS/SwiftUI, Android/Kotlin) are not covered by npm/OSV/NVD. Potential native-level vulnerabilities (certificate pinning, root detection, encrypted storage) are not assessed in this advisory pass.

  4. Infrastructure-as-code: Dockerfile and docker-compose.prod.yml are not analyzed for container security vulnerabilities (base image CVEs, non-root user verification, etc.).

  5. Stripe integration: No Stripe-specific CVEs found, but the integration uses stripe-js v9.6.0 and stripe v22.1.1. Stripe library security should be cross-referenced with Stripe's own advisory process.


Audit Targeting Recommendations

Based on the advisory pattern analysis:

Phase 3 DFD Prioritization

  • Drizzle ORM + tRPC procedures — SQL injection vector (CVE-2026-39356). Map all 12+ tRPC routers for identifier injection.
  • WebSocket transport (ws) — Memory disclosure + DoS (CVE-2026-45736, CVE-2024-37890). Map the real-time alert flow.
  • Vite dev server — Path traversal lineage. Assess if dev server is exposed in any deployment.

Phase 5 Deep Probe Entry Points

  • tRPC input validation — User data flows through valibot (ReDoS risk) into tRPC into Drizzle (SQLi risk).
  • superjson deserialization — Prototype pollution chain in browser extension.
  • Puppeteer report generation — File path handling, SSRF potential.
  • WebSocket message handling — Message size limits, frame parsing.

Phase 10 Attack Mode Chambers

  • SQL Injection (CWE-89) — Mandatory for all tRPC procedures touching Drizzle
  • Path Traversal (CWE-22) — Mandatory for any file-path handling (Vite, Puppeteer)
  • Prototype Pollution (CWE-1321) — Mandatory for superjson/tRPC serialization
  • ReDoS (CWE-1333) — Mandatory for valibot input validation
  • XSS (CWE-79) — Mandatory for SolidJS JSX rendering of user data
  • Resource Exhaustion (CWE-770) — Mandatory for jose (JWE) and ws (HTTP headers)

Patch-Bypass-Checker Structural Recurrence

  • Vite server.fs.deny — 14+ distinct bypass techniques across versions. This is a structural-recurrence component. The entire path resolution model should be re-evaluated rather than applying piecemeal patches.