Audit Findings Tracker
Live-status table of named findings from the 2026-05-11 comprehensive audit and 2026-05-08 adversarial audit.
Each finding's status updates with the commit that closes it. No finding is hidden from this page; when a remediation lands, the row flips and cites the SHA. The operating commitment is to drive the open-and-partial count to zero before TVL scales past Genesis.
Closed
7
Partial
2
Open
10
Mitigated
3
| ID | Severity | Surface | Finding | Status | Closing commit |
|---|---|---|---|---|---|
| 1.3a | CRIT | contracts | KerneVault rate-limit bypass on updateHedgingReserve and updateL1Assets when prior value was 0 Rate-limit now enforced on first writes. Paired with KernePrime free-collateral faucet closure in the same commit. | closed | 089d75292026-05-09 |
| 1.8 | CRIT | contracts | KernePrime accounting-only ledger could be wired to mint/burn kUSD without a backing check KernePrime free-collateral faucet patched alongside the rate-limit bypass. | closed | 089d75292026-05-09 |
| 1.18 | CRIT | contracts | KerneStaking lock-bypass via partial-unstake-then-restake path Source patched same-day with 7 regression tests. Deployed bytecode at 0x032A...D582 has not been re-verified to confirm the fix is on-chain; treat as partial until verified. | partial | not yet |
| B4 | CRIT | contracts | InsuranceFund.checkAndInject targets degraded vault totalSupply Duplicate of TOP-3 in the audit's framing; tracked as a separate item because the source-level fix and the operational mitigation differ. | open | not yet |
| B7 | CRIT | contracts | KerneVault.setFactory race window enables clone hijack Factory not currently used for deploys; closing the race before any factory-driven vault is deployed. | open | not yet |
| B8 | CRIT | contracts | KerneZINRouter.onFlashLoan accepts any lender with attacker-chosen calldata ZIN router not currently in deploy path. Patch before re-enabling. | open | not yet |
| B9 | CRIT | contracts | KerneIntentExecutor V1 lacks the V2 hardening and remains callable V2 closed the equivalent class of bugs. V1 SOLVER_ROLE still ungated; pause + revoke needed before V1 sees production use. | open | not yet |
| B10 | CRIT | contracts | KerneVault.emergencyExit drains entire balance to arbitrary recipient Requires DEFAULT_ADMIN_ROLE + paused state, so blast radius is Safe-bound; still worth pinning recipient to treasury + adding a 24h delay. | open | not yet |
| B11 | CRIT | bot | RFQ /quote endpoint signs arbitrary EIP-712 orders with strategist key, no auth Bot is offline as of 2026-05-12 (HL-only restart 2026-05-13 with the RFQ surface still disabled). Attack surface inert; patch is still required before the RFQ endpoint is re-enabled. | mitigated | not yet |
| B12 | CRIT | bot | BotOrchestrator.deploy_instance writes raw private keys to /tmp env files Bot is single-instance HL-only; the orchestrator multi-container path is inactive. Patch required before orchestrator-style deploys are re-enabled. | mitigated | not yet |
| TOP-1 | CRIT | frontend (terminal) | Opal cron /api/opal/cron/accrue accepted spoofable x-vercel-cron header as auth Replaced with constant-time Bearer comparison against CRON_SECRET; ACCRUE_SECRET retained as legacy fallback. | closed | 35c05ec12026-05-11 |
| TOP-2 | CRIT | contracts | KerneVault pause path requires Safe co-sign; no on-chain pauser holds PAUSER_ROLE Bot's pre-flight pause simulation (commit 80c676aa) prevents the loop-spam failure mode, but a live solvency event still requires manual Safe co-sign to pause. Safe co-sign is out of scope for current ranked action plan. | open | not yet |
| TOP-3 | CRIT | contracts | KerneInsuranceFund.checkAndInject is permissionless and computes target against degraded vault totalSupply Mitigated today by the vault's degraded-state UI guard (deposits gated); the on-chain primitive remains callable by anyone. Requires source patch + Safe AUTHORIZED_ROLE strip. | open | not yet |
| TOP-4 | CRIT | infra | Postgres 5432 internet-exposed on VPS with self-signed cert UFW rule allows 5432 from 0.0.0.0/0. Scram-sha-256 auth is the only barrier. Restrict to Vercel egress ASNs or move to managed Postgres with network ACLs. | open | not yet |
| TOP-5 | CRIT | secrets | Leaked OpenRouter API key committed in bot/solver Source patched in audit pass. Operator dashboard rotation required to fully retire the key; tracked separately. | mitigated | 35c05ec12026-05-11 |
| TOP-6 | CRIT | infra | VPS SSH posture: PermitRootLogin yes, no fail2ban, password auth not explicitly disabled Bot key is the only working SSH credential; brute-force surface limited but bot scanners are visible in auth.log. Cheap to harden. | open | not yet |
| TOP-7 | CRIT | frontend (terminal) | Opal /api/opal/balance/[address] IDOR with write-on-read Removed the INSERT-on-GET path; balance reads are now read-only. | closed | 35c05ec12026-05-11 |
| TOP-8 | CRIT | contracts | kUSD.burnFrom callable via permit2 chain by any contract with allowance burnFrom is now gated behind BURNER_ROLE. The permit2-then-burnFrom primitive is closed. | closed | 4cd208262026-05-12 |
| TOP-10 | CRIT | infra | Postgres opal-pg TLS connection used rejectUnauthorized: false 35c05ec1 flipped to rejectUnauthorized: true with pinned CA cert. 982996d9 (2026-05-14) added explicit CN verification when the connection hostname (localhost.) does not match the cert's CN (134.209.46.179), which had been silently failing every Vercel cron invocation since 2026-05-11 23:00:50 UTC and froze the fragment ledger for 66 hours. | closed | |
| B13 | HIGH | bot | Bot used 5% slippage on every Hyperliquid order Tightened to 0.3% with TWAP fallback for sizes over 5 ETH. | closed | 35c05ec12026-05-11 |
| B14 | HIGH | bot | All bot on-chain txs used legacy gasPrice instead of EIP-1559 panic.py + oracle_updater are on EIP-1559. ~12 other call sites (chain_manager, risk_engine, por_attestation, etc.) still use legacy gasPrice; pending a canonical helper rollout. | partial | |
| TOP-9 | HIGH | contracts | KerneYieldDistributor merkle root is updated without a 24h timelock window Distributor is currently inactive (0 KERNE in flight). Add timelock before any first distribution. | open | not yet |
How this page works
Every named finding from the 2026-05-11 comprehensive audit's Top-10 emergency fix list and B-series new criticals is enumerated here, plus the 2026-05-08 adversarial audit's §1 criticals that have seen a remediation commit since.
A status of closed means a commit has shipped that resolves the finding in source; the SHA is linked. Partial means a remediation has shipped but not the whole class; the note explains what is still open. Open means the finding remains live in source today. Mitigated means the surface is not currently exposed (the affected service is offline, the contract is not deployed) but a future re-enable would require the patch first.
The full audit reports are linked from the Audit and Security Posture page. The live risk surface (wired thresholds vs. on-chain values) is at /risk.