Těžba v prohlížečích
Vznikly webové stránky, které distribuují těžařské javaskripty a zprostředkovávají ukládání vytěžených prostředků do kryptoměnových peněženek. Tyto skripty jsou pak s různými motivacemi a způsoby vkládány do webových stránek. Vytěžená kryptoměna se neukládá do peněženky člověka, co kryptoměnu vytěžil, ale toho, co těžarský skript do stránek vložil.

Což může být majitel stránek, aby tímto způsobem sponzoroval provoz namísto zobrazovaní reklamy. Ale daleko častěji je to útočník, který tyto stránky zneužívá bez vědomí majitele. Tento způsob černé těžby je totiž mnohem méně nápadný než instalace těžařského červa na počítač, a je zcela platformově nezávislý. Funguje na mobilu, tabletu i na PC. A dále ho lze maskovat otevíráním minimalizovaných oken nebo tabů na pozadí.

Co s tím?
Způsob jak znemožnit těžbu kryptoměn ve webových prohlížečích uživatelů, je rozbít propojení webové stránky a těžařského serveru. Regulérní webová stránka načte svůj obsah a jako její součást se stáhnou z adres těžařského serveru i těžařské skripty. Pokud ale zabráníme browseru, aby tyto těžařské části stahoval, stránka se zobrazí bez poškození a k těžbě nedojde.

Jako ochrana vzniklo rozšíření NoCoin, později převedené na filtr do Adblocku se stejným jménem (stránky filtru NoCoin). Tento filtr pracuje na principu filtrace URI. Zablokované URI si browser, při načítání stránky, vůbec nevyžádá. Adblock NoCoin jako způsob ochrany ovšem nelze použít u všech prohlížečů či uživatelů, někteří uživatelé instalaci nezvládnou.

Napadlo mě tedy udělat něco univerzálnějšího než je instalace filtru. Inspiroval jsem se službou, kterou poskytuje CESNET na blokování nepovolených hazardních webů (článek o této službě na Root.cz), spojil ji s filtrem NoCoin a vznikl RPZ filtr pro rekurzivní DNS resolver. Když už ten filtr máme, proč ho neposkytnout všem? Spustil jsem, za pomoci Univerzity Pardubice a fondu rozvoje CESNET, filtr jako veřejně dostupnou službu.

Použití filtru v DNS resolveru Bind
Pokud používáte jako rekurzivní resolver Bind, je konfigurace velmi snadná. Do konfigurace named.conf přidejte zónu filtru a tu přidejte do RPZ pravidel:

options {
...
response-policy {
zone "nocoin.upce.cz";
};
};

zone "nocoin.upce.cz" {
type slave;
masters { 2001:718:603:e195:113:124:0:29; 195.113.124.29; };
file "nocoin.upce.cz";
};
Filtrované domény jsou pak resolverem hlášeny jako neexistující a v logu resolveru uvidíte podobné záznamy:

2020-01-29 06:49:37 named[553]: client @0x7f4f778791f0 10.0.0.1#30232 (smartoffer.site): rpz QNAME NXDOMAIN rewrite smartoffer.site via smartoffer.site.nocoin.upce.cz
Obsah filtru si můžete prohlédnout příkazem:

# dig @dns-nocoin.upce.cz axfr nocoin.upce.cz
Jak moc je těžba rozšířená?
Univerzita Pardubice patří k menším univerzitám, s průměrným počtem 1000 klientů připojených k wifi síti eduroam. Když jsem filtr nasazoval, nepočítal jsem s velkými hodnotami blokací, ale výsledky mě docela ohromily.

Graf blokací

Počty blokací kopírují počty připojených klientů k síti. Jasně je vidět začátek akademického roku (40. týden), přednáškové období, zkouškové období (47. týden), vánoční prázdniny atd. Z grafu je dobře patrné, že těžba kryptoměn ve webových prohlížečích je velmi rozšířená a má cenu se jejím řešením zabývat.

Při analýze blokací se mi potvrdilo, že těžba kryptoměn nerozlišuje mezi mobilními zařízením a PC, snaží se těžit na všem. Nepodařilo se mi bohužel najít zařízení infikované těžařským malware, abych zjistil zda tato ochrana nefunguje také proti newebové těžbě.

Je blokace etická?
No a dostáváme se k závěrečné otázce a podnětem pro velké debaty. Je to filozofická otázka s nejasným závěrem. Je to trochu jako s ohněm, který je dobrým sluhou, ale špatným pánem. Uvedu výčet myšlenek do debaty:

samotné prohlížeče blokují podvodné stránky
prohlížeče obsahují blokátory jak reklam, tak těžby kryptoměn
je to náhrada za reklamu (četl jsem o jednom webu, který tak za dva měsíce provozu vydělal asi 11 Kč)
ušetří to více energie, než když někdo zapomene přes noc zhasnout na WC?
proč šetřit hw uživatelů?
zase nějaké omezování proti svobodě internetu
RPZ v DNS je varianta firewallu

Ochrana proti těžbě kryptoměn pomocí v DNS: vlastní RPZ filtr

Dnes se podíváme na realizaci vlastního RPZ nocoin filtru, pokud se vám nelíbí jeho stahování z veřejného zdroje. Zároveň to můžete brát jako inspiraci pro vlastní pravidla. Sám jsem musel podobný filtr přidat, když manželce začal padat prohlížeč, protože weby pro široké masy asi „vylepšily“ svůj kód o nějaké další reklamní a sledovací skripty a prohlížeč to už nezvládal. Blokací se také dramaticky zvýšila rychlost načítání těchto stránek, ale to jsem odbočil.
Získávání dat z filtru NoCoin
Při provozu vlastního filtru potřebujete získávat informace, že vystavený filtr NoCoinu byl aktualizován. Nemám rád, když si každá služba, co na serveru běží, posílá vlastní notifikační maily. Raději mám notifikování a monitoring centrální službou, u nás používáme NagiosXI. Proto jsem vytvořil skript, který je volán přes NRPE, Nagiosem. Skript stáhne aktuální verzi souboru filtru, porovná ji s lokální verzí a podle výsledku notifikuje.

Je samozřejmě možné použít i jiný dohledový systém, který NRPE podporuje. Jen musíte správně nastavit čas a periodu spouštění skriptu, stačí na 1× denně. Notifikaci nastavíme už na první výskyt ne OK stavu.

Obsah skriptu check_nocoin_file.sh:

#!/bin/bash

#webova adresa na stazeni host tabulky
web_host_table="https://raw.githubusercontent.com/hoshsadiq/adblock-nocoin-list/master/hosts.txt"

#soubor s novymi daty
new_file="/var/cache/bind/nocoin_new.txt"

#soubor se starymi daty
old_file="/var/cache/bind/nocoin_old.txt"

##########################################################
wget -q -O $new_file $web_host_table
diff -q $new_file $old_file > /dev/null 2>&1
if [[ $? == 0 ]]
then echo "no new data"; exit 0
else echo "new data available"; exit 1
fi
Povšimněte si, že NoCoin vydává filtr nejen ve formátu pro Adblock ale také jako lokální host tabulku. A právě toho využijeme, protože host tabulka se lépe parsuje a přetavuje do formy zónového souboru pro Bind.

Sestavování zónového souboru
O parsování staženého souboru, a sestavování zónového souboru, se stará ručně spouštěný skript nocoin_bind.pl. Sestavování zóny jsem nechtěl automatizovat, aby byla kontrola toho, co se ze zóny odebírá a co se do ní přidává. Při případné kompromitaci souboru filtru na internetu nedojde k neštěstí. Po spuštění nám skript ukáže rozdíly a ptá se nás, zda má pokračovat. Pro svou činnost skript potřebuje Perlovské moduly DateTime a Text::Diff.

Ve skriptu je také implementována podpora whitelistu a blacklistu. Jsou to obyčejné textové soubory, kde na každém řádku je jedna doména. Doména na whitelistu nebude do filtru nikdy přidána a doména na blacklistu tam bude přidána vždy.

Sériové číslo generované zóny je založeno na klasickém datumovém systému a jako poslední dvojčíslí je použita hodina. Běžně soubor spouštíme jednou za dlouhou dobu, spuštění dvakrát během jedné hodiny neupraví správně sériové číslo a může způsobit chyby v propagaci aktualizace zóny v DNS.

Instalace vlastního filtru v Bindu
Zónový soubor máme, stačí jej přidat do konfigurace Bindu, který nám plní funkci rekurzivního resolveru.

options {
...
response-policy {
zone "rpz.cesnet.cz";
zone "phishing";
zone "nocoin.upce.cz";
};
};

zone "nocoin.upce.cz" {
file "/etc/bind/nocoin.conf";
type master;
};
Na rozdíl od konfigurace, v předchozím článku, je toto zóna typu master a je v lokálním souboru. Na ukázku zde uvádím více RPZ zón, které používáme. Je to blokace nepovolených hazardních webů a obrana proti phishingu v mailech.

Filtrování phishingu
K phishingu udělám malou odbočku. Byli a občas ještě jsme terčem mailových phishingových útoků. Uživatelé nám tak klikali na linky v mailech a zadávali hesla do podvodných stránek. A některé podvodné stránky byly opravdu zdařilé, včetně fotek našich skutečných stránek.

Pokud IT helpdesk zaznamená výskyt takových mailů, šup s doménou z odkazu do filtru. Uživateli se pak místo podvodné stránky zobrazí varování, že je na něj zkoušen podvod. Pokud byste měli zájem, mohu o této věci napsat také krátký článek.

Aktivace filtru
Ale zpátky k našemu nocoinu. Bind máme nakonfigurovaný, zkontrolujeme, zda je zóna v pořádku a zda ji bind vidí a pak můžeme nás nový filtr aktivovat reloadem Bindu:

root@dns-nocoin:~# named-checkconf -z
zone nocoin.upce.cz/IN: loaded serial 2020010207
root@dns-nocoin:~# rndc reload
Pokud již filtr běží a my ho jen aktualizujeme, krok konfigurace Bindu samozřejmě vynecháme. Jen necháme zónový soubor nově vygenerovat, zkontrolujeme zda jej bind vidí správně a reloadujeme.