You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Do not open a public GitHub issue for security vulnerabilities.
Email security reports to the project maintainers. You should receive a response within 48 hours. Confirmed issues receive a patch as soon as possible, coordinated with CVE publication if warranted.
Supported Versions
Version
Supported
main branch
✅ Active development / nightly
Tagged releases
✅ Once released
Security Architecture Baseline
GenID implements defense-in-depth across 7 layers. The table below summarizes the audited state of each control (last audit: 2026-07-29).
HTTP client timeout via http.DefaultClient for JWKS fetch
✅ PASS
backend/internal/middleware/jwt_auth.go:231
OWASP Top 10:2025 — Coverage Map
OWASP's flagship Top 10 was refreshed in 2025 (the 2021 list is now superseded). Every
2025 risk category is addressed by a concrete control in this repository — recruiters and
senior engineers can verify each claim by following the file path.
#
OWASP Top 10:2025
GenID Control
Verifiable file
A01
Broken Access Control
Multi-tenant RLS on 28 tables + AWS Cedar policy-as-code (forbid-wins) + WorkflowGuard on 12 sensitive ops
Policy-as-code (Cedar) is the single authority; defense-in-depth across 12 layers; zero-trust gateway; JIT, not long-lived credentials; Redis fence tokens for optimistic concurrency
this file — Layers 1–12, backend/internal/activities/activities.go:285-321
A07
Authentication Failures
RS256 JWT with rotating JWKS, refresh-token rotation, API-key auth with runtime rotation, 5-minute JIT NHI JWTs
Mishandling of Exceptional Conditions (new in 2025, replaces SSRF)
Redis fence tokens guard race conditions (optimistic concurrency); no user-controllable outbound URL fetch surface in the connector framework; panic-recovery middleware is open (queue #11)
backend/internal/activities/activities.go:285-321, backend/internal/connector/, this file — queue item 11
A07 — JWT signing key not persisted across restarts (queue #5)
A04 — HMAC default secret for CAEP webhooks (queue #6)
A02 — Production gate to fail-fast on known default keys (queue #7)
A10 — Panic-recovery HTTP middleware (queue #11)
OWASP Top 10 for LLM Applications:2025 — Agentic Coverage Map
The OWASP Top 10 for LLM/GenAI Applications is a separate, AI-specific list (2025 edition).
GenID is built for the agentic era — its Non-Human Identity governance is a direct mitigation
for LLM06 (Excessive Agency), the single biggest risk when LLM agents act on real systems.
Mapping below is honest: ✅ controlled today, ⛔ low risk by design, ⚠️ partial / production slot.
#
OWASP LLM:2025
GenID stance
Status
LLM01
Prompt Injection
Copilot pipeline is deterministic retrieve→rerank→generate→validate (5-step in ai/copilot.go). Production LLM path needs strict input sanitization.
⚠️ partial
LLM02
Sensitive Information Disclosure
GraphRAG retrieves only what the requesting identity can access (tenancy enforced through RLS on the source PG); confidence scoring flags low-information answers. Production needs PII redaction in LLM responses.
⚠️ partial
LLM03
Supply Chain
Reuses A03 controls (locked deps, reproducible go.sum, pinned images). Model supply chain is a future concern (current copilot is deterministic, no third-party model dependency).
✅
LLM04
Data and Model Poisoning
Graph is sourced from audit-governed Postgres writes, not untrusted user text → poisoning surface is minimal today. Watch when fine-tuning/embedding pipelines land.
✅ by design
LLM05
Improper Output Handling
Copilot returns structured responses (confidence + recommendations), never raw actions to execute; no eval/shell surface.
✅
LLM06
Excessive Agency
🎯 GenID's core thesis. Agents get 5-minute scoped JIT JWTs (never long-lived creds); Cedar narrows an agent's span at evaluation time, not issuance time; policies/agent.cedar scopes agents; the 109ms kill switch revokes a compromised agent identity mid-action. No agent ever holds blanket authority.
✅
LLM07
System Prompt Leakage
No user-facing system prompts today (deterministic copilot); low risk.
⛔
LLM08
Vector and Embedding Weaknesses
Primary retrieval is graph-native (Neo4j Cypher), not flat vector → no cross-tenant vector leakage. The Qdrant hybrid slot is future work, designed to layer on top of tenancy.
✅ by design
LLM09
Misinformation
Confidence scoring (0.6–0.92) + validation step (queue production LLM); recommendations are flagged, not asserted as fact.
The standout message for AI-security recruiters: GenID does not bolt AI onto a legacy IAM.
Its NHI plane is purpose-built to neutralize LLM06 (Excessive Agency) — the OWASP LLM risk
that Anthropic, OpenAI, and every agentic-AI company must solve to ship agents that act safely.
CRITICAL — Fix Today
Rotate credentials — Remove POSTGRES_PASSWORD, NEO4J_AUTH, API_KEYS, MASTER_KEY from infrastructure/docker-compose.yml. Move to .env.
Fix redirect URI validation — Replace strings.HasPrefix with exact URL component match in backend/internal/oidc/handlers.go:544
Escape user input in HTML — Use html.EscapeString() or html/template in backend/internal/oidc/handlers.go:77,354
HIGH — Fix This Week
Implement JWT jti replay protection — Check jti against Redis blocklist in backend/internal/middleware/jwt_auth.go:132
Persist JWT signing key — Write key to file on first start, load on subsequent starts backend/internal/oidc/provider.go:37
Remove HMAC default secret — Return error if CAEP_HMAC_SECRET is not set backend/internal/activities/activities.go:832
Add production gate — Exit with fatal on startup if MASTER_KEY/VAULT_MASTER_KEY matches known default
MEDIUM — Fix This Sprint
Redis authentication — Set REDIS_PASSWORD in .env and configure Redis container with requirepass
✅ DONE (2026-08) — All internal services in docker-compose.yml now bind to 127.0.0.1; only the Cloudflare Tunnel reaches the gateway.
Audit log response body sanitizer — Strip tokens from error response bodies before capture backend/internal/audit/audit.go:203