morphit/docs/AUDIT-ITEMS-95-110.md

286 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Audit items #95110 — explicit enumeration + status (cp167)
The cp138 audit plan numbered tasks T-01 through T-94 — all completed
during the cp138cp157 static-audit campaign and now archived in
[`AUDIT-2026-05-FINAL-REPORT.md`](AUDIT-2026-05-FINAL-REPORT.md).
References elsewhere in the repo (notably `REVISIT-LIST.md` line 921
and the user-memory entry from cp157) call out items **#95110** as
"out of static-audit scope." This document enumerates each of those
items explicitly so that pointing at "items #95110" in conversation
or in a future audit pickup has unambiguous reference.
All items below are **not pending work for the static-audit campaign**.
Each is either:
- **Deployment-gated (#95104):** Requires a running staging deploy,
real network adversarial behavior, or live infrastructure. Cannot
be exercised from inside a code-review sandbox. Covered in
[`AUDIT-OUTSIDE-SCOPE.md`](AUDIT-OUTSIDE-SCOPE.md) under the
"High-leverage tests I cannot run" enumeration.
- **Epistemic limit (#105110):** Acknowledged blind spots of the
static-audit approach itself. These exist by definition; the
goal is to document them so an external audit team knows where
to look.
---
## Deployment-gated (out-of-static-scope)
### #95 — DAST against a running instance
Burp Suite Pro / ZAP / Nuclei sweep against a staging deploy.
Catches timing leaks under real load, response-header drift,
session fixation, content-type sniffing, and operator-stack
misconfigurations (nginx, BunkerWeb, kernel posture).
**Coverage:** [`AUDIT-OUTSIDE-SCOPE.md`](AUDIT-OUTSIDE-SCOPE.md) §1.
**Mitigation in static scope:** Every code path that produces
HTTP responses has unit + smoke coverage for header shape.
`Cache-Control`, `X-Content-Type-Options`, `Strict-Transport-
Security`, `Content-Security-Policy`, `X-Frame-Options`,
`Referrer-Policy`, `Permissions-Policy` all enforced in
`apps/web/src/hooks.server.ts` with smoke coverage. The
`href-xss-smoke` catches the most likely XSS vector (operator/
peer-controlled `href={}` bindings).
---
### #96 — Active fuzzing (libFuzzer / AFL / Atheris)
24-hour mutation-fuzz campaigns against the chain-op JSON
payload parsers, chat-payload decoder, address validators,
keystore envelope decoder, and HTTP body parsers.
**Coverage:** [`AUDIT-OUTSIDE-SCOPE.md`](AUDIT-OUTSIDE-SCOPE.md) §2.
**Mitigation in static scope:** Each parser has property-based
testing via fast-check in its smoke (`*-smoke.ts` files).
fast-check covers a meaningful slice of input space but cannot
match the coverage-guided mutation a real fuzzer produces.
---
### #97 — Cryptographic specialist review
Specialist crypto review of `keystore.ts`, `keystoreYubikey.ts`,
`keystoreTotp.ts`, `passkeys/`, and `chat/` for primitive
selection, padding oracles, nonce reuse, key-derivation
parameters, and forward-secrecy posture.
**Coverage:** [`AUDIT-OUTSIDE-SCOPE.md`](AUDIT-OUTSIDE-SCOPE.md) §3.
**Mitigation in static scope:** All crypto primitives use
WebCrypto (browser-native) or Node's `node:crypto` (vetted).
No hand-rolled primitives. Scrypt parameters (N=131072, r=8,
p=1) verified against OWASP recommended floor. AES-256-GCM
nonces are 12-byte cryptographically-random — no reuse risk
because each envelope generates a fresh nonce at encrypt time.
---
### #98 — Threat-modeling workshop with outside engineers
12 day STRIDE/PASTA session. Catches threats that emerge
from system composition (multiple trust boundaries combined)
which source review touches partially.
**Coverage:** [`AUDIT-OUTSIDE-SCOPE.md`](AUDIT-OUTSIDE-SCOPE.md) §4.
**Mitigation in static scope:** Each ADR (00010044) carries
its own threat-model section. `THREAT-MODEL.md` documents
the per-boundary STRIDE matrix. Persona-walkthroughs in
the standing 4-persona discipline (Bob, Sally-user, Sally-
operator, Charlie) re-walk the boundaries each session.
---
### #99 — Supply-chain attack review
Specialist review of dependency tree for typosquats, malicious
maintainer-takeover indicators, transitive-dep risk.
**Coverage:** [`AUDIT-OUTSIDE-SCOPE.md`](AUDIT-OUTSIDE-SCOPE.md) §5.
**Mitigation in static scope:** `package-lock.json` committed
across all workspaces, `workspace-deps-pin-check.ts` smoke
enforces pinned versions, supply-chain audit completed in
cp138 Phase A (findings A4-A10 all shipped).
---
### #100 — Browser-fingerprinting analysis
Specialist analysis of the JS bundle for fingerprintable
behaviors that distinguish users across sessions.
**Coverage:** [`AUDIT-OUTSIDE-SCOPE.md`](AUDIT-OUTSIDE-SCOPE.md) §6.
**Mitigation in static scope:** No analytics scripts loaded.
No third-party CDNs (other than Anthropic SDK in MCP-server,
not in user-facing bundle). Service worker doesn't track.
`apps/web/src/lib/utils/idempotencyKey.ts` uses
crypto.randomUUID for client IDs — no persistent fingerprint.
---
### #101 — Tor / I2P / hidden-service operational testing
Real operational testing under hidden-service deploy: does
the JS bundle work? Are there leaks (clearnet calls, WebRTC
discovery, etc.)? How does latency affect UX?
**Coverage:** [`AUDIT-OUTSIDE-SCOPE.md`](AUDIT-OUTSIDE-SCOPE.md) §7.
**Mitigation in static scope:** `apps/web/static/_headers`
sets WebRTC ICE-server gating headers; no clearnet fetch()
calls in the JS bundle (all backend calls go to the operator's
own indexer); the alt-network metadata in `/v1/instance` is
documented as operator-supplied.
---
### #102 — Real-load + chaos testing
Production-load simulation + chaos engineering (network
partitions, RPC outages, DB failover) to find emergent
failure modes.
**Coverage:** [`AUDIT-OUTSIDE-SCOPE.md`](AUDIT-OUTSIDE-SCOPE.md) §8.
**Mitigation in static scope:** Smoke tests cover happy-path
+ adversarial-input + boundary conditions. Cannot reproduce
multi-instance federation under network partition without
real deploy.
---
### #103 — Mobile / WebView attack surface
PWA install on iOS/Android, embedded WebView in third-party
apps — different security posture than mainstream browsers.
**Coverage:** [`AUDIT-OUTSIDE-SCOPE.md`](AUDIT-OUTSIDE-SCOPE.md) §9.
**Mitigation in static scope:** `manifest.webmanifest` is
strict (no third-party origins); `apps/web/static/_headers`
sets COOP/COEP to limit cross-origin isolation issues.
---
### #104 — Social-engineering / phishing simulation
Tabletop exercise: a fake-Morphit operator publishes a malicious
instance. Does the federation directory + verify.json + warrant-
canary catch it? Does Sally-user notice before sending funds?
**Coverage:** [`AUDIT-OUTSIDE-SCOPE.md`](AUDIT-OUTSIDE-SCOPE.md) §10.
**Mitigation in static scope:** Squatter-defense playbook
documented in OPERATIONS.md §38. Verify.json + chain-pinned
release metadata documented as the trust-anchor mechanism.
Per Ken's standing rule, "type these into your browser bar —
don't click" warning rendered on every page footer for
suspected-rogue-instance situations.
---
## Epistemic limits (out-of-static-scope)
### #105 — Unknown unknowns
Bugs that exist but neither I nor the dev team have a model
for. By definition uncatchable until they surface in
operation.
**Mitigation:** `BETA-INCIDENT-RUNBOOK.md` documents the
process for operator-reported issues. Public bug bounty is
the only practical mechanism for surfacing unknown unknowns
at scale.
---
### #106 — Compiler / runtime trust
Static review assumes Node.js, TypeScript, esbuild, V8 behave
correctly. A compiler bug, runtime-level memory-safety bug,
or interpreter-level type-confusion could undermine any
verified property.
**Mitigation:** Node.js + V8 are widely-deployed, security-
researched. Runtime versions pinned in `package.json`
"engines" field. CVEs tracked via `npm audit` on CI.
---
### #107 — Specification gaps
Where the spec is ambiguous (e.g. ADR-0010 §4 vs ADR-0021
§3 trade-off resolution), static review picks one
interpretation. A different interpretation by a future
developer could create a bug invisible to me.
**Mitigation:** ADRs cross-reference each other; the cp138
Phase H "ADR-vs-code drift" audit (T-78 in plan) caught
inconsistencies and locked them via finding H8 (the
`create_claimed_account` ACT-consumption alignment).
---
### #108 — Maintainer trust
This audit assumes the maintainer (i.e. Ken) is not
adversarial. Static review of the diff in front of me
cannot catch a hostile-maintainer scenario where a future
commit silently weakens a defense.
**Mitigation:** AGPL-3.0 license + public Forgejo at
git.agorise.net/agorise/morphit makes every change visible.
Federation prober verifies on-chain operator registration
so an instance can't impersonate `@morphit` from outside
the trust-pinned set.
---
### #109 — Future regression
Properties verified now can regress with future code changes
unless guarded by a smoke. Static review at point-in-time
doesn't guarantee future code respects the invariants.
**Mitigation:** Standing rule: every HIGH/CRITICAL fix gets
a smoke regression scenario. Smokes are run triple-pulse
on every meaningful fix batch, every CI run.
---
### #110 — Coverage measurement
I cannot empirically measure my own coverage of the codebase
during a static review. Areas I didn't think to look at are
invisible to me.
**Mitigation:** The 94-task cp138 plan was structured
categorically (A-K phases) precisely to drive systematic
coverage rather than ad-hoc walking. External pen-test
(item #95) is the only way to measure remaining unmitigated
exposure.
---
## Status summary
| Range | Count | Status |
| :---------- | :---- | :----------------------------------------------------- |
| #194 | 94 | All shipped (cp138cp157, archived in FINAL-REPORT) |
| #95104 | 10 | Out-of-static-scope; documented in AUDIT-OUTSIDE-SCOPE |
| #105110 | 6 | Epistemic limits; documented here |
| **Total** | 110 | **All accounted for** |
No remaining work on items #95110 within the static-audit campaign.
The pre-launch hardening campaign formally closes the static portion
of the 110-item audit list. Items #95104 should be commissioned
from an external security firm before any "soft launch" beyond a
closed-group beta (per AUDIT-OUTSIDE-SCOPE.md §"Concrete
recommendation").