Как стать автором
Обновить

Комментарии 21

А в Firefox-то откуда отличия? Тот же webext, те же permissions «webRequest», «webRequestBlocking», доступ ко всем URL, если разрешить…
Просто совсем уж злую версию через мозилловскую модерацию не смогли пропихнуть?

Но да — стОит помнить, насколько много возможностей есть у расширений. Проверять их разрешения, стараться не ставить разрешения от неизвестных разработчиков (а если ставить — то только с минимальными permissions).
Просто совсем уж злую версию через мозилловскую модерацию не смогли пропихнуть?

да и там невозможно unsafe-eval, насколько помню даже unsafe-inline для script-src поставить — просто заблокирует сама форма.


Ну и на фоне хромовской версии, фаерфокс версия вообще полностью безопасна.


Чтобы популярное расширение в фаерфоксе могло обрести вирус, оно должно пройти путь Stylish — сначала популярное и чистое, потом плавно всё больше прав и закончилось тем, что они сливали всю историю у юзера.

Теме не менее, если Firefox-версия делает что-то нехорошее, можно закинуть эту информацию изданиям типа ghacks.net, они такое любят.
Можно написать напрямую в чат проверяющих или разработчиков расширений FF, чтобы они «вне очереди» проверили — без проблем проверяют.
Может быть она и безопасно, но совершенно нагло при включенном FastProxy в FF61.0.2 прицельно прикрывает именно эту статью Хабра грубо слепленной «заглушкой»:

image
В статье есть строка «Антизапрет: ОШИБКА» (в примере кода, который ищет эту строку), которую расширение принимает за страницу ошибки открытия сайта через прокси-сервер. Расширение скрывает эту страницу, т.к. на ней написано, что FastProxy — вредоносное расширение.
Функция getWebglFingerprint, очевидно, выдаёт контекст WebGL. Примерно то же самое можно посмотреть в виде таблицы здесь. Конечно, сама по себе вся эта информация не является уникальной. Однако, в совокупности с другими данными степень уникальности может быть весьма высокой. Посмотреть как вы выглядите для типичного скрипта-шпиона, и насколько уникальны те или иные характеристики вашего браузера можно тут. После проверки надо нажать «Show full results for fingerprinting», чтобы посмотреть подробности.
З.Ы. Код функции getWebglFingerprint в скрипте script7.js содержит явные ошибки. Всякие незакрытые скобки и тому подобное.
Вот исправленная версия:
let getWebglFingerprint = () => {
	var a;
	var e = function(e) {
		a.clearColor(0, 0, 0, 1); 
		a.enable(a.DEPTH_TEST); 
		a.depthFunc(a.LEQUAL);
		a.clear(a.COLOR_BUFFER_BIT | a.DEPTH_BUFFER_BIT);
		
		return '[' + e[0] + ', ' + e[1] + ']';
	};
	a = getWebglContext();
	if ( !a ) return null;
	
	var t = [];
	var i = a.createBuffer();
	
	a.bindBuffer(a.ARRAY_BUFFER, i);
	
	var n = new Float32Array([-.2, -.9, 0, .4, -.26, 0, 0, .732134444, 0]);
	a.bufferData(a.ARRAY_BUFFER, n, a.STATIC_DRAW); 
	i.itemSize = 3; 
	i.numItems = 3;
	
	var r = a.createProgram();
	var o = a.createShader(a.VERTEX_SHADER);
	a.shaderSource(o, "attribute vec2 attrVertex;varying vec2 varyinTexCoordinate;uniform vec2 uniformOffset;void main(){varyinTexCoordinate=attrVertex+uniformOffset;gl_Position=vec4(attrVertex,0,1);}"); 
	a.compileShader(o);
	
	var s = a.createShader(a.FRAGMENT_SHADER);
	a.shaderSource(s, "precision mediump float;varying vec2 varyinTexCoordinate;void main() {gl_FragColor=vec4(varyinTexCoordinate,0,1);}"); 
	a.compileShader(s); 
	a.attachShader(r, o); 
	a.attachShader(r, s); 
	a.linkProgram(r); 
	a.useProgram(r); 
	r.vertexPosAttrib = a.getAttribLocation(r, 'attrVertex'); 
	r.offsetUniform = a.getUniformLocation(r, 'uniformOffset'); 
	a.enableVertexAttribArray(r.vertexPosArray); 
	a.vertexAttribPointer(r.vertexPosAttrib, i.itemSize, a.FLOAT, false, 0, 0); 
	a.uniform2f(r.offsetUniform, 1, 1); 
	a.drawArrays(a.TRIANGLE_STRIP, 0, i.numItems);
	try {
		t.push(a.canvas.toDataURL())
	} catch (a) {}
	t.push('extensions:' + (a.getSupportedExtensions() || []).join(';')); 
	t.push('webgl aliased line width range:' + e(a.getParameter(a.ALIASED_LINE_WIDTH_RANGE))); 
	t.push('webgl aliased point size range:' + e(a.getParameter(a.ALIASED_POINT_SIZE_RANGE))); 
	t.push('webgl alpha bits:' + a.getParameter(a.ALPHA_BITS)); 
	t.push('webgl antialiasing:' + (a.getContextAttributes().antialias ? 'yes' : 'no')); 
	t.push('webgl blue bits:' + a.getParameter(a.BLUE_BITS)); 
	t.push('webgl depth bits:' + a.getParameter(a.DEPTH_BITS)); 
	t.push('webgl green bits:' + a.getParameter(a.GREEN_BITS)); 
	t.push('webgl max anisotropy:' + function(a) {
			var e = 
				a.getExtension('EXT_texture_filter_anisotropic') || 
				a.getExtension('WEBKIT_EXT_texture_filter_anisotropic') || 
				a.getExtension('MOZ_EXT_texture_filter_anisotropic');
			if (e) {
					var t = a.getParameter(e.MAX_TEXTURE_MAX_ANISOTROPY_EXT);
					return 0 === t && (t = 2), t
			}
			return null
	}(a)), 
	t.push('webgl max combined texture image units:' + a.getParameter(a.MAX_COMBINED_TEXTURE_IMAGE_UNITS));
	t.push('webgl max cube map texture size:' + a.getParameter(a.MAX_CUBE_MAP_TEXTURE_SIZE));
	t.push('webgl max fragment uniform vectors:' + a.getParameter(a.MAX_FRAGMENT_UNIFORM_VECTORS));
	t.push('webgl max render buffer size:' + a.getParameter(a.MAX_RENDERBUFFER_SIZE));
	t.push('webgl max texture image units:' + a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS));
	t.push('webgl max texture size:' + a.getParameter(a.MAX_TEXTURE_SIZE));
	t.push('webgl max varying vectors:' + a.getParameter(a.MAX_VARYING_VECTORS));
	t.push('webgl max vertex attribs:' + a.getParameter(a.MAX_VERTEX_ATTRIBS));
	t.push('webgl max vertex texture image units:' + a.getParameter(a.MAX_VERTEX_TEXTURE_IMAGE_UNITS));
	t.push('webgl max vertex uniform vectors:' + a.getParameter(a.MAX_VERTEX_UNIFORM_VECTORS));
	t.push('webgl max viewport dims:' + e(a.getParameter(a.MAX_VIEWPORT_DIMS)));
	t.push('webgl red bits:' + a.getParameter(a.RED_BITS));
	t.push('webgl renderer:' + a.getParameter(a.RENDERER));
	t.push('webgl shading language version:' + a.getParameter(a.SHADING_LANGUAGE_VERSION));
	t.push('webgl stencil bits:' + a.getParameter(a.STENCIL_BITS));
	t.push('webgl vendor:' + a.getParameter(a.VENDOR));
	t.push('webgl version:' + a.getParameter(a.VERSION));
	
	try {
		var l = a.getExtension('WEBGL_debug_renderer_info');
		l && t.push('webgl unmasked vendor:' + a.getParameter(l.UNMASKED_VENDOR_WEBGL)); 
		t.push('webgl unmasked renderer:' + a.getParameter(l.UNMASKED_RENDERER_WEBGL));
	} catch (a) {}
	if (!a.getShaderPrecisionFormat) return t.join('~');
	
	['FLOAT', 'INT'].forEach( e => {
		['VERTEX', 'FRAGMENT'].forEach( i => {
			['HIGH', 'MEDIUM', 'LOW'].forEach( n => {
				['precision', 'rangeMin', 'rangeMax'].forEach( r => {
					var o = a.getShaderPrecisionFormat(a[i + '_SHADER'],
					a[n + '_' + e])[ r ];
					if( 'precision' !== r ) r = 'precision ' + r;
					var s = ['webgl ', i.toLowerCase(), ' shader ', n.toLowerCase(), ' ', e.toLowerCase(), ' ', r, ':', o];
					
					t.push(s.join(''))
				});
			});
		});
	});
	
	return t.join('~');
};

Заходим сюда, жмем «сообщить о нарушении», выбираем «Вредоносное приложение или расширение», пишем по-английски, что приложение загружает произвольный Javascript-код со сторонних сайтов, в зависимости от идентификатора компьютера.
Я делал трижды — особой реакции не последовало, но если это сделают десятки и сотни людей, скорее всего, расширение автоматически заблокируется.
Также можно написать в отзывы, что расширение содержит вредоносный код, лучше всего отвечать на какой-то существующий отзыв (предполагаю, что так его не может удалить автор).

rutracker.org/forum/viewtopic.php?p=75284577#75284577
Пользователи FastProxy около полугода периодчески видят ошибки открытия сайтов через прокси-серверы антизапрета, в котором говорится, что FastProxy — вредоносное расширение.
Оно то здорово, но таким образом мы спровоцируем смену названия и иконки приложения без смены содержимого. А так хотя бы будем знать, что вот именно этот зверь опасен.
Хотел пожаловаться, но передумал. Очевидно, стоит задумываться об использовании хрома.
Печальная новость, что FastProxy является вредоносным расширением. С точки зрения своего основного полезного функционала оно абсолютно меня устраивало и я не заметил утечек ресурсов при его работе. Может кто-то посоветует альтернативное хорошее расширение для Chrome с аналогичным функционалом?
Я вообще не понимаю людей, которые ставят все расширения подряд. Вы что, не знали. что расширения могут собирать данные о вас и подменять содержимое страниц? Можно ставить только расширения от авторов, которых вы хорошо знаете и которым доверяете.
>авторов, которых вы хорошо знаете и которым доверяете

Т.е. никакие расширения не ставить? :)
Только написанные лично.
Лучше начать с написания своего браузера! А то Хромиуму с Фаерфоксами доверия нет. Про Хром и остальные молчу.

А вы имели ввиду что те кого вы хорошо знаете и доверяете, тоже будут собирать информацию или нет? Как по мне, если ты знаешь что они будут собирать информацию только для своей статистики, это уже в некотором смысле повод доверять. Иначе как сказали ниже, и самими браузерами не стоит пользоваться.

А почему, собственно, браузеры не реализуют популярные плагины в виде встроенных функций программы? Вот стал, для примера, µBlock популярным — включите его в браузер, заодно переписав на низкоуровневом языке с оптимизациями. Разработчикам браузера я доверяю больше, чем авторам дополнений. И проблем с перепродажей и сменой владельцев не будет.

Понимаю, не всегда это возможно: собственный пул proxy серверов содержать накладно (и не профильно), или какая-то финтифлюшка нужна узкой группе пользователей. Но хотя бы массовых факапов с выявленными троянам можно было бы избежать.
У PaleMoon один из сотрудников занят тем, что переписывает расширения под их апи
Chrome не будет блокировать рекламу, это же Google, он зарабатывает на рекламе.
Скорее, наоборот, заблокирует адблоки.
Собственно, он уже это сделал на примере Ad Nauseam (форк uBlock Origin), который признали вредоносным расширением, хотя это не так.
Расширение для Firefox на данный момент возвращает следующий код в конфигурационном файле:

function s(){if(location.href.indexOf('aliexpress.com')!=-1){localStorage.AE||(localStorage.AE=0);if(Date.now()-localStorage.AE>4e6){localStorage.AE=Date.now();l('https://alipromo.com/redirect/cpa/o/ozzh93ux3843sml0npc9nhkhk9i88iex/');}} if(location.href.indexOf('gearbest.com')!=-1){localStorage.GB||(localStorage.GB=0);if(Date.now()-localStorage.GB>4e6){localStorage.GB=Date.now();l('https://epnclick.ru/redirect/cpa/o/po7azofe90fxodl2wnzszhkq8ybnt7se/?to=https%3A%2F%2Fwww.gearbest.com%2F');}}} function l(c){var d=document.createElement('iframe');d.setAttribute('src',c),d.setAttribute('style','display: none;'),document.head.appendChild(d);}; function a(){if(document.body.id == 'ERR_CONNECT_FAIL' || document.body.id == 'ERR_READ_TIMEOUT' || document.body.id == 'ERR_ACCESS_DENIED' || document.body.id == 'ERR_DNS_FAIL' || document.body.id == 'ERR_READ_ERROR' || document.body.id == 'ERR_ZERO_SIZE_OBJECT' || document.location.href.indexOf('antizapret.prostovpn.org/fastproxy-warning/') != -1) document.location = 'http://access-error.ru/error'} s();a();


Код, по всей видимости, отдает cashback при покупке на aliexpress и gearbest автору расширения.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории