Плагин ГИС НР

ID: cdjkkeofanojcdolaakkckkmfcjejlij

Could be malicious

Supported Languages

🇷🇺Russian

Extension Info & Metadata

Status
Removed
Version
2.4
Size
0.82 MB
Rating
1.8/5
Reviews
26
Users
200,000
Type
Extension
Updated
Oct 9, 2024
Category
Make_chrome_yours Accessibility
Price
Free
Featured
No
Visibility
Listed
Mature
No
By Google
No
Trusted
No

Publisher Contextual Analysis

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

Расширение предназначено для видеофиксации действий, осуществляемых на электронных площадках и на сайте ЕИС.

Расширение является встраиваемым в браузер модулем (плагином) и предназначено для выполнения функций по сбору, протоколированию, обработке и хранению данных из информационных систем, используемых в процессе проведения электронных процедур и заключения контрактов на электронных площадках и ЕИС. Плагин ГИС НР позволяет защитить права участников контрактной системы в ходе проведения электронных процедур с помощью встроенного видеоплеера. Пользователь имеет возможность зафиксировать нарушение и/или ошибку, произошедшую на электронной площадке и/или официальном сайте ЕИС, включив запись своей работы на площадке. Записанное видео может быть направлено в ФАС или иной орган в качестве подтверждающих материалов. Важно: фиксации подлежит полный экран компьютера пользователя, включая панель задач и системное время. Во избежание недоразумений во время работы модуля не следует демонстрировать на экране вашего компьютера информацию личного характера, не имеющую отношения к работе на электронной площадке, ЕИС и Официальном сайте торгов.

Item
Type
Severity
Description
<all_urls>
Permission
Critical
This permission grants access to all websites without restriction. Rated High because it can access any web content, monitor all web activity, and potentially steal sensitive data across all sites.
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.
webRequestBlocking
Permission
Critical
This permission allows the extension to intercept, modify, or block any web request in real-time before it reaches its destination. Rated Critical because it can modify sensitive data (like passwords, credit cards) before encryption, redirect traffic to malicious sites, or block security updates.
Dangerous Permission Combination
Risk Factor
Critical
This extension can intercept, modify, and block web requests in real-time.
Contextual Risk Factors
Risk Factor
High
The following context increases the overall risk:• 15% increase: Older manifest version lacks modern security controls
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.
tabs
Permission
Medium
This permission enables tab management and monitoring. Rated Medium because it can track open tabs, access tab metadata, and monitor user browsing patterns.
Older Manifest Version
Risk Factor
Medium
This extension uses Manifest Version 2
notifications
Permission
Low
This permission displays system notifications. Rated Low because it can only show user-visible notifications without accessing system data.
http://127.0.0.1:9822/*
Permission
Unknown
No classification available for this permission.

The extension registers a blocking `webRequest` listener against ALL http and https URLs (`http://*/*` and `https://*/*`), intercepts every main-frame navigation, and exfiltrates the full URL, precise load timing, and HTTP status code to the local server via `SetMarketplaceState`. This constitutes covert surveillance of the user's complete browsing history across every website they visit, not just the stated government procurement portals.

js/background/monitors/request-monitor.js (Line 7)
var urlFilter = {  urls: ["http://*/*", "https://*/*"]};var requestMap = {};var requestStatusMap = {};function sendSetMarketplaceState(url, time, error, statusCode) {  if (url.indexOf('127.0.0.') >= 0)    return;  if (url.indexOf('localhost') >= 0)    return;  if (!time)    return;  if (error && !statusCode)    return;  var data = {    'cmd': 'SetMarketplaceState',    'params': {      'url': url,      'time': time,      'error': error,      'errorCode': statusCode    }  };  CommandService.sendRequestToServer(data).then(function() {});}

The `onBeforeRequest` listener is registered with the `blocking` extra-info spec, meaning the extension can delay or modify every outgoing HTTP/HTTPS request across all websites. Combined with the universal URL filter, this gives the extension a man-in-the-browser position on all traffic. Even though no modification is performed in the current code, the `blocking` capability creates a structural capability for request tampering.

js/background/monitors/request-monitor.js (Line 52)
webRequest().onBeforeRequest.addListener(function(details) {  if (details.type != 'main_frame' || details.url.indexOf(CommandService.SERVICE_HOST) == 0)    return;  requestMap['' + details.requestId] = new Date().getTime();}, urlFilter, ["blocking"])webRequest().onCompleted.addListener(function(details) {  if (details.type != 'main_frame' || details.url.indexOf(CommandService.SERVICE_HOST) == 0)    return;  var time = getTime(details.requestId);  sendSetMarketplaceState(details.url, time, false,    getRequestStatus(details.requestId));}, urlFilter);

Every tab activation, tab update, and browser window focus change triggers extraction of the active tab's full URL and page title, which are then transmitted to the local server. This creates a continuous real-time log of every page the user visits (URL + human-readable page title), sent outside the browser on each navigation event, far beyond any stated functionality of recording government procurement sessions.

js/background/monitors/activ-page-monitor.js (Line 6)
function sendActivPageUrl(url, title) {  if ($rootScope.settings && ($rootScope.app.storage.activUrl != url || $rootScope.app.storage.activPageTitle != title)) {    $rootScope.app.storage.activUrl = url;    $rootScope.app.storage.activPageTitle = title;    var data = {      'cmd': 'SetActivePage',      'params': {        'url': url,        'title': title      }    };    CommandService.sendRequestToServer(data).then(function() {      $rootScope.app.workflow.getStatus();    });  }}// Изменена активная вкладкаtabs().onActivated.addListener(function(info) {  $scope.sendActivTab(info.tabId);});// Обновлена страницаtabs().onUpdated.addListener(function(id, info, tab) {  $scope.sendActivTab(tab.id);});bwindows().onFocusChanged.addListener(function(windowId) {  // ...  $scope.sendActivTab(tabs[0].id);});

A `PostTelemetry` command that includes the user's current active URL is sent to the local server whenever internet connectivity state, time synchronization state, or marketplace availability changes. This constitutes an additional exfiltration channel that correlates the user's current browsing URL with internal system state changes, building a richer behavioral profile.

js/background/controllers/background-controller.js (Line 217)
$rootScope.app.workflow.sendTelemetry = function(oldStatus,  newStatus) {  var f = false;  if (oldStatus.internetState != newStatus.internetState)    f = true;  if (oldStatus.timeState != newStatus.timeState)    f = true;  if (oldStatus.marketplace &&    newStatus.marketplace &&    oldStatus.marketplace.available != newStatus.marketplace.available)    f = true;  if (f) {    var data = {      'cmd': 'PostTelemetry',      'params': {        'url': $rootScope.app.storage.activUrl      }    };    CommandService.sendRequestToServer(data).then(      function(info) {});  }}

The extension exposes its runtime status and version to any external page matching `*://localhost/*` via `chrome.runtime.onMessageExternal`. Any locally-served web application can query the extension's running state and version number without user consent, enabling the local server software (or any attacker who can serve content on localhost) to probe extension state and coordinate behavior.

js/background/controllers/background-controller.js (Line 91)
chrome.runtime.onMessageExternal.addListener(  function(request, sender, sendResponse) {    if (request) {      if (request.message) {        if (request.message == "plugin_status_request") {          sendResponse({            "is_running": $rootScope.app.storage.serverAvailable,            "version": $rootScope.app.storage.status.version          });        }      }    }    return true;  });

The content script, injected into ALL frames of ALL URLs, listens for `window.postMessage` from any origin and responds using the hardcoded plaintext secret `"gisnr_secret_key"`. Because the secret is embedded in the extension's source code (visible via chrome://extensions or the CRX), any webpage that knows this string can detect the extension's presence and version across every site the user visits, enabling cross-site extension fingerprinting. Responses are broadcast with `"*"` target origin, leaking the secret key back to any origin.

js/contentScripts/content-script.js (Line 1)
window.addEventListener("message", function(event) {  if (event.data.secret_key &&    (event.data.secret_key === "gisnr_secret_key") &&    event.data.source === "page") {    if (event.data.type) {      switch (event.data.type) {        case 'is_extension_installed':          window.postMessage({            source: "content_script",            type: 'extension_installed',            secret_key: "gisnr_secret_key",            version: "2.4"          }, "*");          break;      }    }  }}, false);

A unique GUID is generated at service initialization time and appended as `id` to every command sent to the local server. This GUID persists for the lifetime of the background page and acts as a stable per-session identifier, allowing the local server to correlate all browsing data (URLs, timings, telemetry) to a single installation. Combined with the URL tracking, this creates a deanonymizing user fingerprint sent with every data submission.

js/background/services/command-service.js (Line 13)
this.guid = createGuid();this.sendRequestToServer = function(data) {  data.id = this.guid;  var deferred = $q.defer();  $http    .post(this.HOST + $rootScope.settings.pluginCommandPort + this.SERVICE_COMMAND_SUFFIX, data)    .success(      function(response) {        $rootScope.app.workflow.serverChangeActive(true, false);        ...      }).error(function(error) {      $rootScope.app.workflow.serverChangeActive(false, false);      deferred.reject(error);    });  return deferred.promise;};

By severity

Critical1
High4
Medium6
Low0

Versions scanned

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

Extension VersionCode Review Findings
2.104
2.47

Files with findings

6 distinct paths — top paths by unique finding count:

  • js/background/monitors/request-monitor.js3
  • js/background/controllers/background-controller.js2
  • js/background/monitors/activ-page-monitor.js2
  • js/contentScripts/content-script.js2
  • js/background/keepalive.js1
  • js/background/services/command-service.js1
S.No.
Category
Severity
File
Summary
Found in Version
1Unauthorized Data Collection
critical
js/background/monitors/request-monitor.js (line 7)The extension registers a blocking `webRequest` listener against ALL http and https URLs (`http://*/*` and `https://*/*`), intercepts every main-frame navigation, and exfiltrates the full URL, precise load timing, and…
2Network Interception
high
js/background/monitors/request-monitor.js (line 38)This registers global `webRequest` listeners for every top-level HTTP/HTTPS navigation and records the visited URL, timing, and error/status outcome. That is broad browsing telemetry collection across `<all_urls>`, th…
3Network Interception
high
js/background/monitors/request-monitor.js (line 52)The `onBeforeRequest` listener is registered with the `blocking` extra-info spec, meaning the extension can delay or modify every outgoing HTTP/HTTPS request across all websites. Combined with the universal URL filter…
4Tracking
high
js/background/monitors/activ-page-monitor.js (line 6)Every tab activation, tab update, and browser window focus change triggers extraction of the active tab's full URL and page title, which are then transmitted to the local server. This creates a continuous real-time lo…
5Unauthorized Data Collection
high
js/background/monitors/activ-page-monitor.js (line 3)The extension captures the active tab URL and page title, stores them locally, and immediately sends them to the local companion process. Combined with the `<all_urls>` content and tab access, this enables continuous …
6Code Injection
medium
js/background/keepalive.js (line 4)This service worker forcibly injects code into arbitrary open tabs solely to keep itself alive, using `chrome.scripting.executeScript` over a wildcard URL set. The injected code is minimal, but the pattern is still br…
7Other
medium
js/background/controllers/background-controller.js (line 91)The extension exposes its runtime status and version to any external page matching `*://localhost/*` via `chrome.runtime.onMessageExternal`. Any locally-served web application can query the extension's running state a…
8Tracking
medium
js/contentScripts/content-script.js (line 7)Because this content script runs on `<all_urls>`, any page script that knows the hardcoded secret can query whether the extension is installed and receive plugin/VPN status details. That exposes an extension fingerpri…
9Tracking
medium
js/background/controllers/background-controller.js (line 217)A `PostTelemetry` command that includes the user's current active URL is sent to the local server whenever internet connectivity state, time synchronization state, or marketplace availability changes. This constitutes…
10Tracking
medium
js/contentScripts/content-script.js (line 1)The content script, injected into ALL frames of ALL URLs, listens for `window.postMessage` from any origin and responds using the hardcoded plaintext secret `"gisnr_secret_key"`. Because the secret is embedded in the …
11Tracking
medium
js/background/services/command-service.js (line 13)A unique GUID is generated at service initialization time and appended as `id` to every command sent to the local server. This GUID persists for the lifetime of the background page and acts as a stable per-session ide…
URLs
140
IPv4
1
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.

getbootstrap.com-http://getbootstrap.com
github.com/twbs/bootstrap/blob/master/LICENSEhttps://github.com/twbs/bootstrap/blob/master/LICENSE
www.apache.org/licenses/LICENSE-2.0http://www.apache.org/licenses/LICENSE-2.0
www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtdhttp://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd
www.w3.org/2000/svghttp://www.w3.org/2000/svg
www.w3.org/TR/html4/loose.dtdhttp://www.w3.org/TR/html4/loose.dtd
disk.yandex.ru-https://disk.yandex.ru
zakupki.gov.ru/epz/main/public/document/view.htmlhttps://zakupki.gov.ru/epz/main/public/document/view.html?sectionId=920
www.w3.org/1999/02/22-rdf-syntax-nshttp://www.w3.org/1999/02/22-rdf-syntax-ns#
ns.adobe.com/xap/1.0/http://ns.adobe.com/xap/1.0/
Showing 1 to 10 of 140 rows
Rows per page:

Gain full insight into all external connections.

Upgrade for full visibility.

127.0.0.1
IPv4
-
Showing 1 to 9 of 10 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.