Local Database

Google Güvenli Tarama v5, istemci Depolama Alanı Olmayan Gerçek Zamanlı Mod'u seçmediği sürece istemcinin yerel bir veritabanı tutmasını bekler. Bu yerel veritabanının biçimi ve depolaması istemciye bağlıdır. Bu yerel veritabanının içeriği, kavramsal olarak dosya olarak çeşitli listeler içeren bir klasör olarak düşünülebilir. Bu dosyaların içeriği SHA256 karmaları veya en yaygın olarak kullanılan karma uzunluğu olan dört baytlık karma önekine sahip karşılık gelen ön ekleridir.

Kullanılabilir Listeler

Listeler, farklı adlarıyla tanımlanır. Bu adlar, adında listede görmeyi beklediğiniz karma değerin uzunluğunu belirten bir son ek içeren bir adlandırma kuralına uyar. Aynı tehdit türüne sahip ancak farklı karma uzunluğuna sahip karma listeleri, karma uzunluğunu belirten bir son ek ile niteliklendirilmiş ayrı bir ada sahip liste olur.

Aşağıdaki listeler, karma liste yöntemleriyle kullanılabilir.

Liste Adı İlgili v4 ThreatType Enum Açıklama
gc-32b Yok Bu liste, küresel önbelleğe alma listesidir. Yalnızca gerçek zamanlı çalışma modunda kullanılan özel bir listetir.
se-4b SOCIAL_ENGINEERING Bu liste, SOCIAL_ENGINEERING tehdit türündeki tehditleri içerir.
mw-4b MALWARE Bu liste, masaüstü platformları için KÖTÜ AMAÇLI YAZILIM tehdit türündeki tehditleri içerir.
uws-4b UNWANTED_SOFTWARE Bu liste, masaüstü platformları için UNWANTED_SOFTWARE tehdit türündeki tehditleri içerir.
uwsa-4b UNWANTED_SOFTWARE Bu liste, Android platformları için UNWANTED_SOFTWARE tehdit türündeki tehditleri içerir.
pha-4b POTENTIALLY_HARMFUL_APPLICATION Bu listede, Android platformları için POTENTIALLY_HARMFUL_APPLICATION tehdit türündeki tehditler yer alır.

Daha sonra ek listeler kullanıma sunulabilir. Bu durumda yukarıdaki tablo genişletilir ve hashList.list yönteminin sonuçları, en güncel listelerle benzer bir sonuç gösterir.

Veritabanı Güncellemeleri

İstemci, veritabanını güncellemek için düzenli olarak hashList.get yöntemini veya hashLists.batchGet yöntemini çağırır. Tipik bir istemci aynı anda birden fazla listeyi güncellemek isteyeceğinden hashLists.batchGet yönteminin kullanılması önerilir.

Liste adları hiçbir zaman yeniden adlandırılmaz. Ayrıca, bir liste bir kez gösterilmeye başladıktan sonra hiçbir zaman kaldırılmaz (liste artık yararlı değilse boş olur ancak var olmaya devam eder). Bu nedenle, bu adları Google Güvenli Tarama istemci koduna sabit kodlamak uygundur.

Hem hashList.get yöntemi hem de hashLists.batchGet yöntemi artımlı güncellemeleri destekler. Artımlı güncellemeleri kullanmak bant genişliğinden tasarruf sağlar ve performansı artırır. Artımlı güncellemeler, istemcinin liste sürümü ile listenin en son sürümü arasında bir fark sunarak çalışır. (Yeni dağıtılan ve mevcut sürümü olmayan istemciler için tam güncelleme kullanılabilir.) Artımlı güncelleme, kaldırma dizinlerini ve eklemeleri içerir. İstemcinin önce belirtilen dizinlerdeki girişleri yerel veritabanından kaldırması, ardından eklemeleri uygulaması beklenir.

Son olarak, bozulmayı önlemek için istemcinin, depolanan verileri sunucu tarafından sağlanan sağlama toplamıyla kontrol etmesi gerekir. Kontrol toplamı eşleşmediğinde istemci tam güncelleme yapmalıdır.

Liste içeriğinin kodunu çözme

Karma ve karma ön eklerinin kodunu çözme

Tüm listeler, boyutu azaltmak için özel bir kodlama kullanılarak yayınlanır. Bu kodlama, Google Güvenli Tarama listelerinin kavramsal olarak, istatistiksel olarak rastgele tam sayılardan ayırt edilemeyecek bir karma oluşturma veya karma oluşturma ön eklerinden oluşan bir grup içerdiğini kabul ederek çalışır. Bu tam sayıları sıralar ve bitişik farklarını alırsak bu bitişik farkın bir anlamda "küçük" olması beklenir. Golomb-Rice kodlaması bu küçüklükten yararlanır.

a.example.com/, b.example.com/ ve y.example.com/ olmak üzere üç ana makine soneki yol ön ek ifadesi 4 baytlık karma ön ek kullanılarak iletileceğini varsayalım. Ayrıca, k ile gösterilen Rice parametresinin şu şekilde seçildiğini varsayalım:

  1. Sunucu, sırasıyla aşağıdakiler olan bu dizelerin tam karmasını hesaplamaya başlar:
291bc5421f1cd54d99afcc55d166e2b9fe42447025895bf09dd41b2110a687dc  a.example.com/
1d32c5084a360e58f1b87109637a6810acad97a861a7769e8f1841410d2a960c  b.example.com/
f7a502e56e8b01c6dc242b35122683c9d25d07fb1f532d9853eb0ef3ff334f03  y.example.com/

Ardından sunucu, yukarıdakilerin her biri için 4 baytlık karma ön ekleri oluşturur. Bu ön ekler, büyük endian 32 bit tam sayılar olarak yorumlanan 32 baytlık tam karmanın ilk 4 baytıdır. Büyük endian, tam karmanın ilk baytının 32 bitlik tam sayının en anlamlı baytı haline gelmesini ifade eder. Bu adım, 0x291bc542, 0x1d32c508 ve 0xf7a502e5 tam sayılarıyla sonuçlanır.

Sunucunun bu üç karma ön ekini alfabetik olarak sıralaması gerekir (büyük endian'da sayısal sıralamaya eşdeğerdir). Sıralama sonucu 0x1d32c508, 0x291bc542, 0xf7a502e5 olur. İlk karma ön ek, first_value alanında değiştirilmeden saklanır.

Ardından sunucu, sırasıyla 0xbe9003a ve 0xce893da3 olan iki bitişik farkı hesaplar. k'nın 30 olarak seçildiği varsayıldığında sunucu bu iki sayıyı sırasıyla 2 ve 30 bit uzunluğunda olan kesir ve kalan bölümlerine ayırır. İlk sayı için bölme bölümü sıfır, kalan ise 0xbe9003a'dır. İkinci sayı için bölme bölümü 3'tür çünkü en önemli iki bit ikili sistemde 11'dir ve kalan 0xe893da3'tür. Belirli bir bölme q, tam olarak 1 + q bit kullanılarak (1 << q) - 1 olarak kodlanır; kalan ise doğrudan k bit kullanılarak kodlanır. İlk sayının bölme bölümü 0 olarak kodlanır ve kalan bölümü ikili sistemde 001011111010010000000000111010 şeklindedir; ikinci sayının bölme bölümü 0111 olarak kodlanır ve kalan bölümü 001110100010010011110110100011 şeklindedir.

Bu sayılar bir bayt dizesi olarak oluşturulduğunda küçük endian kullanılır. Kavramsal olarak, en az anlamlı bitlerden başlayarak oluşturulan uzun bir bit dizesi hayal etmek daha kolay olabilir: İlk sayının bölümüne, kalan kısmını ekliyoruz. Ardından ikinci sayının bölümüne, kalan kısmını ekliyoruz. Bu işlem, aşağıdaki büyük sayıya yol açar (netlik için satır sonları ve yorumlar eklenmiştir):

001110100010010011110110100011 # Second number, remainder part
0111 # Second number, quotient part
001011111010010000000000111010 # First number, remainder part
0 # First number, quotient part

Tek bir satırda yazılırsa bu

00111010001001001111011010001101110010111110100100000000001110100

Bu sayı, tek bir bayttaki 8 biti çok aşar. Ardından küçük endian kodlaması, bu sayının en az anlamlı 8 bitini alır ve ilk bayt olarak 01110100 olarak gösterir. Daha net bir şekilde açıklamak gerekirse, yukarıdaki bit dizesini en az anlamlı bitlerden başlayarak sekizli gruplar halinde toplayabiliriz:

0 01110100 01001001 11101101 00011011 10010111 11010010 00000000 01110100

Ardından küçük endian kodlaması, her baytı sağdan alır ve bir bayt dizesine yerleştirir:

01110100
00000000
11010010
10010111
00011011
11101101
01001001
01110100
00000000

Kavramsal olarak soldaki büyük sayıya yeni parçalar eklediğimizde (yani daha fazla önemli bit ekleyerek) ancak sağdan kodladığımızda (yani en az önemli bitler) kodlama ve kod çözme işleminin artımlı olarak gerçekleştirilebileceği görülebilir.

Bu durum,

additions_four_bytes {
  first_value: 489866504
  rice_parameter: 30
  entries_count: 2
  encoded_data: "t\000\322\227\033\355It\000"
}

İstemci, karma ön eklerinin kodunu çözmek için yukarıdaki adımları ters sırada uygular.

Yayından kaldırma indekslerinin kodunu çözme

Kaldırma dizinleri, 32 bit tam sayılar kullanılarak yukarıdakiyle tam olarak aynı teknikle kodlanır.

Güncelleme Sıklığı

İstemci, minimum_wait_duration alanındaki sunucunun döndürdüğü değeri incelemeli ve veritabanının bir sonraki güncellemesini planlamak için bu değeri kullanmalıdır. Bu değer muhtemelen sıfırdır (minimum_wait_duration alanı tamamen eksiktir). Bu durumda istemcinin hemen başka bir güncelleme yapması GEREKİR.