fix(milestone): close v0.2 audit gaps
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
---
|
||||
phase: 10
|
||||
slug: ux-interaction
|
||||
status: verified
|
||||
threats_open: 0
|
||||
asvs_level: 2
|
||||
created: 2026-06-17
|
||||
register_authored_at_plan_time: true
|
||||
---
|
||||
|
||||
# Phase 10 — Security
|
||||
|
||||
> Retroactive security contract for Phase 10: UX & Interaction.
|
||||
|
||||
## Trust Boundaries
|
||||
|
||||
| Boundary | Description | Data Crossing |
|
||||
|---|---|---|
|
||||
| Browser window events → Vue UI handlers | Keyboard shortcuts, drag events, modal Escape handlers, and menu positioning are handled client-side only. | Event metadata; no secrets or server-side authority. |
|
||||
| OS file drag → `OsDragOverlay` → existing upload flow | Files arrive through the browser `DataTransfer` API and are forwarded into the existing authenticated upload path. | Browser-controlled `File` objects; existing quota/auth checks still apply on upload. |
|
||||
| Route metadata → layout selection | `/admin/*` layout selection hides the user sidebar and shows admin chrome. | Route metadata only; backend/admin guard remains unchanged. |
|
||||
| Vue templates → user-visible text | Breadcrumbs, empty states, toasts, and dropdown labels render through Vue interpolation. | Store/view strings; Vue escaping preserved. |
|
||||
|
||||
## Threat Register
|
||||
|
||||
| Threat ID | Category | Component | Disposition | Mitigation | Status |
|
||||
|---|---|---|---|---|---|
|
||||
| T-10-01 | Cross-Site Scripting | Breadcrumb, empty state, toast, and dropdown text rendering | mitigate | Vue template interpolation is used; no `v-html` or raw HTML injection introduced by Phase 10 UI components. | closed |
|
||||
| T-10-02 | Information Disclosure | Toast notifications | mitigate | Toast payloads are generic action results such as upload/delete/rename/revoke status; no document content, extracted text, credentials, or token material is displayed. | closed |
|
||||
| T-10-03 | Tampering | `OsDragOverlay` file drop handling | accept | Handler reads browser-provided `dataTransfer.files`, resets overlay state, and emits to the existing authenticated upload flow; no direct server write bypass is introduced. | closed |
|
||||
| T-10-04 | Elevation of Privilege | Admin route layout selection | accept | `App.vue` admin branch changes presentation only; router `requiresAdmin` guard and backend `get_current_admin` enforcement are unchanged. | closed |
|
||||
| T-10-05 | Spoofing | Keyboard shortcut dispatch through current route instance | accept | Shortcuts call methods on the mounted Vue route component only; no URL parameter or user-supplied string selects privileged behavior. | closed |
|
||||
| T-10-06 | Denial of Service | Global keyboard and drag listeners | mitigate | Event listeners are added once at component mount and removed on unmount; drag overlay uses a bounded `dragDepth` counter and ignores non-file drags. | closed |
|
||||
| T-10-07 | Supply Chain | Phase 10 frontend changes | accept | No new runtime packages were introduced by Phase 10; changes are Vue components, tests, and existing Tailwind/Vitest usage. | closed |
|
||||
| T-10-08 | Supply Chain | Vite/esbuild dev dependency audit | mitigate | `npm audit --audit-level=high` found GHSA-gv7w-rqvm-qjhr through `vite@6.4.3`/`esbuild@0.25.12`; Vite was upgraded to `^8.0.16`, then audit, tests, and build were re-run. | closed |
|
||||
|
||||
*Status: open · closed*
|
||||
*Disposition: mitigate (implementation required) · accept (documented risk) · transfer (third-party)*
|
||||
|
||||
## Accepted Risks Log
|
||||
|
||||
| Risk ID | Threat Ref | Rationale | Accepted By | Date |
|
||||
|---|---|---|---|---|
|
||||
| AR-10-01 | T-10-03 | The drop handler cannot bypass upload authorization or quota checks because it delegates to the existing upload flow. | project owner | 2026-06-17 |
|
||||
| AR-10-02 | T-10-04 | Layout selection is presentation-only; authorization remains in router/backend gates. | project owner | 2026-06-17 |
|
||||
| AR-10-03 | T-10-05 | Route-instance method lookup is local Vue state, not user-controlled input. | project owner | 2026-06-17 |
|
||||
| AR-10-04 | T-10-07 | No new dependency was added in Phase 10. | project owner | 2026-06-17 |
|
||||
|
||||
## Audit Evidence
|
||||
|
||||
| Source | Finding |
|
||||
|---|---|
|
||||
| `10-01-SUMMARY.md` through `10-12-SUMMARY.md` | Threat flags are either "None" or document UI-only behavior with no new auth/network/schema surface. |
|
||||
| `10-13-PLAN.md` | Contains a STRIDE register for the UAT gap-closure plan; all threats have accepted dispositions. |
|
||||
| `10-13-SUMMARY.md` | Confirms gap-closure changes are display-only template/event-handler updates with no new network endpoints, auth paths, or schema changes. |
|
||||
| `10-VERIFICATION.md` | Confirms 15/15 Phase 10 requirements passed after gap closure and no anti-patterns remain. |
|
||||
| `10-VALIDATION.md` | Confirms Phase 10 validation coverage for UX and interaction requirements. |
|
||||
| `npm audit --audit-level=high` | Initially found a high-severity esbuild advisory through Vite; after upgrading to Vite `^8.0.16`, npm reported 0 vulnerabilities. |
|
||||
|
||||
## Security Audit Trail
|
||||
|
||||
| Audit Date | Threats Total | Closed | Open | Run By |
|
||||
|---|---:|---:|---:|---|
|
||||
| 2026-06-17 | 8 | 8 | 0 | Codex (milestone audit remediation) |
|
||||
|
||||
## Sign-Off
|
||||
|
||||
- [x] All threats have a disposition.
|
||||
- [x] Accepted risks documented.
|
||||
- [x] No Phase 10 change introduces backend routes, auth changes, DB schema changes, or direct storage writes.
|
||||
- [x] Existing upload/auth/admin enforcement remains the authority boundary.
|
||||
- [x] High-severity npm audit finding resolved by Vite 8 upgrade.
|
||||
- [x] `threats_open: 0` confirmed.
|
||||
|
||||
**Approval:** verified 2026-06-17
|
||||
Reference in New Issue
Block a user