Is Copy Text from Picture safe?
Copy Text from Picture is high risk. Copy Text from Picture loads a Sentry session-replay recorder on every site, not just OCR pages. Test navigation to Wikipedia sent its URL, title, and DOM to copytextfrompicture.xyz. It skips only if OCR is off or the tab isn't focused.
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
Session Replay Records Every Page You Visit, Even Without Using OCR
Copy Text from Picture loads a Sentry session-replay recorder on every site, not just OCR pages.
Test navigation to Wikipedia sent its URL, title, and DOM to copytextfrompicture.xyz.
It skips only if OCR is off or the tab isn't focused.
- Severity
- High unwanted
- Type
- Unexpected
- CWE
- CWE-359
- Source
- Dynamic sandbox
You open any ordinary webpage with Copy Text from Picture installed and enabled.
You don't need to touch the OCR or text-copy feature at all.
The extension's content script starts a Sentry session-replay recording of the page and relays it to copytextfrompicture.xyz.
This happens on the browser's foreground tab on every navigation, whether or not you ever use the OCR tool.
Fired automatically on plain navigation before the OCR/selection feature was ever opened.
- Content-Type
- application/octet-stream
gzip-compressed binary Sentry Replay envelope (228,736 bytes on the wire in one observed test run). Decompressed, the envelope's "urls" field contained the exact page navigated to, plus a full rrweb recording of that page's DOM: its HTML structure and page title.- The exact page you're onhttps://en.wikipedia.org/wiki/Optical_character_recognition
Recorded automatically the moment the page loads.
- Full page content and layout copy<h1 id="firstHeading">Optical character recognition</h1><div id="mw-content-text">...(full article HTML, illustrative)...</div>
The page's HTML is reconstructed on the developer's servers, including any personal or account data visible at capture time.
- The page's titleOptical character recognition - Wikipedia
The browser tab title at the time of capture.
The code that starts, packages, and ships the recording.
The Sentry Replay client initializer
// wc = hardcoded Sentry DSN pointing at copytextfrompicture.xyz/0, not sentry.io// Mc = a custom transport that relays through the background worker// instead of sending directly from the page.Sentry.init({ dsn: SENTRY_DSN, debug: false, transport: relayThroughBackgroundWorker, replaysOnErrorSampleRate: 1, // 100% of error sessions replayed tracesSampleRate: 1, // 100% of sessions traced // replaysSessionSampleRate is never set here, so the SDK keeps its // own default of 1 -- ALL sessions get replayed, not just errors});The page-ready handshake sent to the background
// Runs once per page load, at document_start.chrome.runtime.sendMessage({ type: "CONTENT_READY", title: document.title, href: location.href, timestamp: Date.now(),}).then(({ response }) => { // Background replies with whether this is the foreground tab. // If it is, this actually calls the Sentry.init(...) above. startOrResumeReplay(Boolean(response?.active));});The background relay that gzips and forwards the recording
// Background service worker: relays a Sentry envelope from the content// script to copytextfrompicture.xyz, gzip-compressing it first.if (message.type === "ENVELOPE") { const skip = await isRecordingDisabledInSettings(); if (skip) return { ok: true, skipped: true, statusCode: 204 }; const rawBody = decodeEnvelopeBody(message.body); // base64 -> bytes, or plain string const gzipped = await gzipCompress(rawBody); const res = await fetch(message.url, { method: "POST", headers: message.headers, body: gzipped, }); return { ok: res.ok, statusCode: res.status };}- copytextfrompicture.xyz
The developer's own backend, also in host_permissions. Receives a replay recording of every page you browse while active, including pages where OCR is never opened.
Hooks chrome.runtime.sendMessage from the content-script context to print the Sentry Replay envelope (page URL + DOM snapshot) before the background service worker gzip-compresses and forwards it to copytextfrompicture.xyz - no OCR feature use required.
- Chrome with Developer mode enabled
// ctfp-replay-inspector.js// Run this in the DevTools console attached to any page's content-script// context while "Copy Text from Picture" is installed and active.// It wraps chrome.runtime.sendMessage to reveal the Sentry Replay envelope// body BEFORE it is gzip-compressed and POSTed to copytextfrompicture.xyz.(function () { const origSendMessage = chrome.runtime.sendMessage.bind(chrome.runtime); chrome.runtime.sendMessage = function (message, ...rest) { if (message && message.type === "ENVELOPE") { let bodyText = message.body; if (message.body && message.body.type === "base64") { try { bodyText = decodeURIComponent(escape(atob(message.body.value))); } catch (e) { bodyText = "[binary, could not decode]"; } } console.log("[CTFP_REPLAY] outbound envelope to", message.url); console.log("[CTFP_REPLAY] decoded body:", bodyText); } return origSendMessage(message, ...rest); }; console.log("[CTFP_REPLAY_INSPECTOR] installed. Reload the page and watch the console.");})();- 1Install the extension.
- 2Open chrome://extensions, enable Developer mode.
- 3Open DevTools, switch console context to content script.
- 4Paste this script, Enter.
- 5Reload; skip OCR.
- 6Watch [CTFP_REPLAY] entries for captured content.