Platform Security Assessment 2026-08

Plain-language working notes on the August 2026 static security assessment of the Phenom estate: 184 findings, nine root causes, and a sequenced fix list ready to become GitHub epics and issues.

Internal working notes. Not the assessment report. These pages restate a third-party assessment in plain language so engineers can plan work. The reports themselves are held by the auditor and have not been issued to Phenom. Read Provenance and handling before you quote any number from these pages.

The one-paragraph version

Someone read 32 Phenom source repositories frozen at tag audit-baseline-2026-08-04 and wrote down every place the code lets an attacker reach something. They found 184 things. Two are Critical, 26 are High, and the rest are Medium, Low or informational. Nothing was exploited and no live system was touched: this was a source read, not a penetration test. The interesting result is not the count. It is that 142 of the 184 trace back to just nine recurring habits, so the fix list is nine engineering programmes rather than 184 tickets.

The numbers

Measure Value
Repositories read 32
Baseline tag audit-baseline-2026-08-04
Assessment window 2026-08-04 to 2026-08-07
Method Static, source only. No live host contacted.
Findings 184 (see the caveat below)
Critical 2
High 26
Medium 69
Low 78
Informational 9
Verified at source 12
Inferred from source 172
Findings explained by a named root cause 142 of 184 (77 percent)
Distinct OWASP WSTG test IDs cited 81

Severity split by component:

Component Findings
phenom-backend 44
phenom-infra 32
phenom-drop 22
ghostmode-thephenom-app 22
sablier-weblogon 14
PhenomApp 9
www 9
codetalker-dev 7
phenom-push-sender 4
analytics-thephenom-app 4
phenom-earth-docs 4
Buzzard-Android 3
adsb-archive 3
dev-environment-installer 2
dev-environment 2
mlx-whisper-stt 2
analytics + ghostmode (shared) 1

What “Inferred” means, and why it matters to you

172 of the 184 findings are marked Inferred and 12 are marked Verified. That is not a confidence problem with the finding. It means the assessor read the code path and the missing control at a specific file and line, but could not observe the running system to confirm the deployed configuration. When you pick up one of these, your first job is usually a five-minute lookup in a console, not a code change. Several findings say exactly which lookup settles them. See Open questions.

Provenance and handling

These constraints come from the source material and they are not negotiable.

What was verified is worth stating too. All 184 findings survived an adversarial falsification pass with zero false positives and zero hallucinated findings. A second independent pass argued Phenom’s side and broke none of the central claims. Both Critical findings held under repeated attack.

How these pages are laid out

Page Use it for
Root causes The nine recurring habits. This is your epic list.
Architectural weaknesses The ten biggest structural problems, each with a concrete fix.
Priority fixes The sequenced roadmap: this week, this quarter, structural. Start here if you want to ship something on Monday.
Critical and High findings All 28 top-severity findings in plain language, one issue each.
Findings register All 184 rows, filterable by eye.
Personal data Where personal data actually lives, and the ten items to fix first.
Open questions Fifteen questions that change severities. Several are one console lookup.
Filing guide How to turn all of the above into GitHub epics and issues without losing the dependencies.

What already works

Three quarters of the remediation argument is “you already own this pattern, apply it in the other places”, so the patterns are worth naming:

  • The production ALB mutual-TLS origin lock. mutual_authentication { mode = "verify" } against a codified trust store, with per-hostname authenticated origin pulls. It binds the caller cryptographically. An IP allowlist was tried first and correctly rolled back. This control is what currently bounds the worst Critical finding.
  • moderation_audit_log. Append-only, enforced at the data layer by AFTER triggers rather than at call sites, with a guard trigger that raises on UPDATE and DELETE for every role including admin, and a manual relationship so attribution survives user deletion.
  • nest-api’s Cognito verifier. Four controls verified at line. This is the reference implementation to standardise on, which makes the “no shared security component” root cause cheaper to fix than it looks.
  • The audience-separation decision in admin_sandbox/nest-api/src/auth.ts, which is deliberate, documented, and names its threat.
  • dev-environment’s publish pipeline, which mints a one-hour token scoped to two named repositories, passes it as a build secret so it never lands in a layer, and pushes by digest. This is the model the other production paths should copy.
  • The daily Terraform drift loop, which opens or updates a labelled issue on drift and auto-closes it when clean.

A note on the existing Drop audit page

Drop Security Audit currently reports pipeline status GREEN with all critical, high and medium findings remediated. This assessment records 22 open findings against phenom-drop, including one of the two Criticals. The two documents disagree and the disagreement has not been reconciled. Treat the Drop page as covering a narrower earlier scope until someone reconciles them, and see MGR-C01 first.


Root Causes: The Nine Epics

142 of 184 findings trace to nine recurring habits. Each one is an epic. This page gives the plain-language version, the defect count, and what closing it actually means.

Ten Architectural Weaknesses

The ten structural problems in the Phenom estate, ranked by risk, each with what it lets an attacker do, how reachable it actually is, and the change that fixes it.

Priority Fixes: What to Do First

The sequenced remediation roadmap. Four items this week, seven this quarter, three structural. Ordered by risk removed divided by effort, not by severity.

Critical and High Findings

All 28 Critical and High findings in plain language. One GitHub issue each: what is wrong, where, and what to change.

Findings Register

All 184 findings grouped by component, with severity, confidence and status. The lookup table for backlog work.

Personal Data Inventory

What personal data the platform holds, where it lives, and the 40 items that need a decision. Locations and classes only, never values.

Open Questions

Sixteen questions the assessment could not settle from source. Most are a one-minute internal lookup, and several decide a severity.

Filing Guide

How to turn this assessment into GitHub epics and issues: the epic structure, the five parameters every issue must set, labels, and the Linear mirror.