Is Website Ranking and SEO Checker by Semalt safe?
Website Ranking and SEO Checker by Semalt sends each visited hostname to Semalt ranking and request-log APIs.
The content script runs on all sites and sends the current hostname to Semalt's ranking API, then logs the request with a persistent extension UID to ext.semalt.com. The extension also fetches a remote Semalt tag list that can drive disabling other installed SEO extensions after the user accepts its prompt.
Who publishes itLP - 2 other listings from the same operator, none carrying a finding
LP - 2 other listings from the same operator, none carrying a finding
What this publisher told the store about itself, and the other listings that told it the same thing.
Same store account
2 other listings published from this account, 2k+ users between them, none of them carrying a finding.
Shared hosts - 4 hostnames
Hostnames hardcoded in this extension that few other listings call. That can mean one operator behind both, and it can equally mean a small shared vendor, so it is context rather than a conclusion. Hosts that many listings call are left out: they are services, not connections.
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
Semalt tag list can disable other installed SEO extensions
Accepting the Semalt popup on a Google results page tells the background worker to disable matching SEO extensions, using a list from ext.semalt.com/api/simulator/tags and the Chrome management permission to turn them off.
- Severity
- Medium unwanted
- Type
- Unexpected
- CWE
- CWE-506
- Source
- Dynamic sandbox
The user accepts the Semalt popup.
The extension stores the accepted state, fetches a Semalt tag list, and disables installed SEO extensions whose IDs appear in that list.
- Browser storage statesetSeoExtDisabledSEMALT=true
Records that the Semalt prompt was accepted before the extension asks the background worker to disable matching SEO extensions.
Semalt SEO extension reports every site you visit, logged with a persistent ID
On every page you visit, the extension sends the site's hostname to Semalt's ranking API, then logs that request to Semalt's servers tagged with an ID that stays the same across your whole browsing session.
- Severity
- Medium unwanted
- Type
- Unexpected
- CWE
- CWE-359
- Source
- Dynamic sandbox
You navigate to any website.
No interaction with the extension itself is required.
The extension requests a Semalt search-ranking score for that site's hostname, then reports the request to Semalt's logging endpoint.
This happens on every page load and again if you refocus the tab without a cached score.
Returns a worldwide search-ranking score for the submitted hostname.
{ "uid": "e6c79647-fae6-4dea-8752-d205109f563a", "path": "https://semalt.net/api/v1/serp/rank/", "response_status": "200", "response_time": "312", "details": "{\"site\":\"www.wikipedia.org\",\"se\":1,\"sub\":0}", "extension_id": 1}- The site you visitedwww.wikipedia.org
The exact hostname of the page you just loaded, sent to Semalt's ranking API.
- Your extension IDe6c79647-fae6-4dea-8752-d205109f563a
A UID generated once and stored locally, then reused on every request so Semalt can tie your visits together over time.
- Request outcomeresponse_status: 200, response_time: 312
The HTTP status and response time of the rank lookup, included in the log entry.
- Query details{"site":"www.wikipedia.org","se":1,"sub":0}
The search-engine and ranking parameters sent with the lookup, echoed back into the log.
The hostname of every page you load is used as the rank-lookup key
Renamed equivalent of the snippets above
// content script, runs on document_end for <all_urls>const currentHostname = window.location.hostname;const pageState = { domain: currentHostname, semaltRankScore: null };function fetchSemaltRank(hostname) { return axiosClient.get("https://semalt.net/api/v1/serp/rank/", { params: { site: hostname, se: 1, sub: 0 } }).then(resp => resp.data.result[/* latest date key */].rank_worldwide);}fetchSemaltRank(currentHostname).then(rank => { pageState.semaltRankScore = rank; });window.addEventListener("focus", () => { if (pageState.semaltRankScore == null) fetchSemaltRank(currentHostname);});// axios request interceptor, before every semalt.net/ext.semalt.com callasync function attachRequestId(config) { let uid = await localStorage.getValue("SEMALTuniqueID"); if (!uid) { uid = generateUuid(); await localStorage.setValue("SEMALTuniqueID", uid); } config.metadata = { startTime: new Date(), requestId: uid }; return config;}// axios response interceptoraxiosClient.interceptors.response.use(response => { const logEntry = { uid: response.config.metadata.requestId, path: response.config.url, response_status: String(response.status), response_time: String(new Date() - response.config.metadata.startTime), details: JSON.stringify(response.config.params) }; chrome.runtime.sendMessage({ command: "sendLog", logData: logEntry }); return response;});// background.js: forwards every log entry to Semalt's own serverchrome.runtime.onMessage.addListener((message, sender, sendResponse) => { if (message.command === "sendLog") { fetch("https://ext.semalt.com/api/simulator/api-request-logs", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(message.logData) }).then(r => r.json()).then(data => sendResponse({ status: "success", data })); return true; }});- semalt.net
Receives the hostname of every site you load, used to return a search-ranking score for that site.
- ext.semalt.com
Receives a log of each rank request, including the hostname queried and your persistent extension UID.
What it can do
Permissions this extension asks for, as declared in version 7.5.0. 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 semalt.com
*://*.semalt.com/*
Read and change your data on semalt.global
*://*.semalt.global/*
Read and change your data on g.cn
*://*.g.cn/*
Read and change your data on google.ad
*://*.google.ad/*
Read and change your data on google.ae
*://*.google.ae/*
Read and change your data on google.al
*://*.google.al/*
Read and change your data on google.am
*://*.google.am/*
Read and change your data on google.as
*://*.google.as/*
Read and change your data on google.at
*://*.google.at/*
Read and change your data on google.az
*://*.google.az/*
Read and change your data on google.ba
*://*.google.ba/*
Read and change your data on google.be
*://*.google.be/*
Read and change your data on google.bf
*://*.google.bf/*
Read and change your data on google.bg
*://*.google.bg/*
Read and change your data on google.bi
*://*.google.bi/*
Read and change your data on google.bj
*://*.google.bj/*
Read and change your data on google.bs
*://*.google.bs/*
Read and change your data on google.by
*://*.google.by/*
Read and change your data on google.ca
*://*.google.ca/*
Read and change your data on google.cc
*://*.google.cc/*
Read and change your data on google.cd
*://*.google.cd/*
Read and change your data on google.cf
*://*.google.cf/*
Read and change your data on google.cg
*://*.google.cg/*
Read and change your data on google.ch
*://*.google.ch/*
Read and change your data on google.ci
*://*.google.ci/*
Read and change your data on google.cl
*://*.google.cl/*
Read and change your data on google.cm
*://*.google.cm/*
Read and change your data on google.co.ao
*://*.google.co.ao/*
Read and change your data on google.co.bw
*://*.google.co.bw/*
Read and change your data on google.co.ck
*://*.google.co.ck/*
Read and change your data on google.co.cr
*://*.google.co.cr/*
Read and change your data on google.co.id
*://*.google.co.id/*
Read and change your data on google.co.il
*://*.google.co.il/*
Read and change your data on google.co.in
*://*.google.co.in/*
Read and change your data on google.co.jp
*://*.google.co.jp/*
Read and change your data on google.co.ke
*://*.google.co.ke/*
Read and change your data on google.co.kr
*://*.google.co.kr/*
Read and change your data on google.co.ls
*://*.google.co.ls/*
Read and change your data on google.co.ma
*://*.google.co.ma/*
Read and change your data on google.co.mz
*://*.google.co.mz/*
Read and change your data on google.co.nz
*://*.google.co.nz/*
Read and change your data on google.co.th
*://*.google.co.th/*
Read and change your data on google.co.tz
*://*.google.co.tz/*
Read and change your data on google.co.ug
*://*.google.co.ug/*
Read and change your data on google.co.uk
*://*.google.co.uk/*
Read and change your data on google.co.uz
*://*.google.co.uz/*
Read and change your data on google.co.ve
*://*.google.co.ve/*
Read and change your data on google.co.vi
*://*.google.co.vi/*
Read and change your data on google.co.za
*://*.google.co.za/*
Read and change your data on google.co.zm
*://*.google.co.zm/*
Read and change your data on google.co.zw
*://*.google.co.zw/*
Read and change your data on google.com.af
*://*.google.com.af/*
Read and change your data on google.com.ag
*://*.google.com.ag/*
Read and change your data on google.com.ai
*://*.google.com.ai/*
Read and change your data on google.com.ar
*://*.google.com.ar/*
Read and change your data on google.com.au
*://*.google.com.au/*
Read and change your data on google.com.bd
*://*.google.com.bd/*
Read and change your data on google.com.bh
*://*.google.com.bh/*
Read and change your data on google.com.bn
*://*.google.com.bn/*
Read and change your data on google.com.bo
*://*.google.com.bo/*
Read and change your data on google.com.br
*://*.google.com.br/*
Read and change your data on google.com.bz
*://*.google.com.bz/*
Read and change your data on google.com.co
*://*.google.com.co/*
Read and change your data on google.com.cu
*://*.google.com.cu/*
Read and change your data on google.com.cy
*://*.google.com.cy/*
Read and change your data on google.com.do
*://*.google.com.do/*
Read and change your data on google.com.ec
*://*.google.com.ec/*
Read and change your data on google.com.eg
*://*.google.com.eg/*
Read and change your data on google.com.et
*://*.google.com.et/*
Read and change your data on google.com.fj
*://*.google.com.fj/*
Read and change your data on google.com.gh
*://*.google.com.gh/*
Read and change your data on google.com.gi
*://*.google.com.gi/*
Read and change your data on google.com.gt
*://*.google.com.gt/*
Read and change your data on google.com.hk
*://*.google.com.hk/*
Read and change your data on google.com.jm
*://*.google.com.jm/*
Read and change your data on google.com.kh
*://*.google.com.kh/*
Read and change your data on google.com.kw
*://*.google.com.kw/*
Read and change your data on google.com.lb
*://*.google.com.lb/*
Read and change your data on google.com.lc
*://*.google.com.lc/*
Read and change your data on google.com.ly
*://*.google.com.ly/*
Read and change your data on google.com.mm
*://*.google.com.mm/*
Read and change your data on google.com.mt
*://*.google.com.mt/*
Read and change your data on google.com.mx
*://*.google.com.mx/*
Read and change your data on google.com.my
*://*.google.com.my/*
Read and change your data on google.com.na
*://*.google.com.na/*
Read and change your data on google.com.nf
*://*.google.com.nf/*
Read and change your data on google.com.ng
*://*.google.com.ng/*
Read and change your data on google.com.ni
*://*.google.com.ni/*
Read and change your data on google.com.np
*://*.google.com.np/*
Read and change your data on google.com.om
*://*.google.com.om/*
Read and change your data on google.com.pa
*://*.google.com.pa/*
Read and change your data on google.com.pe
*://*.google.com.pe/*
Read and change your data on google.com.pg
*://*.google.com.pg/*
Read and change your data on google.com.ph
*://*.google.com.ph/*
Read and change your data on google.com.pk
*://*.google.com.pk/*
Read and change your data on google.com.pr
*://*.google.com.pr/*
Read and change your data on google.com.py
*://*.google.com.py/*
Read and change your data on google.com.qa
*://*.google.com.qa/*
Read and change your data on google.com.sa
*://*.google.com.sa/*
Read and change your data on google.com.sb
*://*.google.com.sb/*
Read and change your data on google.com.sg
*://*.google.com.sg/*
Read and change your data on google.com.sl
*://*.google.com.sl/*
Read and change your data on google.com.sv
*://*.google.com.sv/*
Read and change your data on google.com.tj
*://*.google.com.tj/*
Read and change your data on google.com.tr
*://*.google.com.tr/*
Read and change your data on google.com.tw
*://*.google.com.tw/*
Read and change your data on google.com.ua
*://*.google.com.ua/*
Read and change your data on google.com.uy
*://*.google.com.uy/*
Read and change your data on google.com.vc
*://*.google.com.vc/*
Read and change your data on google.com.vn
*://*.google.com.vn/*
Read and change your data on google.com
*://*.google.com/*
Read and change your data on google.cv
*://*.google.cv/*
Read and change your data on google.cz
*://*.google.cz/*
Read and change your data on google.de
*://*.google.de/*
Read and change your data on google.dj
*://*.google.dj/*
Read and change your data on google.dk
*://*.google.dk/*
Read and change your data on google.dm
*://*.google.dm/*
Read and change your data on google.dz
*://*.google.dz/*
Read and change your data on google.ee
*://*.google.ee/*
Read and change your data on google.es
*://*.google.es/*
Act on the current tab, but only after you click the extension
activeTab
Run its own code inside the pages you visit
scripting
See the address and title of every tab you have open
tabs
Store data in your browser
storage
See, disable and uninstall your other extensions, including your security ones
management
Where it sends data
Destinations our analysis observed Website Ranking and SEO Checker by Semalt 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.
- ext.semalt.com
Website Ranking and SEO Checker by Semalt sends data to ext.semalt.com. 2 other extensions we have analysed send data here.
- semalt.net
Website Ranking and SEO Checker by Semalt sends data to semalt.net. No other extension we have analysed sends data here.