FormationLabs
HomeWorkAboutRésuméServicesStart a ProjectContact
Get in Touch
Back to Portfolio
Case StudySecurity

Receiving a 117-Finding Audit

Running a security review for a client is one thing. Being handed an architect-class review of a platform you built is more useful — if you treat it as engineering instead of criticism.

117 findings catalogued|30 P1/P2 closed in 4 days|3 review phases

The Setup

Before launch, an outside architect ran a dedicated review against the platform where I serve as CTO — a hiring product for security-cleared professionals, where the data is sensitive by definition and the customer base is exactly the population least willing to forgive a leak.

The review ran in three phases: a static architecture and code pass, a live pass combining UI walkthroughs with state-boundary and adversarial testing, and a dedicated penetration test. Across all three it catalogued 117 findings, plus a further set of general practice notes.

That is a large number to receive on your own work. The reflex is to argue severity. The useful response is to build the machinery that closes them and keeps them closed.

Making It a System

The first thing built was not a fix, it was a ledger. Every finding got an identifier, a current state, an owner, and the evidence that closed it, living in the repository beside the code rather than in an email thread. That single artifact is what made a hundred-finding backlog tractable — at any moment there was one authoritative answer to "what is actually still open?"

Findings that needed risky or multi-step changes — authorization model rewrites, policy changes touching live data — got their own runbooks written before the change, so the sequence was decided while thinking clearly rather than mid-migration.

A finding-by-finding remediation ledger in the repo
Per-finding runbooks for risky multi-step fixes
A reusable 20-class vulnerability catalog
A runnable audit harness for future projects
CI gates that block regressions of closed findings
Severity rubric with detection technique per class

The Remediation

The work itself spanned Row Level Security policy design, edge-function authorization, input bounds, secrets handling, webhook verification, AI guardrails, content security policy, and account-enumeration surfaces.

The penetration phase produced the classes that are easiest to get wrong and hardest to notice:

Edge-function IDOR via service-role plus body-supplied IDs
Column-level write controls — RLS gates rows, not columns
Audit-trail coverage gaps
Vendor error-message hygiene
State-machine multiplicity
Account enumeration via response timing and shape

The one worth singling out is column-level write control. Row Level Security is very good at answering "may this user touch this row" and says nothing about which columns they may write. A user permitted to update their own profile row is not thereby permitted to set their own role or verification status — but a naive policy grants exactly that, and it reads as correct in review.

In one four-day stretch, 30 P1 and P2 findings were closed. The reviewer's own summary described the drop in open severity as a dramatic collapse — the active stack went from a handful of high-severity items to close to none.

What Outlasted the Audit

The findings were the smaller half of the value. What remains is a reusable 20-class vulnerability catalog with a detection technique and severity rubric for each class, and a runnable harness that executes the static and live probes against any project and produces a report.

I now run that against new builds on day one rather than waiting for someone else to find the same classes at pre-launch. The closed findings are also wired into CI, so the specific mistakes that were made once cannot quietly return.

Receiving a hard audit well is a skill worth having on a team. The findings are free information about your blind spots, and the only wrong response is a defensive one.

Stack

Supabase / PostgreSQLRow Level SecurityEdge FunctionsTypeScriptThreat modelingCI security gatesPlaywright

Want to talk about it?

Hiring, contract work, or just a question about how this one was built — email is the fastest path.

FL

FormationLabs

AI Assistant

Hey! I'm the Formation Labs AI assistant. How can I help you today?

Quick questions:

Powered by FormationLabs