Skip to content

[P2] Prevent cross-origin framing of the deployed app #220

Open

Description

@Alkwer

Priority

P2 ? the public stateful app can be embedded for UI-redress attacks against destructive and authenticated actions.

Finding

The HTML meta CSP has no frame-ancestors; that directive would not be enforceable from a meta policy anyway. The authoritative GitHub Pages response was checked on 2026-08-10 and contains neither an HTTP Content-Security-Policy header nor X-Frame-Options.

An attacker can therefore frame the application cross-origin and use visual overlays to induce clicks on state-consuming controls such as Finish Voyage or on automatic/manual submission controls after the user enters the private key. Same-origin policy prevents direct key/localStorage reads, but it does not prevent clickjacking.

Acceptance criteria

  • Serve Content-Security-Policy: frame-ancestors 'none' as an HTTP response header.
  • Prefer also serving X-Frame-Options: DENY for legacy coverage.
  • If GitHub Pages cannot emit these headers, move or proxy the app through a header-capable host.
  • Add an external-origin iframe test that expects embedding to be refused.
  • Gate deployment on the exact production anti-framing headers.
  • Keep reset confirmation and ensure other sensitive actions have an intentional confirmation model.

Evidence

index.html:6-9, .github/workflows/deploy.yml:97-122, src/components/Board.tsx:143-149, src/components/BorderRollResearch.tsx:189-222. Live response: https://alkwer.github.io/one-more-map.github.io/. Security scan: ace7e3dd-f02d-44c8-be61-0364d510b16f.

Activity

  1. Alkwer commented on Aug 10, 2026

    @Alkwer
    OwnerAuthor

    Runtime hardening is in PR #229: framed execution now stops before App loads or storage is touched, and an external-origin iframe regression test covers it. I am leaving this issue open because its authoritative HTTP-header criteria remain impossible on the current GitHub Pages origin: final closure still requires a header-capable host/proxy serving CSP frame-ancestors none and X-Frame-Options DENY, plus a production-header gate.

  2. added a commit that references this issue on Aug 10, 2026
  3. reopened this on Aug 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions