Is NetVerify Suite safe?
NetVerify Suite downloads declarativeNetRequest rules from its own server and applies them without validation.
The extension fetches a rule set from api.netverifysuitenow.top at install, 15 minutes later, every 8 hours and on startup, and replaces all of its browser request rules with it. Because it has access to Google and the vendor's domain, the server can change what those rules do. It also sends install-attribution values and a persistent random ID to the vendor, and sends the hostnames of search results to mywot.com to show safety ratings.
Who publishes itNetVerify Suite - no other listings under this identity
NetVerify Suite - no other listings under this identity
What this publisher told the store about itself, and the other listings that told it the same thing.
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
Extension swaps its network rules for a server-supplied ruleset every 8 hours
Code analysis shows the service worker downloads a rule list from api.netverifysuitenow.top and installs it unvalidated as browser request rules for Google and the vendor domain.
The rules themselves were not observed.
- Severity
- High unwanted
- Type
- Unexpected
- CWE
- CWE-829
- Source
- Static analysis
You install the extension and later keep your browser open or restart it.
The extension fetches a rule list from the vendor server and applies it to your browser.
It does this 15 minutes after install, every 8 hours, and at browser startup.
Every 8 hours
A 15 minute one-shot alarm after install, a repeating 8 hour alarm, and a call on each browser startup all trigger the rule download.
Rule download and install path
Alarms and startup hook that trigger the ruleset pull
service-worker-loader.jsfunction scheduleAlarm() { const periodInMinutes = 8 * 60; chrome.alarms.create("ping", { periodInMinutes }); chrome.alarms.create("postInstall", { delayInMinutes: 15 });}chrome.alarms.onAlarm.addListener((alarm) => { if (alarm.name === "ping" || alarm.name === "postInstall") { ur("KeepAlive"); }});chrome.runtime.onStartup.addListener(() => { ur("KeepAlive-Startup"); setupUninstallURL();});function getHeaders() { const encodedKey = "V2hzeTMtZGtpSUc2LXNranc3Zy03aEcyOA==";Request to the vendor backend and parse of the returned JSON
service-worker-loader.js var Geturl = apiurl + "/getRuleset/" + euid; const response = await fetch(Geturl, requestOptions); if (!response.ok) { const errorText = await response.text(); throw new Error( `Request failed with status ${response.status}: ${errorText}` ); } const rules = await response.json(); return rules; } catch (error) { throw error; }}Returned JSON is installed as the dynamic rule set
service-worker-loader.jsasync function ur(reason) { try { const newRules = await fr(reason); chrome.declarativeNetRequest.getDynamicRules((previousRules) => { const previousRuleIds = previousRules.map((rule) => rule.id); chrome.declarativeNetRequest.updateDynamicRules({ removeRuleIds: previousRuleIds, addRules: newRules, }); }); } catch (error) { console.error(error); }}Hardcoded API key sent with the request
service-worker-loader.jsfunction getHeaders() { const encodedKey = "V2hzeTMtZGtpSUc2LXNranc3Zy03aEcyOA=="; const apiKey = atob(encodedKey); const headers = new Headers(); headers.append("x-api-key", apiKey); headers.append("Content-Type", "application/json"); return headers;}- Request reason{"r":"KeepAlive-Startup"}
Tells the server whether this pull was an alarm or a startup.
- API key headerx-api-key: (base64-decoded constant in getHeaders)
A fixed key shipped in every copy, so it identifies the extension, not you.
- Install identifierhttps://api.netverifysuitenow.top/api2/getRuleset/<install uid>
A per-install id in the URL ties each rule pull to your installation.
- Returned rulesJSON array passed to addRules
Whatever the server sends replaces every existing rule; contents were not visible in static review.
- api.netverifysuitenow.top
Vendor backend that creates the install id and serves the ruleset
- www.google.com
Host permission lets server rules act on Google pages
- mywot.com
Also covered by host permissions
Static analysis finding. This behaviour was identified by reading the shipped extension code and has not yet been reproduced in a live run. The trigger conditions and the exact data sent are read from the code, not from an observed capture.
What it can do
Permissions this extension asks for, as declared in version 6.2.1. Asking for a permission is not a finding on its own - it is what the extension can do if it chooses to.
Read and change your data on www.mywot.com
https://www.mywot.com/api/safetyCheck*
Read and change your data on netverifysuitenow.top
*://*.netverifysuitenow.top/*
Read and change your data on www.google.com
*://www.google.com/
Store data in your browser
storage
Schedule its own background tasks
alarms
Block and redirect the requests your browser makes
declarativeNetRequest
Where it sends data
Destinations our analysis observed NetVerify Suite contacting. Sending data somewhere is not a finding on its own - an extension that syncs your settings has to talk to its own server - but it is where your data can go, and who else it goes to.
- www.mywot.com
NetVerify Suite sends data to www.mywot.com. 3 other extensions we have analysed send data here.
- api.netverifysuitenow.top
NetVerify Suite sends data to api.netverifysuitenow.top. No other extension we have analysed sends data here.