# AOC v1.7.14 Release Notes **Release Date:** 2026-04-27 ## Security Hardening: Threat Model Remediation This release addresses the high-severity findings from the v1.7.13 threat model review. ### LLM Endpoint Domain Allowlist - **New config:** `LLM_ALLOWED_DOMAINS` (comma-separated, supports wildcards like `*.openai.azure.com`) - **Behavior:** When configured, the `/api/ask` endpoint rejects `LLM_BASE_URL` domains not in the allowlist - **Impact:** Prevents audit data exfiltration via a compromised or attacker-controlled LLM endpoint ### SIEM Webhook SSRF Guard - **New config:** `SIEM_ALLOWED_DOMAINS` (comma-separated) - **Behavior:** The SIEM forwarder now validates `SIEM_WEBHOOK_URL` with the same SSRF checks as the LLM endpoint (HTTPS-only, blocks private IPs, enforces domain allowlist) - **Impact:** Prevents real-time audit data exfiltration via a malicious SIEM webhook URL ### CDN Subresource Integrity (SRI) - Added `integrity` hashes to both CDN scripts in the frontend: - Alpine.js 3.15.11: `sha384-WPtu0YHhJ3arcykfnv1JgUffWDSKRnqnDeTpJUbOc2os2moEmLkIdaeR0trPN4be` - MSAL.js 2.37.0: `sha384-DUSOaqAzlZRiZxkDi8hL7hXJDZ+X39ZOAYV9ZDx44gUv9pozmcunJH02tjSFLPnW` - **Impact:** Browser refuses to execute CDN scripts if the content doesn't match the hash, preventing supply chain compromise ### Auth Misconfiguration Warning - At startup, AOC now logs a `WARNING` if `AUTH_ENABLED=true` but neither `AUTH_ALLOWED_ROLES` nor `AUTH_ALLOWED_GROUPS` is configured - **Impact:** Operators are alerted when the app is accidentally left open to all Entra users ### Azure Key Vault Integration (Optional) - **New module:** `backend/secrets_manager.py` - **New config:** `AZURE_KEY_VAULT_NAME` - **Behavior:** If `AZURE_KEY_VAULT_NAME` is set, AOC fetches these secrets from Key Vault at startup: - `aoc-client-secret` → `CLIENT_SECRET` - `aoc-llm-api-key` → `LLM_API_KEY` - `aoc-mongo-uri` → `MONGO_URI` - `aoc-webhook-client-secret` → `WEBHOOK_CLIENT_SECRET` - Falls back silently to `.env` / environment variables when Key Vault is not configured - **Dependencies:** `azure-identity` and `azure-keyvault-secrets` (commented out in `requirements.txt` — uncomment when using Key Vault) - **Impact:** Eliminates long-lived secrets from `.env` files and Docker images ## Files Changed | File | Change | |------|--------| | `backend/config.py` | Added `LLM_ALLOWED_DOMAINS`, `SIEM_ALLOWED_DOMAINS`, `AZURE_KEY_VAULT_NAME` | | `backend/routes/ask.py` | Domain allowlist enforcement for LLM URL | | `backend/siem.py` | SSRF guard + domain allowlist for SIEM webhook | | `backend/frontend/index.html` | SRI hashes for Alpine.js and MSAL.js | | `backend/main.py` | Startup warning for auth misconfiguration | | `backend/secrets_manager.py` | New — Azure Key Vault integration | | `backend/requirements.txt` | Added optional Azure Key Vault packages | | `.env.example` | Documented new settings | | `VERSION` | Bumped to 1.7.14 | | `THREAT_MODEL_v1.7.13.md` | Threat model documentation | ## Test Results - **80/80 pytest tests passing** - Ruff lint/format clean