Is VPN VeePN - Free VPN for Firefox safe?
VPN VeePN enumerates all installed browser extensions and sends their names, IDs, and versions to an AWS endpoint on install and update.
On installation or update, the extension calls chrome.management.getAll() and sends each discovered extension's name, ID, version, and install type to an AWS Lambda endpoint operated by VeePN. Every analytics event also includes the user's IP address, country, region, OS and browser version, screen dimensions, timezone, and a persistent device UUID. Additionally, the extension can detect and disable other installed extensions that hold the proxy permission.
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
Extension Can Disable Other Proxy-Control Add-ons
Clicking the extension's proxy-conflict fix option lists enabled add-ons, identifies ones requesting proxy access, and disables each match via the extension-management permission.
This can turn off another VPN or proxy add-on.
You choose the extension's proxy-conflict fix from the popup.
The popup has controls for fixing a blocked proxy connection.
The extension finds enabled add-ons with proxy access and disables each match.
The code excludes its own add-on ID before applying the disable operation.
| Field | Value | Why it matters | |
|---|---|---|---|
Installed add-on type | extension | Shows whether an installed item is a browser add-on that can be considered for the proxy-conflict flow. | |
Proxy access flag | permissions includes proxy | Shows whether another add-on has the kind of access needed to control browser proxy settings. | |
Enabled state | enabled: true | Shows whether the other add-on is currently active and therefore eligible to be turned off by this flow. | |
Add-on identifier | bihmplhobchoageeokmgbdihknkjbknd (illustrative) | Gives the extension a specific installed add-on to disable rather than only showing a general warning. |
Background code that finds and disables proxy-capable add-ons
static async getActiveExtensionsWithProxyPermition() {
return (await r.management.getAll()).filter(n => n.type === "extension" && n.id !== r.runtime.id).filter(n => {
const i = n.enabled,
o = n.permissions?.includes("proxy");
return i && o
})
}
async getProxyControlStatus() {
const e = await r.tabs.query({
active: !0,
currentWindow: !0
}).then(i => i.at(0)?.url),
s = ["chrome://extensions", "about:addons", "edge://extensions", "opera://extensions"].some(i => e?.includes(i));
return {
success: !0,
data: {
blocked: !(await this.proxyService.getControlProxyStatus()).status,
"extensions-tab": s
}
}
}
async openExtensionsTab() {
await Promise.resolve(this);
const s = {
chrome: "chrome://extensions",
firefox: "about:addons",
edge: "edge://extensions",
opera: "opera://extensions"
} ["firefox"];
return await r.tabs.create({
url: s
}), {
success: !0,
data: {
success: !0
}
}
}
async disableProxyControlExtensions() {
await Promise.resolve(this);
const e = await Z.getActiveExtensionsWithProxyPermition();
return await Promise.all(e.map(t => r.management.setEnabled(t.id, !1))), {
success: !0,
data: {
success: !0
}
}
}"get-proxy-control-status": this.getProxyControlStatus.bind(this), "open-extensions-tab": this.openExtensionsTab.bind(this), "disable-proxy-control-extensions": this.disableProxyControlExtensions.bind(this)
Popup controls that send the disable message
r = function() {
sendMessageApp("send-analytic-event", {
types: ["google-analytics", "amplitude", "aws-kinesis"],
name: "extension_connection_blocked_another_extension_fix_for_me"
}).catch(() => {}), sendMessageApp("disable-proxy-control-extensions").then(() => {
e(), i(null)
}).catch(() => {})
}
a = function() {
sendMessageApp("send-analytic-event", {
types: ["google-analytics", "amplitude", "aws-kinesis"],
name: "extension_connection_blocked_another_extension_fix_myself"
}).catch(() => {}), getProxyControlStatus().then(d => {
d["extensions-tab"] ? i("turn-off") : i("instruction")
}).catch(() => {})
}
o = function() {
sendMessageApp("open-extensions-tab").catch(() => {})
}
l = function() {
getProxyControlStatus().then(d => {
d.blocked ? i("help") : (e(), i(null))
}).catch(() => {})
}
c = function() {
sendMessageApp("disable-proxy-control-extensions").then(() => {
e(), i(null)
}).catch(() => {})
}Manifest permission that allows installed-add-on management
"permissions": [ "storage", "proxy", "tabs", "cookies", "notifications", "webRequest", "webRequestAuthProvider", "privacy", "management" ]