← Read the studyrtrvr.ai / security lab

Fictional data · No credentials

See how a page turns an API response into pixels.

Watch a page fetch three fictional messages, render them, and encode a short result as pixels. Then put a permission check in front of the read.

Fetch the messages, then draw the result.

01

Request

GET ./fixtures/channel.json

A real same-origin HTTP request. The response contains invented messages.

02

Render

Fictional channel / #review

Run the example to load the page.

03

Encode

Waiting for the response.

No request sent yet.

See the page code
const response = await fetch('./fixtures/channel.json', {
  credentials: 'omit', cache: 'no-store'
});
const { messages } = await response.json();
for (const message of messages) {
  const line = document.createElement('p');
  line.textContent = `${message.user}: ${message.text}`;
  document.querySelector('#messages').append(line);
}

The bit grid encodes “DEMO:3” and decodes its canvas pixels in memory. It is an encoding illustration, not a decoder for resized screenshots. The page does not reproduce the incident's URL chain or contact an external screenshot service.

What this shows

Check permission before fetching private data.

A screenshot can contain data fetched by the page. A private-data API must check whether the task may read that data before returning it.

Read the implementation plan ↗