Skip to content

The store listing must not be a photograph of your machine - #70

Merged
sotashimozono merged 1 commit into
mainfrom
shots-without-your-machine
Sep 14, 2026
Merged

sotashimozono merged 1 commit into
mainfrom
shots-without-your-machine

Conversation

@sotashimozono

Copy link
Copy Markdown
Member

Taking the screenshots for the Chrome Web Store listing put six real hosts on screen — the dashboard's second section lists every host ssh can reach, with the user, address, port and jump host ssh -G resolves for each, and the first names the account and path a site is rooted at.

Nothing leaked: e2e/shots/ is gitignored and the files never left the machine. But the documented procedure in STORE.md and issue #45 was "run npm --prefix e2e run shots, attach the output", and the output is somebody's infrastructure, destined for a public page.

The fix

shots.yml (manual dispatch) runs the shots on a fresh runner: throwaway sshd, e2e/tree as the site, and the invented ssh_config in e2e/shots-config/ copied over the runner's own. Nothing in frame belongs to anyone, and the picture is identical every run — which a listing image should be anyway.

gh workflow run shots.yml
gh run download <id> -n store-screenshots

shots.mjs refuses any host but a local one, because a procedure that depends on remembering is the one that fails once:

refusing to photograph Panza: these images go on a public listing, and the dashboard
shows the accounts, addresses, ports and jump hosts of every host your ssh can reach.

The listing had drifted the other way too

The data disclosure declared two things the extension does not do. It told you to tick Website content ("the text of pages … read in order to find the words a note was attached to") and Personal communications ("the notes the user types") — an annotation feature that was removed. Those are false statements on a compliance form. The extension has no content script and no host permission for any site, so there is no code path that could read a page; both are now "no", with what makes them checkable.

web_accessible_resources arrived today and is justified for a reviewer who reads the manifest.

PRIVACY.md invited a check and failed it. It said background.ts contains exactly one fetch. It contains three — control API, proxy script, token on first connect. All three go to 127.0.0.1, which was the point, but a claim offered for verification has to survive being verified.

zizmor clean including the new workflow; the upload-artifact SHA was verified against refs/tags/v4.6.2 rather than recalled.

Taking the screenshots for the Chrome Web Store listing put six of souta's
hosts on screen:

  panza           souta@<address>:<port>
  rosina          <user>@<address>:<port>, via Panza
  yukawa-mercury  <user>@mercury.<site>
  yukawa-sushiki  <user>@Sushiki, via yukawa-mercury
  yukawa-front    <user>@front, via yukawa-mercury
  issp-ohtaka     <user>@ohtaka.<site>

The dashboard's second section lists every host ssh can reach, with what
`ssh -G` resolves for each, and the first names the account and path a site is
rooted at. Those images exist to be uploaded to a public page. Nothing leaked --
`e2e/shots/` is gitignored and the files never left this machine -- but the
documented procedure was "run this, attach the output", and the output is
somebody's infrastructure.

So the shots move to a fresh runner. `shots.yml` sets up a throwaway sshd,
copies the invented ssh_config in `e2e/shots-config/` over the runner's own, and
uploads the images as an artifact. Nothing in frame belongs to anyone, and the
picture is the same every time, which a listing image should be anyway.

`shots.mjs` refuses any host but a local one. A procedure that depends on
remembering is the one that fails once.

The listing text had drifted from the extension in the other direction. Its data
disclosure told you to tick "Website content" and "Personal communications",
describing an annotation feature that was removed -- two false statements on a
compliance form. The extension has no content script and no host permission for
any site, so there is no code path that could read a page; both are now declared
"no" with what makes them checkable. `web_accessible_resources` arrived today
and is justified for a reviewer who reads the manifest.

PRIVACY.md invited a check and failed it: it said `background.ts` contains
exactly one `fetch`. It contains three. All three go to 127.0.0.1, which was the
point being made, but a claim offered for verification has to survive being
verified.

Signed-off-by: Souta <shimozono-sota631@g.ecc.u-tokyo.ac.jp>
@codecov

codecov Bot commented Sep 14, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@sotashimozono
sotashimozono merged commit a441a50 into main Sep 14, 2026
18 checks passed
@sotashimozono
sotashimozono deleted the shots-without-your-machine branch September 14, 2026 13:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant