U.S.T.A. Eklentisi ile Oltalama Saldırılarından Korunmak

Merhaba

Ulusal Siber Tehdit Ağı ( U.S.T.A ), eskiden sızma testi ekip lideri olduğum, güzel insan Can Yıldızlı’nın kurucusu olduğu IntelRAD firması tarafından geliştirilmekte olan ve kurumların yaşadıkları siber tehditleri birbirleri ile paylaşabilme olanağının sunulduğu bir platformdur.

Bu platformun bir çok farklı modülü olsada, belkide son kullanıcıları doğrudan etkileyen özelliği oltalama bildirim servisi’dir. Bu servis temel olarak T.C vatandaşlarını hedef alan oltalama sitelerinin toplandığı bir havuzdur.

Girizgahta da söylediğim gibi bu veriler sadece platform kullanıcısı olan kurumlar tarafından erişilebilmekte olan ham veridir. Intelrad firması da bu verileri kullanarak son kullanıcıların bireysel güvenliğine katkı sağlamayı hedefleyen yeni bir eklenti geliştirmiş.

U.S.T.A. Dolandırıcılık Engelleme Eklentisi

Kod olarak 300-350 satırı geçmeyen bu uygulamanın tam olarak nasıl çalıştığını analiz etmek, herhangi bir bireysel bilgi ifşasına neden olup olmadığını merak ettiğim için eklentinin kaynak kodunu indirip okumaya başladım.

//--------------------------------------------------------------------------------------------------------------------------------------------------
// On tanimlama ile degiskenlerimizi olusturdugumuz kisim.
var {Cc, Ci, Cr} = require("chrome");
let { has } = require('sdk/util/array');
var buttons = require('sdk/ui/button/action');
var tabs = require("sdk/tabs");
var url = require("sdk/url");
var Request = require("sdk/request").Request;
var hashDizi = new Array();
var localStorage = require("sdk/simple-storage");
var timer = require("sdk/timers");
var panels = require("sdk/panel");
var self = require("sdk/self");
var utils = require("sdk/window/utils");
// Tiklandiginda rapor etme islemini gerceklestiren, IntelRad buttonumuz.
var button = buttons.ActionButton({
  id: "intelrad-phishingBlocker",
  label: "Sayfayı Rapor Et",
  icon: {
    "16": "./icon-16.png",
    "32": "./icon-32.png",
    "64": "./icon-64.png"
  },
  onClick: function() {
    var sonuc = "PlaceHolder!";
    var reportURL = require("sdk/tabs").activeTab.url;
    script = "$(function(){$('.showVersion').html('Version: "+localStorage.storage.version+"');$('#report').click(function(){$('.loading').slideToggle();link='"+(reportURL)+"';$.ajax({url:'http://www.oltalama.com/bildirim/',type:'POST',data:{'web_site':'"+(reportURL)+"'}}).done(function(msg){$('#report').hide();$('.loading').slideToggle();if(msg[0]=='0'){$('.message').addClass('alert-success');}else{$('.message').addClass('alert-danger');}$('.message').addClass('alert');$('.alert').text(msg[1]);});});});";

    var panel = panels.Panel({
    width:350,
    contentURL: self.data.url("popup.html"),
    contentScriptFile: self.data.url("jquery.js"),
    contentScript: script
    });

    panel.show({position:button});
  }
});
// Kendisine gelen website domain'inini hashleyip deger donduren fonksiyonumuz.
function getSHA256(website)
{
  var hasher = Cc["@mozilla.org/security/hash;1"].createInstance(Ci.nsICryptoHash);
  hasher.init(hasher.MD5);

  var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
  converter.charset = "UTF-8";

  var bosDeger = {};

  var veri = converter.convertToByteArray(website,bosDeger);
  hasher.update(veri, veri.length);

  var websiteHash = hasher.finish(false);

  md5Hali = [toHexString(websiteHash.charCodeAt(i)) for (i in websiteHash)].join("");
  
  hasher.init(hasher.SHA256);
  bosDeger = {};
  veri = converter.convertToByteArray(md5Hali,bosDeger);
  hasher.update(veri, veri.length);
  websiteHash = hasher.finish(false);
  return [toHexString(websiteHash.charCodeAt(i)) for (i in websiteHash)].join(""); 
  
  function toHexString(charCode)
  {
    return ("0" + charCode.toString(16)).slice(-2);
  }
  
}
// Guncel listeyi verilen url'den xml formatinda alip, tamamen cektiginde parser ile hashleri okuyan fonksiyonumuz.
function getGuncelListe()
{
Request({
  url: "http://www.oltalama.com/media/site/blacklist.json",
  onComplete: jsonParser,
}).get();
}
// Kendisine gonderilen server cevabini, json seklinde parse edip hashleri alan fonksiyonumuz.
function jsonParser(response)
{
  var hashler = response.json.blacklist;
  var hashUzunluk = hashler.length + 1;
  //console.log("Hash uzunlugumuz: "+hashUzunluk);  
  localStorage.storage.hashDizi = [];

  if(!localStorage.storage.hashDizi)
  {
    localStorage.storage.hashDizi = [];
  }

  else
  {
    localStorage.storage.hashDizi = [];
  }

  while(--hashUzunluk)
  {
    localStorage.storage.hashDizi.push(hashler[hashUzunluk-1]);
    //localStorage.storage.hashDizi[hashUzunluk-1] = hashler[hashUzunluk-1];
    //console.log("HASHDIZI["+(hashUzunluk-1)+"]: "+hashDizi[hashUzunluk-1]); 
  }

}
timedJob();

//Kullanicinin girmek istedigi sayfayi karsilastirarak, zararli olup olmadigini test eden fonksyionumuz.
var httpRequestObserver = 
{
  observe: function(subject,topic,data)
  {
    if(topic == "http-on-modify-request")
    {
      var httpChannel = subject.QueryInterface(Ci.nsIHttpChannel);
      var url = httpChannel.URI.spec;
      try
      {
        var hashArray = localStorage.storage.hashDizi;
      }

      catch(err)
      {
        //console.log("Veritabanina baglanilamadi, tekrar deneniyor!");
      }

      if(hashArray !== undefined)
      {
        if(has(hashArray,getSHA256(url)))
        {
          httpChannel.cancel(Cr.NS_BINDING_ABORTED);
          var gBrowser = utils.getMostRecentBrowserWindow().gBrowser;
          var domWin = httpChannel.notificationCallbacks.getInterface(Ci.nsIDOMWindow);
          var browser = gBrowser.getBrowserForDocument(domWin.top.document);
          browser.loadURI("http://www.oltalama.com/engellendi/");
        }
      }
    }
  }
};

var observerService = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
observerService.addObserver(httpRequestObserver, "http-on-modify-request",false);
// Her 5 dakikada bir version bilgisini çekerek, güncelleme gelip gelmediğini test eden fonksiyonumuz.
timer.setInterval(timedJob,300000);
function timedJob()
{
  Request({
    url: "http://www.oltalama.com/media/site/version.json",
    onComplete: function (response) {
      if(response.json.version != localStorage.storage.version)
      {
        localStorage.storage.version = response.json.version;
        //console.log("Yeni version guncellememiz var. Database Version: "+localStorage.storage.version);
        getGuncelListe();
      }
    }
  }).get();
}

Uygulamanın akış diagramı aşağıdaki gibi olduğu yukarıda kaynak kodlardan anlaşılabilir.

  1. İlk çağırılan fonksiyon timedJob() isimli fonksiyondur.
    1. Bu fonksiyon her 5 dakikada bir http://www.oltalama.com/media/site/version.json ve http://www.oltalama.com/media/site/blacklist.json adresinde ki json verisini parse ederek local storage’a kayıt etmektedir.
  2. Kullanıcı herhangi bir URL’i ziyaret etmek istediğinde,
    1. URL’in sadece ve sadece sha256 hash’i alınmaktadır.
    2. Bu hash oltalama.com adresinden gelen oltalama sitesi hashleri ile karşılaştırma yapmaktadır.
    3. Eğer daha önce bilinen bir oltalama sitesine ziyaret gerçekleştirilecek ise, kullanıcının sayfaya erişimi engellenmektedir.

Analiz sonucu olarak fark edilmektedir ki, eklenti herhangi bir kullanıcı bilgisini 3. parti bir yapıya taşımamaktadır.

Kurulum

Kullanıcıların web tarayıcılarındaki hiçbir ziyaret bilgisi ve trafiğini, eklentiyi geliştiren INTELRAD dahil olmak üzere hiçbir üçüncü partiye aktarmayan bu eklenti, kullanıcı gizliliğine tamamen saygılıdır.

Firefox için = https://addons.mozilla.org/en-US/firefox/addon/usta-dolandiricilik-engelleme

Chrome için = https://chrome.google.com/webstore/detail/usta-dolandiricilik-engel/iegkheooaaadfnekeplfghkgabkckpnf?hl=tr