StealthOSAll current reports

Solana program & wallet integration

Remediation record

SolanaGroth16Browser wallet

Review date: 1 October 2026

Current remediation status — 12 October 2026

Finding-status verification against staging source, dated remediation records and targeted regression tests. Not a full re-audit or blanket deployment attestation.

F1 — Definitive refusal becomes permanently pending

High · Remediated in source

Preserve the proven submissionNotAttempted refusal across HTTP; close only demonstrably unsigned intents.

Evidence / limits: Current Solana route/recovery checks and October 8 recovery-resolution evidence.

Remediation commits: privacy-frontend 618f64b · stealthos-relayer a629115

F2 — Recovery selects an unrelated PDA mention

High · Remediated in source

Search finalized history for the actual matching settlement event instead of treating the newest PDA mention as creation.

Evidence / limits: Current leaf-discovery and recovery-security regressions.

Remediation commits: privacy-frontend 618f64b · stealthos-relayer a629115

F3 — Zero-output withdrawals exhaust the journal

Medium · Remediated in source

Complete chain-validated withdrawals even when no output delivery is required.

Evidence / limits: October remediation regression record and current recovery-security checks.

Remediation commits: privacy-frontend 618f64b · stealthos-relayer a629115

F4 — Processed signature is retried with a fresh signature

Medium · Remediated in source

Retain the original signed attempt through uncertain submission; require canonical resolution before replacing it.

Evidence / limits: Current Solana settlement regressions, including response loss and retry fencing.

Remediation commits: privacy-frontend 618f64b · stealthos-relayer a629115

F5 — Settlement before durable note delivery

High · Remediated in source

Require acknowledged encrypted off-device journal backup before funded settlement; preserve delivery-pending state until recovery completes.

Evidence / limits: Current journal-backup regressions; later October 8 devnet cold-restore and funded top-up evidence.

Remediation commits: privacy-frontend 618f64b · stealthos-relayer a629115

Download current status for all 19 findings · Status data and checked revisions


Original dated report

The original text below is preserved as a historical record. Use the current-status addendum above for finding closure.

Download original dated source report (without current addendum)

Solana fund-safety remediation

Completed 1 October 2026 UTC. This records the changes made after the adversarial audit. The original report remains a snapshot of the vulnerable revision. The Solana and DogeOS fixes were committed together, merged into staging through frontend PR 44 and relayer PR 18, and deployed to staging. See the deployment record (fund-safety-staging-20261001.md). The protocol was not changed. Hosted encrypted-journal recovery was verified; no funded Solana settlement or historical archival-recovery drill was performed.

Audit findingRemediation
F1: definite unsigned refusal strands a selected noteThe relayer HTTP route now forwards the service's durable submissionNotAttempted finding as a narrowly validated boolean. The browser closes only a proven unsigned attempt and can prepare a new proof. A signed or ambiguous attempt remains locked for reconciliation.
F2: unrelated PDA mention blocks recoveryDeposit and settlement recovery page through finalized signatures and verify the actual pool event, expected action and commitment-account slot. A newer unrelated transaction mentioning the address no longer masks the creation event.
F3: zero-output withdrawals exhaust the journalA finalized withdrawal with no output notes now reaches a terminal journal state after its payout is verified. Existing records can migrate through reconciliation.
F4: processed transaction retried after blockhash expiryThe relayer persists the locally derived signature before sending, waits for finalized status, and does not treat mere blockhash expiry or ambiguous RPC responses as proof that the signed transaction failed. Uncertain attempts remain fenced for operator reconciliation.
F5: settled output secret exists only in browser storageBefore deposit signing or relay submission, the sender uploads an AES-GCM encrypted, sender-owned journal snapshot to the scoped PostgreSQL recovery store and checks its ID and SHA-256 digest acknowledgement. Missing durability acknowledgement refuses submission. Restore recovers the ciphertext after browser loss, while the UI distinguishes finalized settlement from pending note delivery and offers explicit retry.

Further review found two related action-confusion paths and closed them. The relayer's durable nullifier ledger now binds a replay to a canonical SHA-256 digest of the entire action, including the destination, amount, fee, roots, inputs, outputs, proof, network and program. A different action with the same nullifiers returns a conflict; legacy settled rows without a digest fail closed. Frontend finalization likewise checks the event's full expected intent. This is especially important for zero-output withdrawals, where nullifiers and an empty commitment list alone cannot distinguish different payouts.

The backup uses immutable IDs so a changed snapshot after a definite unsigned refusal gets its own version. Restore checks each candidate against finalized chain evidence before using it; where multiple unconfirmed versions remain, the wallet presents the exact destination, amount and fee for the user to choose. The journal is also guarded against cross-tab changes between preparation, backup acknowledgement and delivery. Corrupt remote rows are quarantined individually, without hiding valid backups. Corrupt local rows remain untouched while other recoverable records are processed.

Verification

Rollout requirements and residual risk

Follow the PostgreSQL and Solana rollout procedure (.codex-worktrees/solana-audit-fixes-stealthos-relayer/docs/POSTGRES_SOLANA_SECURITY_ROLLOUT.md). A hosted deployment must have the reviewed schema, restricted grants, durable PostgreSQL commits, backup and restore jobs, and ENGINE_RECOVERY_DURABILITY_ACK=true only after those checks. Confirm a wallet can PUT, verify and GET its encrypted journal after clearing browser storage; the client refuses new submissions if that acknowledgement is unavailable.

Fresh-browser recovery also needs historical finalized transaction events to reconstruct Merkle leaves and payout details. A commitment PDA alone does not contain that history. Provide archival RPC or authenticated retained leaf history for the full promised recovery period and test restoration after ordinary RPC history has aged out. Keep the public wallet origin stable because the Solana spending-key derivation signs it. Signed but uncertain relayer attempts intentionally need operator reconciliation; they must not be automatically resubmitted.

These local tests support the source-level fixes, but they do not establish a safe real-funds release until the hosted durability and historical-recovery drills pass.