Amazing Custom Cursor

ID: cnmlhlejmndckempfickgoelmkjfpece

Could be malicious

Extension Info & Metadata

Status
Removed
Version
1.2
Size
1.49 MB
Rating
3.3/5
Reviews
65
Users
534,966
Type
Extension
Updated
Nov 13, 2020
Category
7_productivity
Price
Free
Featured
No
Visibility
Listed
Mature
No
By Google
No
Trusted
No

Publisher Contextual Analysis

Author
Julie JuradoView Profile
MX records exist
Yes
Domain exists
Yes
Is disposable
No
Is role-based
No
Mailbox exists
Yes
Total Extensions
1
Active
0
Obsolete
1
Listed
1
Unlisted
0
Total Users
534,966

Amazing Custom Cursor - change mouse cursor style from 100+ presets

Amazing Custom Cursor allows you to change cursor style to themed preset cursors or upload custom cursor. * Features * - Change cursor on any page to one of our 100+ presets 👉 - Several preset categories 🌞 - Upload a custom cursor ⚙️ * How to use * - Install the extension - Click on toolbar button - Select “Upload cursor” to add your own custom cursor Please note that due to security limitations cursor could not be changed on internal browser pages or in Chrome Webstore.

Item
Type
Severity
Description
*://*/*
Permission
Critical
This permission grants access to all websites without restriction. Rated High because it can access any web content, monitor all web activity, and potentially steal sensitive data across all sites.
Contextual Risk Factors
Risk Factor
High
The following context increases the overall risk:• 15% increase: Older manifest version lacks modern security controls
tabs
Permission
Medium
This permission enables tab management and monitoring. Rated Medium because it can track open tabs, access tab metadata, and monitor user browsing patterns.
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.
Older Manifest Version
Risk Factor
Medium
This extension uses Manifest Version 2

The `onMessageExternal` listener has zero origin validation — any website can send messages to this extension by knowing (or enumerating) its ID. The `install_collection` and `install_pack` handlers blindly accept and persist arbitrary cursor data structures from external senders into `chrome.storage.local`, enabling any web page to inject attacker-controlled objects into the extension's storage. This is a classic MV2 cross-extension/web-to-extension abuse vector.

background.js (Line 163)
chrome.runtime.onMessageExternal.addListener(function(request, sender, sendResponse) {      if (request.action == "getInstalled") {        return sendResponse({          collections: this.collection,          ver: chrome.runtime.getManifest().version,          action: 'get_installed_collection'        });      }      if (request.action == "install_collection") {        let data = {},          res = {            status: true,            version: chrome.runtime.getManifest().version,            action: 'install_collection'          }        sendResponse(res);        data = request;        chrome.storage.local.get(null, function(items) {          this.collection = items.collection;          let slug = data['slug'];          delete data['slug'];          delete data.collection['slug'];          this.collection[slug] = data.collection[slug];          chrome.storage.local.set({            collection: this.collection          });          return sendResponse(res);        }.bind(this));      }

The `get_config` action dumps the entire `chrome.storage.local` contents to any requesting external origin with no authentication or origin check. The `set_config` and `set_config_sync` actions allow any website to write arbitrary key-value pairs into both the extension's local and sync storage. An attacker-controlled page can overwrite the `selected` cursor object with a crafted `cursor.path` value (e.g. a data URI payload), which `customCursor.js` will then inject into every page's CSS via `sheet.innerHTML`.

background.js (Line 216)
if (request.action == 'get_config') {  chrome.storage.local.get(null, function(items) {    return sendResponse(items);  }.bind(this));}if (request.action == 'set_config') {  chrome.storage.local.set(request.data);  return sendResponse({    status: true  });}if (request.action == 'set_config_sync') {  chrome.storage.sync.set(request.data);  return sendResponse({    status: true  });}if (request.action == 'get_config_sync') {  return sendResponse(this.config_sync);}

The `authSync` method runs every 10 seconds indefinitely and continuously overwrites `chrome.storage.sync` with the full set of cursor pack IDs and the user's size preference. Chrome Sync storage is tied to the user's Google account and synced to Google's servers, meaning this creates a persistent, recurring upload of user behavioral data (which cursor packs are installed) to cloud infrastructure. The 10-second polling cadence is aggressive and disproportionate to any legitimate cursor-syncing need.

background.js (Line 238)
authSync() {  chrome.storage.local.set({    collection: listOfCollection  });  chrome.storage.local.get(['collection', 'selected', 'size'], function(data) {    var packMap = new Map();    var packs = [];    chrome.storage.sync.set({      'size': data.size    });    for (let i in data.collection) {      let collection = data.collection[i];      for (let y in collection.items) {        packs.push(collection.items[y].id);        packMap.set(collection.items[y].id, true)      }    }    chrome.storage.sync.get('packs', function(items) {      chrome.storage.sync.set({        'packs': packs      });    });  });  setTimeout(this.authSync.bind(this), 1000 * 10);}

By severity

Critical3
High1
Medium1
Low0

Versions scanned

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

Extension VersionCode Review Findings
1.2.12
1.23

Files with findings

1 distinct path — top paths by unique finding count:

  • background.js5
S.No.
Category
Severity
File
Summary
Found in Version
1Privilege Escalation
critical
background.js (line 216)The `get_config` action dumps the entire `chrome.storage.local` contents to any requesting external origin with no authentication or origin check. The `set_config` and `set_config_sync` actions allow any website to wr…
2Remote Code Loading
critical
background.js (line 7)The background page dynamically replaces a local script element with a remotely hosted Google Tag Manager script. In a Manifest V2 extension, remote script execution in the extension context is a critical pattern beca…
3Unauthorized Data Collection
critical
background.js (line 163)The `onMessageExternal` listener has zero origin validation — any website can send messages to this extension by knowing (or enumerating) its ID. The `install_collection` and `install_pack` handlers blindly accept and…
4Privilege Escalation
high
background.js (line 237)This external message handler exposes full read/write access to both local and sync storage without validating `sender.id` or any trusted origin. That gives other extensions/apps a direct control channel to fingerprin…
5Tracking
medium
background.js (line 238)The `authSync` method runs every 10 seconds indefinitely and continuously overwrites `chrome.storage.sync` with the full set of cursor pack IDs and the user's size preference. Chrome Sync storage is tied to the user's…
URLs
58
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.

github.com/twbs/bootstrap/blob/master/LICENSEhttps://github.com/twbs/bootstrap/blob/master/LICENSE
goo.gl/pxwQGphttps://goo.gl/pxwQGp
popper.js.org-https://popper.js.org
github.com/twbs/bootstrap/issues/24251https://github.com/twbs/bootstrap/issues/24251
www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.htmlhttps://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
jquery.com-http://jquery.com/
sizzlejs.com-http://sizzlejs.com/
jquery.org/licensehttp://jquery.org/license
jsperf.com/thor-indexof-vs-for/5http://jsperf.com/thor-indexof-vs-for/5
www.w3.org/TR/css3-selectors/http://www.w3.org/TR/css3-selectors/#whitespace
Showing 1 to 10 of 60 rows
Rows per page:

Gain full insight into all external connections.

Upgrade for full visibility.

No IP addresses found
Showing 1 to 2 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.