Clipboard hooks — verification page

Each test below attempts one of the architectural bypasses from the analysis. If the hook or the existing detector catches the write, the tab redirects to blocked.html — that redirect is the “blocked” signal. If no redirect happens, the bypass succeeded; paste into the textarea or click “Read clipboard” to confirm.

Clipboard inspector

No reads yet.

Architectural bypass tests

A1a. navigator.clipboard.writeText() Expect: blocked

Async API, no copy/cut event. Step-1 hook on Clipboard.prototype.writeText should catch this.

Not run.

A1b. navigator.clipboard.write() single-format Expect: blocked

Single text/plain blob. Hook on Clipboard.prototype.write reads the blob and runs the regex.

Not run.

A1c. navigator.clipboard.write() multi-format (HTML decoy) Expect: blocked

Visible HTML form is benign; text/plain is the command. Terminals paste plain text. Hook inspects the text/plain blob.

Not run.

A3. DataTransfer.setData Expect: blocked

Used by drag-to-terminal lures. Hook on DataTransfer.prototype.setData intercepts. This test invokes setData directly to exercise the hook without requiring a drag gesture.

Not run.

A4. about:blank child frame Expect: blocked

Manifest now sets match_about_blank: true, so the MAIN-world hook and bridge both load inside the child frame. Parent reaches into frame.contentWindow.navigator.clipboard; the child’s patched prototype catches it.

Not run.

A5. Capture-phase stopImmediatePropagation on copy Expect: still bypasses

Page installs a capture-phase listener on window that swallows the copy event before the selection-based detector sees it. Step 1 only covers the async API and DataTransfer; the selection → getSelection() path is unchanged. This test should still leave the payload on the clipboard.

Not run.

Control

Canonical copy event Expect: blocked

Hidden textarea, programmatic selection of the payload, execCommand('copy'). The existing selection-based detector should match and clear the clipboard. Use this to confirm the extension is loaded before interpreting the other results.

Not run.