Is EdPro Circle safe?
EdPro Circle sends the URL of every non-LinkedIn page you finish loading to mymosttrusted.net.
After each tab finishes loading, the extension's background script posts the page URL, tagged with your profile id, to the vendor's detect-link endpoint. This is skipped on LinkedIn pages and when the extension's hide-in-LinkedIn setting is on. The result is a browsing history record sent to the vendor's server.
Who publishes itMMT Network - 18 other listings from the same operator, 1 of them carrying a finding
MMT Network - 18 other listings from the same operator, 1 of them carrying a finding
What this publisher told the store about itself, and the other listings that told it the same thing.
Same store account
18 other listings published from this account, 927 users between them. 1 of them carries a finding.
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
EdPro Circle posts each non-LinkedIn page URL you load to mymosttrusted.net
Code analysis shows the extension posts the address of each completed page load outside linkedin.com to mymosttrusted.net, with the user's profile id.
Not yet observed running.
- Severity
- High unwanted
- Type
- Unexpected
- CWE
- CWE-359
- Source
- Static analysis
You finish loading a page on any site that is not linkedin.com.
The extension posts that page's full URL, with your profile id, to mymosttrusted.net.
Navigation listener and request builder
Tab update listener
background.jschrome.tabs.onUpdated.addListener(async (tabId, changeInfo, tab) => { if (changeInfo.status == "complete" && tab?.url) { // ... LinkedIn cookie refresh (not part of this claim) ... if (hideinli || chrome.tabs.sendMessage(tabId, { script: "MMTWLEDPROCIRCLEContentLoader", method: "initiate", args: ["callback"] }, null, () => {}), tab?.url && tab.url.search(/linkedin.com/gm) == -1) { var { url } = tab; self.callBackEnd("-v5/detect-link", "POST", { url }, () => {}, true); } }});Request helper
background.jsself.callBackEnd = async function (path, method, body, cb, ...) { // for non-GET: body gets v, app and profile_id added body.v = manifest.version; body.app = manifest.name; body.profile_id ||= profileId; const opts = { method, headers: { Accept: "application/json", "Content-Type": "application/json", trustee: profileId || "" }, body: JSON.stringify(body) }; fetch("https://mymosttrusted.net/api" + path, opts);};- Page URLhttps://meet.google.com/abc-defg-hij
The full address of the page you just loaded, including any query string.
- Profile ida1b2c3d4 (illustrative)
Your account id with the service, sent in the body and in a trustee header.
- Version and app name
Which extension build is sending the request.
- mymosttrusted.net
Vendor API endpoint /api-v5/detect-link that receives each URL with the profile id.
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.
Where it sends data
Destinations our analysis observed EdPro Circle 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.
- mymosttrusted.netwidely used
EdPro Circle sends data to mymosttrusted.net. A widely used service: 39 other extensions we have analysed send data here.