MyGate Network Node

ID: hajiimgolngmlbglaoheacnejbnnmoco

Could be malicious

Supported Languages

🇺🇸English

Extension Info & Metadata

Status
Removed
Version
1.0.19
Size
0.64 MB
Rating
4.3/5
Reviews
186
Users
200,000
Type
Extension
Updated
Jan 25, 2025
Category
Productivity Workflow
Price
Free
Featured
No
Visibility
Listed
Mature
No
By Google
No
Trusted
No

Publisher Contextual Analysis

Author
Mygate networkView Profile
MX records exist
No
Domain exists
Yes
Is disposable
No
Is role-based
Yes
Mailbox exists
No
Total Extensions
1
Active
0
Obsolete
1
Listed
1
Unlisted
0
Total Users
200,000

This app allows users to share their network bandwidth with others and earn points as rewards.

This app allows users to share their network bandwidth with others and earn points as rewards. By connecting to the app, users contribute their unused internet resources to a decentralized network. In return, they receive points that can later be swapped for tokens or other benefits within the platform.

Item
Type
Severity
Description
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.
https://app.mygate.network/*
Host
Medium
Host permission — access limited to this URL pattern.
https://api.mygate.network/*
Host
Medium
Host permission — access limited to this URL pattern.
alarms
Permission
Low
This permission schedules periodic tasks. Rated Low because it can only trigger events at specified times without access to sensitive data.

This content script continuously polls the page's localStorage every 100 ms, extracts the persisted auth blob, and forwards it to the extension background page. Pulling bearer-token material from a website's client-side storage is a strong credential-harvesting pattern, especially because it runs continuously without any user action.

content.js (Line 1)
const o = () => {  var t, s;  const e = localStorage.getItem("persist:root");  if (e) {    const a = (t = JSON.parse(e)) == null ? void 0 : t.auth;    a && ((s = JSON.parse(a)) == null ? void 0 : s.token) ? chrome.runtime.sendMessage({      type: "FROM_CONTENT",      data: e    }) : chrome.runtime.sendMessage({      type: "REMOVE_CONTENT"    })  }};setInterval(o, 100);

The background worker receives the auth blob harvested by the content script, parses out the token, and persists it in extension storage. Storing a website session token inside extension-controlled storage expands its lifetime and accessibility beyond the page that originally issued it, which is suspicious even if later API use appears first-party.

background.js (Line 1762)
chrome.runtime.onMessage.addListener((n, e, t) => {  var s;  if (n.type === "FROM_CONTENT") {    const r = JSON.parse(n.data),      i = (s = JSON.parse(r == null ? void 0 : r.auth)) == null ? void 0 : s.token;    i ? chrome.storage.local.set({      token: i    }) : chrome.storage.local.remove("token")  }  n.type === "REMOVE_CONTENT" && chrome.storage.local.remove("token")});

This code takes the previously captured bearer token and a persistent device identifier and uses them to establish a long-lived Socket.IO connection to the remote API. Maintaining a background-authenticated channel with stolen page credentials is a suspicious pattern because it enables remote tasking and ongoing data exchange outside the visible web session.

background.js (Line 1674)
let w = null;const ot = async () => {  try {    const n = await j(),      e = await le("device_id");    if (!n) {      console.error("Token not found");      return    }    w && (console.log("Disconnecting existing socket..."), w.disconnect()), w = C("https://api.mygate.network", {      auth: {        token: `Bearer ${n}`      },      query: {        nodeId: e      },      reconnection: !0,      transports: ["websocket", "polling"]    }), w.on("connect", () => {      console.log("Socket.IO connected")    }), w.on("message", t => {      console.log("Message from server:", t)    }), w.on("disconnect", () => {      console.warn("Socket.IO disconnected")    }), w.on("connect_error", t => {      console.error("Connection error:", t)    })  } catch (n) {    console.error("Failed to connect WebSocket:", n)  }}

The popup generates a stable UUID, stores it as `device_id`, and registers that identifier with the backend as a node. This is a persistent tracking mechanism tied to the user's account/session and background connectivity, which is notable in an extension advertised around bandwidth sharing.

main.js (Line 13835)
return E.useEffect(() => {      const o = async () => {            try {              if (!await qu("device_id")) {                const u = Q1();                await hm({                  device_id: u                })              }            } catch (s) {              console.error("Failed to fetch device ID:", s)            }          }, i = async () => {              var s, u;              try {                const a = await n();                (s = a == null ? void 0 : a.data) != null && s.data && t((u = a == null ? void 0 : a.data) == null ?                  void 0 : u.data)              } catch (a) {                console.error("Failed to fetch user data:", a)              }            }, l = async () => {                try {                  const s = await qu("device_id");                  if (!s) return;                  await r({                    id: s,                    status: "Good",                    activationDate: new Date                  })                } catch (s) {                  console.error("Failed to create node:", s)                }

On every browser startup, the extension automatically opens a new tab to its website. Forced tab creation is not outright malicious by itself, but it is an intrusive behavior commonly associated with adware/growth-hacking extensions and should be treated as suspicious.

background.js (Line 1747)
chrome.runtime.onStartup.addListener(() => {  ut()});chrome.alarms.onAlarm.addListener(async n => {  n.name === "refreshToken" && (await ht() ? (console.log("Incrementing count..."), ct()) : console.log(    "Browser is not open. Skipping increment."))});chrome.runtime.onStartup.addListener(() => {  const n = "https://app.mygate.network";  chrome.tabs.create({    url: n  }, () => {    console.log(`Opened ${n}`)  })});

By severity

Critical0
High6
Medium2
Low1

Versions scanned

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

Extension VersionCode Review Findings
1.0.195
1.0.04

Files with findings

3 distinct paths — top paths by unique finding count:

  • background.js5
  • content.js2
  • main.js2
S.No.
Category
Severity
File
Summary
Found in Version
1Credential Theft
high
content.js (line 1)This content script continuously polls the page's localStorage every 100 ms, extracts the persisted auth blob, and forwards it to the extension background page. Pulling bearer-token material from a website's client-si…
2Credential Theft
high
background.js (line 1762)The background worker receives the auth blob harvested by the content script, parses out the token, and persists it in extension storage. Storing a website session token inside extension-controlled storage expands its…
3Credential Theft
high
background.js (line 1)The background script receives the full serialized Redux state dumped from localStorage, parses it, extracts the authentication bearer token from the `auth` slice, and persists it to `chrome.storage.local`. This token…
4Data Exfiltration
high
background.js (line 1674)This code takes the previously captured bearer token and a persistent device identifier and uses them to establish a long-lived Socket.IO connection to the remote API. Maintaining a background-authenticated channel wi…
5Other
high
background.js (line 1)Immediately on install/startup the background service worker establishes a persistent Socket.IO connection to `api.mygate.network` authenticated with the harvested bearer token, registering the browser as a `nodeId`-i…
6Unauthorized Data Collection
high
content.js (line 1)The content script immediately reads the entire Redux Persist store (`persist:root`) from localStorage on the MyGate web app and transmits the complete serialized application state to the background service worker. Th…
7Tracking
medium
main.js (line 13835)The popup generates a stable UUID, stores it as `device_id`, and registers that identifier with the backend as a node. This is a persistent tracking mechanism tied to the user's account/session and background connecti…
8Unauthorized Data Collection
medium
main.js (line 1)The popup UI's Axios instance silently reads the token from `chrome.storage.local` on every request and injects it as a Bearer authorization header to `https://api.mygate.network/api/front`. On a 401 response it remov…
9Other
low
background.js (line 1747)On every browser startup, the extension automatically opens a new tab to its website. Forced tab creation is not outright malicious by itself, but it is an intrusive behavior commonly associated with adware/growth-hac…
URLs
22
IPv4
0
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.

socket.io/docs/v3/migrating-from-2-x-to-3-0/https://socket.io/docs/v3/migrating-from-2-x-to-3-0/
api.mygate.network-https://api.mygate.network
api.mygate.network/api/front/metadata/nodes/$%7Bn%7D%60;try%7Bconsthttps://api.mygate.network/api/front/metadata/nodes/${n}`;try{const
app.mygate.network-https://app.mygate.network
www.w3.org/2000/svghttp://www.w3.org/2000/svg
www.w3.org/1999/xlinkhttp://www.w3.org/1999/xlink
reactjs.org/docs/error-decoder.htmlhttps://reactjs.org/docs/error-decoder.html?invariant=
www.w3.org/XML/1998/namespacehttp://www.w3.org/XML/1998/namespace
www.w3.org/1998/Math/MathMLhttp://www.w3.org/1998/Math/MathML
www.w3.org/1999/xhtmlhttp://www.w3.org/1999/xhtml
Showing 1 to 10 of 30 rows
Rows per page:

Gain full insight into all external connections.

Upgrade for full visibility.

No IP addresses found
Showing 1 to 10 of 20 rows
Rows per page:

Code Diff

Compare extension code between any two versions.

0 changed files (scanned top 25 shared text files)

No comparable text files found between these versions.

Browse and explore files within this extension package

Gain full insight into all external connections.

Upgrade for full visibility.