PrivataVPN

PrivataVPN

ID: odcghjcagaaplheidgfmhcfdcenlipke

Supported Languages

🇺🇸English

Extension Info & Metadata

Status
Active
Version
0.3
Size
0.53 MB
Rating
0.0/5
Reviews
0
Users
5
Type
Extension
Updated
Jun 3, 2024
Category
Productivity Tools
Price
Free
Featured
No
Visibility
Listed
Mature
Yes
By Google
No
Trusted
No

Publisher Contextual Analysis

Author
privatavpnView Profile
MX records exist
Yes
Domain exists
Yes
Is disposable
No
Is role-based
No
Mailbox exists
Yes
Total Extensions
1
Active
1
Obsolete
0
Listed
1
Unlisted
0
Total Users
5
Screenshot 1

Your Decentralized VPN

New Features: -Enhanced Security -Faster Connection Speeds -New Server Locations -Sleek User Interface -Improved Stability

Item
Type
Severity
Description
proxy
Permission
Critical
This permission allows the extension to control the browser's proxy settings. Rated Critical because it can route all traffic through potentially malicious proxies, enabling man-in-the-middle attacks and traffic monitoring.
background
Permission
Medium
This permission allows continuous background operation. Rated Medium because it can perform actions without user awareness, consume system resources, and maintain persistent connections.
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.

Routes all browser traffic through an IP/port/proxy-type fetched from an attacker-controlled server (api.nurmfirdaus.com). The remote server can push arbitrary SOCKS5/HTTP proxies that MITM every HTTP request the user makes, enabling credential interception, request tampering, and full traffic surveillance. PAC script is constructed by string concatenation with unvalidated remote data, also allowing JS injection into the PAC interpreter.

js/ready.js (Line 104)
if (action == "connect") {  let selected = localStorage.getItem("selected-server")  let jsonSelected = JSON.parse(selected);  let method = "PROXY "  if (jsonSelected.proxy_type == "SOCKS5") {    method = "SOCKS5 "  }  let address = method + jsonSelected.ip + ":" + jsonSelected.port;  var config = {    mode: "pac_script",    pacScript: {      data: "function FindProxyForURL(url, host) {\n" +        "  return '" + address + "';\n" +        "}",    },  };  chrome.proxy.settings.set({      value: config,      scope: "regular"    },    function() {}  );

server.js is registered in manifest.json as a content script matching http://*/* and https://*/*, meaning it injects jQuery and runs a fetch to api.nurmfirdaus.com on every page the user visits. This leaks browsing activity metadata (request timing/frequency from each origin) to the operator and inserts externally-controlled HTML into pages via unescaped string concatenation (item.name/ip/country/port going into innerHTML), enabling injection if the API response is attacker-controlled.

js/server.js (Line 1)
$(document)  .ready(function() {      fetch("https://api.nurmfirdaus.com/vpn/proxy")        .then(response => response.json())        .then(jsonResp => {            $('#server-menu-list')              .empty();            let data = jsonResp.data            data.map(item => {              $('#server-menu-list')                .append(                  '<div class="row row-server"><div class="col col-server-flag"><img class="rounded-circle server-flag" src="./img/flags/' +                  item.name + '.png" /></div><div class="col col-server-country"><p class="server-country">' + item                  .country + '</p><p class="server-ip">' + item.ip +                  '</p></div><div class="col col-server-btn"><button type="button" class="btn btn-info btn-select-server" data-name="' +                  item.name + '" data-ip="' + item.ip + '" data-country="' + item.country + '" data-port="' + item                  .port + '" data-type="' + item.proxy_type + '">Select</button></div></div><br/>');            })

Extension declares content scripts that inject jQuery plus server.js/ready.js into every http and https page. A VPN extension has no legitimate need to run code in the page context of arbitrary third-party websites; this overly broad injection surface lets the operator leak browsing patterns and push DOM-manipulating payloads site-wide with no scoping to the extension's own UI.

manifest.json (Line 31)
{  "content_scripts": [    {      "js": [        "./js/jquery.min.js",        "./js/ready.js",        "./js/server.js"      ],      "matches": [        "http://*/*",        "https://*/*"      ]    }  ]}

Service worker registers a global fetch event handler and re-issues every request through its own fetch(), cloning request bodies and response streams to read their bytes. Beyond merely counting bytes, this pattern gives the extension full programmatic access to the content of every HTTP request/response while proxy is active, providing a direct channel to inspect or exfiltrate request payloads. The asynchronous `is-connected` check also means the branch reading bodies can fire even when the user believes the VPN is off.

js/background.js (Line 24)
// Intercept fetch events to track bandwidth usageself.addEventListener('fetch', (event) => {      event.respondWith(          (async () => {                let connected = false;                chrome.storage.local.get(['is-connected'], (result) => {                  if (result['is-connected']) {                    connected = true;                  } else {                    console.log('The connection status key is not set.');                  }                })                const response = await fetch(event.request);                if (connected) {                  const responseSize = await calculateResponseSize(response.clone());                  const requestClone = event.request.clone();                  const requestBody = await requestClone.arrayBuffer();                  const requestSize = requestBody.byteLength;

On every disconnect, the extension reports the user's total bandwidth consumption (byte_in) tied to a persistent user_id back to api.nurmfirdaus.com. Combined with the fetch-interceptor in background.js, this creates a bandwidth/usage telemetry pipeline tied to user identity with no disclosed privacy policy and no opt-out.

js/ready.js (Line 206)
let user_id = localStorage.getItem('user_id');if (user_id) {  fetch('https://api.nurmfirdaus.com/user/exp/' + user_id, {      method: 'PATCH',      headers: {        'Content-Type': 'application/json'      },      body: JSON.stringify({        byte_in      })    })    .then(response => response.json())    .then(data => {      window.location = './../popup.html';    })    .catch((error) => {      console.error('Error:', error);    });}

Authentication transmits raw email+password to a third-party developer-owned domain (api.nurmfirdaus.com, not a reputable VPN provider) and persists only a user_id in localStorage as a session token. There is no bearer token, no password hashing disclosed, and the credentials are forwarded to infrastructure that also controls the proxy configuration pushed to users' browsers, which is an unusual amount of trust for a free VPN.

js/auth.js (Line 26)
fetch('https://api.nurmfirdaus.com/user/token', {    method: 'POST',    headers: {      'Content-Type': 'application/json'    },    body: JSON.stringify({      email,      password    })  })  .then(response => response.json())  .then(data => {    localStorage.setItem("user_id", data.user_id)    window.location = './../popup.html';  })

By severity

Critical1
High3
Medium2
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
0.36

Files with findings

5 distinct paths — top paths by unique finding count:

  • js/ready.js2
  • js/auth.js1
  • js/background.js1
  • js/server.js1
  • manifest.json1
S.No.
Category
Severity
File
Summary
Found in Version
1Network Interception
critical
js/ready.js (line 104)Routes all browser traffic through an IP/port/proxy-type fetched from an attacker-controlled server (api.nurmfirdaus.com). The remote server can push arbitrary SOCKS5/HTTP proxies that MITM every HTTP request the user…
2Network Interception
high
js/background.js (line 24)Service worker registers a global fetch event handler and re-issues every request through its own fetch(), cloning request bodies and response streams to read their bytes. Beyond merely counting bytes, this pattern gi…
3Tracking
high
js/server.js (line 1)server.js is registered in manifest.json as a content script matching http://*/* and https://*/*, meaning it injects jQuery and runs a fetch to api.nurmfirdaus.com on every page the user visits. This leaks browsing ac…
4Unauthorized Data Collection
high
manifest.json (line 31)Extension declares content scripts that inject jQuery plus server.js/ready.js into every http and https page. A VPN extension has no legitimate need to run code in the page context of arbitrary third-party websites; t…
5Credential Theft
medium
js/auth.js (line 26)Authentication transmits raw email+password to a third-party developer-owned domain (api.nurmfirdaus.com, not a reputable VPN provider) and persists only a user_id in localStorage as a session token. There is no beare…
6Tracking
medium
js/ready.js (line 206)On every disconnect, the extension reports the user's total bandwidth consumption (byte_in) tied to a persistent user_id back to api.nurmfirdaus.com. Combined with the fetch-interceptor in background.js, this creates …
URLs
12
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-https://getbootstrap.com/
github.com/twbs/bootstrap/blob/master/LICENSEhttps://github.com/twbs/bootstrap/blob/master/LICENSE
www.w3.org/2000/svghttp://www.w3.org/2000/svg
api.nurmfirdaus.com/user/tokenhttps://api.nurmfirdaus.com/user/token
api.nurmfirdaus.com/userhttps://api.nurmfirdaus.com/user
api.nurmfirdaus.com/user/https://api.nurmfirdaus.com/user/
api.nurmfirdaus.com/user/exp/https://api.nurmfirdaus.com/user/exp/
api.nurmfirdaus.com/vpn/proxyhttps://api.nurmfirdaus.com/vpn/proxy
clients2.google.com/service/update2/crxhttps://clients2.google.com/service/update2/crx
*/*http://*/*
Showing 1 to 10 of 20 rows
Rows per page:

Gain full insight into all external connections.

Upgrade for full visibility.

127.0.0.1
IPv4
-
Version
Size
Is Malicious
Findings
Permhash
0.3
Latest
0.53 MB
Malicious
6
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.