Kerne Logo

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

IDSeveritySurfaceFindingStatusClosing commit
1.3aCRITcontracts

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.8CRITcontracts

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.18CRITcontracts

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.

partialnot yet
B4CRITcontracts

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.

opennot yet
B7CRITcontracts

KerneVault.setFactory race window enables clone hijack

Factory not currently used for deploys; closing the race before any factory-driven vault is deployed.

opennot yet
B8CRITcontracts

KerneZINRouter.onFlashLoan accepts any lender with attacker-chosen calldata

ZIN router not currently in deploy path. Patch before re-enabling.

opennot yet
B9CRITcontracts

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.

opennot yet
B10CRITcontracts

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.

opennot yet
B11CRITbot

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.

mitigatednot yet
B12CRITbot

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.

mitigatednot yet
TOP-1CRITfrontend (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-2CRITcontracts

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.

opennot yet
TOP-3CRITcontracts

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.

opennot yet
TOP-4CRITinfra

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.

opennot yet
TOP-5CRITsecrets

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-6CRITinfra

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.

opennot yet
TOP-7CRITfrontend (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-8CRITcontracts

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-10CRITinfra

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
B13HIGHbot

Bot used 5% slippage on every Hyperliquid order

Tightened to 0.3% with TWAP fallback for sizes over 5 ETH.

closed
35c05ec12026-05-11
B14HIGHbot

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-9HIGHcontracts

KerneYieldDistributor merkle root is updated without a 24h timelock window

Distributor is currently inactive (0 KERNE in flight). Add timelock before any first distribution.

opennot 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.