---
title: 'Alan Adı Taklidi'
source: 'https://academia.sh/tr/kurslar/saldiri-teknikleri/alan-adi-taklidi'
course: 'Saldırı Teknikleri ve Tehdit Ortamı'
language: tr
updated: '2026-08-17T18:08:33+00:00'
license: 'CC BY-SA 4.0'
---

# Alan Adı Taklidi

Yazım hatası ve görsel benzer alan adlarını kurgu bir kayıt listesinde tespit etmek: düzenleme uzaklığı ile görsel normalizasyonun ayrı ayrı ve birlikte yakaladığı aday sayısı, her ölçütün yanlış pozitifi, kaçırılan tek taklit ve kayıt izlemesinin kazandırdığı ortalama 11,3 günlük pencere.

Önceki dersin bütün zincirleri bir kapıdan geçmeyi gerektirdi ve her kapı sayılabilir bir kalemdi.
Uzaktan yapılan bir taklit hiçbir kapıya ihtiyaç duymaz: korunan bir adın bir karakter uzağındaki
bir ad, kaydedildiği anda hiçbir denetimin karşısına çıkmaz. Bu adların **tespiti** ise ölçülebilir
bir iştir ve bu ders yalnız onu ölçer — bir ad üretilmez, gözlenen bir kayıt listesi taranır.

İki ölçüt kullanılır. Birincisi düzenleme uzaklığıdır: bir etiketi korunan bir ada dönüştürmek için
kaç ekleme, silme ve değiştirme gerekiyor. İkincisi görsel benzerliktir: birbirine benzeyen yazımlar
tek bir biçime indirgenir, sonra uzaklık yeniden ölçülür. İkisi farklı taklitleri yakalar ve
ikisinin de kendi yanlış pozitifi vardır. Üçüncü ölçü zaman tarafındadır: bir adın kaydedildiği gün
ile ilk kullanıldığı gün arasındaki fark, savunmanın zinciri hangi halkada kırabileceğini belirler.

- **SM25.** Korunan adlar, kayıt listesi ve günler kurgusaldır ve belgeleme için ayrılmış uzantılar
  kullanılmıştır. Gerçek bir alan adı, kurum ya da marka anılmıyor; ölçülen şey `node` ile kurulan
  modeldir.
- **SM26.** Kayıtların gerçek sınıfı modelde bilinir. Gerçekte sınıf ancak inceleme sonrası bilinir;
  bilindiği varsayılıyor ki yakalanan ile yanlış pozitif ayrı ayrı sayılabilsin.
- **SM27.** Görsel normalizasyon beş karışan biçimle sınırlı tutuldu. Gerçek bir tarayıcıda karışan
  yazım kümesi çok daha geniştir ve farklı yazı sistemlerinden gelen karakterleri de kapsar; dar
  küme yakalananı azaltır, ölçünün yönünü değiştirmez.
- **SM28.** Etiket karşılaştırması uzantıdan bağımsız yapılır. Aynı etiketin farklı bir uzantıyla
  kaydedilmesi uzaklık sıfır verir ve listede böyle bir kayıt vardır.
- **SM29.** İlk kullanım günü modelde bilinir. Gerçekte kullanım ancak gözlendiğinde bilinir;
  pencere bu yüzden modelde olduğundan **kısa** ölçülür.
- **SM30.** Kayıt akışının eksiksiz gözlendiği varsayıldı. Gözlenmeyen bir kayıt hiçbir ölçütle
  bulunamaz ve o durumda zincirin ilk halkası hiç sayılamaz.

## İki Ölçütün Çıktısı

```js
// ad.mjs — korunan adlar, gozlenen kayit listesi ve tespit olcutleri; model (ad uretilmez, olculur)
export const KORUNAN = ['olcumag', 'aboneportali', 'sahaislem']; // uzanti .example
// [etiket, uzanti, kayit gunu, ilk kullanim gunu, gercek sinif]
export const KAYIT = [
  ['olcurnag', '.example', 3, 19, 'taklit'], ['o1cumag', '.test', 5, 12, 'taklit'],
  ['olcunag', '.example', 8, 26, 'taklit'], ['ab0neportali', '.example', 11, 21, 'taklit'],
  ['aboneportali-giris', '.test', 12, 15, 'taklit'], ['sahais1em', '.example', 14, 30, 'taklit'],
  ['sahaisiem', '.invalid', 16, 24, 'taklit'], ['sahaislem', '.test', 18, 22, 'taklit'],
  ['olcumak', '.example', 2, 4, 'ilgisiz'], ['aboneportal', '.test', 6, 9, 'ilgisiz'],
  ['sahaisleme', '.example', 7, 10, 'ilgisiz'], ['olcumagaza', '.test', 9, 13, 'ilgisiz'],
  ['abonelik', '.example', 10, 14, 'ilgisiz'], ['sahakayit', '.invalid', 13, 17, 'ilgisiz'],
  ['olcumerkezi', '.example', 15, 20, 'ilgisiz'], ['portalabone', '.test', 17, 23, 'ilgisiz'],
  ['veriolcum', '.example', 19, 25, 'ilgisiz'], ['sayacokuma', '.invalid', 20, 27, 'ilgisiz'],
  ['faturaservisi', '.example', 21, 28, 'ilgisiz'], ['isemriakisi', '.test', 22, 29, 'ilgisiz'],
  ['bolgeolcum', '.example', 23, 31, 'ilgisiz'], ['aboneislem', '.invalid', 24, 32, 'ilgisiz'],
  ['sahaportali', '.test', 25, 33, 'ilgisiz'], ['olcumveri', '.example', 26, 34, 'ilgisiz'],
  ['olcumaci', '.test', 4, 8, 'ilgisiz'],
];
export function uzaklik(a, b) { // duzenleme uzakligi
  const d = Array.from({ length: a.length + 1 }, (_, i) => [i, ...Array(b.length).fill(0)]);
  for (let j = 0; j <= b.length; j++) d[0][j] = j;
  for (let i = 1; i <= a.length; i++)
    for (let j = 1; j <= b.length; j++)
      d[i][j] = Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1));
  return d[a.length][b.length];
}
// gorsel benzerlik: karisan bicimler tek bir yazima indirgenir, sonra uzaklik olculur
export const normalize = (s) => s.replace(/rn/g, 'm').replace(/vv/g, 'w')
  .replace(/1/g, 'l').replace(/0/g, 'o').replace(/5/g, 's');
export const enYakin = (etiket, f = (x) => x) =>
  KORUNAN.reduce((a, k) => Math.min(a, uzaklik(f(etiket), f(k))), Infinity);
export const pencere = (k) => k[3] - k[2];
// [adim, onkosul, adimi goren denetim, adim bitince dusen kalem]
export const ZINCIR = [
  ['ad kaydi', 'kayit hizmetine erisim', 'kayit akisinin izlenmesi', 0],
  ['posta ve sertifika kurulumu', 'kayitli ad', 'seffaflik kaydinin izlenmesi', 1],
  ['ilk ileti', 'hedef adres listesi', 'gosterge esigi', 2],
  ['kimlik bilgisi toplama', 'inandirici toplama noktasi', 'ikinci etmen', 3],
  ['toplanan bilginin kullanimi', 'gecerli oturum', 'olagandisi oturum tespiti', 6],
];
```

```js
// kosum1.mjs — kayit listesinde duzenleme uzakligi ve gorsel benzerlik olcumu
import { KORUNAN, KAYIT, normalize, enYakin, pencere } from './ad.mjs';

console.log(`${KORUNAN.length} korunan ad (${KORUNAN.map((k) => k + '.example').join(', ')}), ` +
  `${KAYIT.length} gozlenen kayit, ${KAYIT.filter((k) => k[4] === 'taklit').length} taklit\n`);
console.log(`${'etiket'.padEnd(19)} ${'uzanti'.padEnd(9)} ${'sinif'.padStart(7)} ${'uzaklik'.padStart(7)} ` +
  `${'gorsel'.padStart(6)} ${'kayit'.padStart(5)} ${'kullanim'.padStart(8)} ${'pencere'.padStart(7)}`);
const yakin = [...KAYIT].sort((a, b) => enYakin(a[0]) - enYakin(b[0])).filter((k) => enYakin(k[0]) <= 3 || k[4] === 'taklit');
for (const k of yakin)
  console.log(`${k[0].padEnd(19)} ${k[1].padEnd(9)} ${k[4].padStart(7)} ${String(enYakin(k[0])).padStart(7)} ` +
    `${String(enYakin(k[0], normalize)).padStart(6)} ${String(k[2]).padStart(5)} ${String(k[3]).padStart(8)} ` +
    `${String(pencere(k)).padStart(7)}`);
const uzak = KAYIT.filter((k) => enYakin(k[0]) > 3 && k[4] !== 'taklit');
console.log(`\nlistenin geri kalani: ${uzak.length} kayit, uzaklik ${Math.min(...uzak.map((k) => enYakin(k[0])))}-${Math.max(...uzak.map((k) => enYakin(k[0])))}, ` +
  `hicbiri taklit degil ve hicbirinde gorsel esleme yok`);
const gorselSifir = KAYIT.filter((k) => enYakin(k[0], normalize) === 0);
console.log(`gorsel normalizasyondan sonra uzakligi 0 olan kayit ${gorselSifir.length}: ` +
  `${gorselSifir.map((k) => `${k[0]} (${k[4]}, ham uzaklik ${enYakin(k[0])})`).join('; ')}`);
console.log(`normalizasyonun degistirdigi etiket ${KAYIT.filter((k) => normalize(k[0]) !== k[0]).length}`);
```

```
3 korunan ad (olcumag.example, aboneportali.example, sahaislem.example), 25 gozlenen kayit, 8 taklit

etiket              uzanti      sinif uzaklik gorsel kayit kullanim pencere
sahaislem           .test      taklit       0      0    18       22       4
o1cumag             .test      taklit       1      0     5       12       7
olcunag             .example   taklit       1      1     8       26      18
ab0neportali        .example   taklit       1      0    11       21      10
sahais1em           .example   taklit       1      0    14       30      16
sahaisiem           .invalid   taklit       1      1    16       24       8
olcumak             .example  ilgisiz       1      1     2        4       2
aboneportal         .test     ilgisiz       1      1     6        9       3
sahaisleme          .example  ilgisiz       1      1     7       10       3
olcurnag            .example   taklit       2      0     3       19      16
olcumaci            .test     ilgisiz       2      2     4        8       4
olcumagaza          .test     ilgisiz       3      3     9       13       4
aboneportali-giris  .test      taklit       6      6    12       15       3

listenin geri kalani: 12 kayit, uzaklik 4-10, hicbiri taklit degil ve hicbirinde gorsel esleme yok
gorsel normalizasyondan sonra uzakligi 0 olan kayit 5: olcurnag (taklit, ham uzaklik 2); o1cumag (taklit, ham uzaklik 1); ab0neportali (taklit, ham uzaklik 1); sahais1em (taklit, ham uzaklik 1); sahaislem (taklit, ham uzaklik 0)
normalizasyonun degistirdigi etiket 4
```

Tablonun ilk satırı en ucuz taklidi gösteriyor: korunan etiketin **aynısı**, yalnız uzantısı farklı.
Düzenleme uzaklığı sıfırdır ve hiçbir yazım değişikliği içermez. Etiket karşılaştırmasını uzantıdan
bağımsız yapmayan bir tarama bunu hiç görmez.

Uzaklık bir olan satırlarda ölçünün gerilimi görünüyor: altı satırın beşi taklit, üçü ilgisizdir.
Aynı bantta duran `olcumak` ve `aboneportal` gerçek bir taklit değil, korunan ada bir harf uzaklıkta
bulunan başka kelimelerdir. Düzenleme uzaklığı bunları ayıramaz, çünkü ayıracak bilgi uzaklıkta
yoktur.

Görsel sütunu ikinci ölçütün ne yaptığını gösteriyor. Beş kayıtta normalizasyondan sonra uzaklık
sıfıra iniyor ve **beşi de taklittir**. Bunlardan biri ham uzaklığı iki olan `olcurnag`: iki
karakterin birlikte tek bir karaktere benzemesi düzenleme uzaklığını iki adım uzatır, oysa görsel
olarak fark yoktur. Normalizasyon yirmi beş etiketin dördünü değiştiriyor; bu ölçüt dar bir kümede
çalışır ve tam da bu yüzden yanlış pozitif üretmez.

Son satırdaki taklit iki ölçütün de dışında kalıyor. `aboneportali-giris` korunan adı olduğu gibi
içerir ve ona bir sözcük ekler; düzenleme uzaklığı altıdır. İki ölçüt de yazımın **değişmesine**
bakar, oysa burada yazım hiç değişmemiştir.

## Ölçütlerin Karşılaştırması ve Pencere

```js
// kosum2.mjs — esik taramasi, birlesik olcut, izleme penceresi ve zincirin erken kirma kazanci
import { KAYIT, ZINCIR, normalize, enYakin, pencere } from './ad.mjs';

const TAKLIT = KAYIT.filter((k) => k[4] === 'taklit').length;
const say = (f) => { const a = KAYIT.filter(f); return { aday: a.length, dogru: a.filter((k) => k[4] === 'taklit').length,
  yanlis: a.filter((k) => k[4] === 'ilgisiz').length, kacan: KAYIT.filter((k) => k[4] === 'taklit' && !f(k)) }; };
console.log(`${'olcut'.padEnd(28)} ${'aday'.padStart(4)} ${'yakalanan'.padStart(9)} ${'yanlis pozitif'.padStart(14)} ${'kacan'.padStart(5)}`);
for (const e of [0, 1, 2, 3]) {
  const r = say((k) => enYakin(k[0]) <= e);
  console.log(`${`duzenleme uzakligi <= ${e}`.padEnd(28)} ${String(r.aday).padStart(4)} ${`${r.dogru}/${TAKLIT}`.padStart(9)} ` +
    `${String(r.yanlis).padStart(14)} ${String(r.kacan.length).padStart(5)}`);
}
const g = say((k) => enYakin(k[0], normalize) === 0);
console.log(`${'gorsel benzerlik = 0'.padEnd(28)} ${String(g.aday).padStart(4)} ${`${g.dogru}/${TAKLIT}`.padStart(9)} ` +
  `${String(g.yanlis).padStart(14)} ${String(g.kacan.length).padStart(5)}`);
const b = say((k) => enYakin(k[0], normalize) === 0 || enYakin(k[0]) <= 1);
console.log(`${'birlesik (gorsel 0 ya da <=1)'.padEnd(28)} ${String(b.aday).padStart(4)} ${`${b.dogru}/${TAKLIT}`.padStart(9)} ` +
  `${String(b.yanlis).padStart(14)} ${String(b.kacan.length).padStart(5)}`);
console.log(`\nbirlesik olcutun kacirdigi: ${b.kacan.map((k) => `${k[0]} (uzaklik ${enYakin(k[0])}, pencere ${pencere(k)} gun)`).join('; ')}`);
const bulunan = KAYIT.filter((k) => k[4] === 'taklit' && (enYakin(k[0], normalize) === 0 || enYakin(k[0]) <= 1));
const p = bulunan.map(pencere);
console.log(`yakalanan ${bulunan.length} taklit icin izleme penceresi: ortalama ${(p.reduce((a, c) => a + c, 0) / p.length).toFixed(2)} gun, ` +
  `en kisa ${Math.min(...p)}, en uzun ${Math.max(...p)}`);
console.log(`yanlis pozitiflerin elle inceleme yuku: ${b.yanlis} kayit`);

let s = 0; const kumul = ZINCIR.map((a) => (s += a[3]));
console.log(`\n${'#'.padStart(2)} ${'adim'.padEnd(28)} ${'onkosul'.padEnd(27)} ${'denetim'.padEnd(28)} kirilirsa dusen`);
ZINCIR.forEach((a, i) => console.log(`${String(i + 1).padStart(2)} ${a[0].padEnd(28)} ${a[1].padEnd(27)} ${a[2].padEnd(28)} ` +
  `${i ? kumul[i - 1] : 0}`));
console.log(`zincir ${ZINCIR.length} adim, hepsinde denetim var; hic kirilmazsa dusen kalem ${kumul[4]}`);
console.log(`izleme varken en erken halka 1 (dusen 0), en gec halka 5 (dusen ${kumul[3]}); erken kirma kazanci ${kumul[3]} kalem`);
console.log(`kayit izleme yoksa en erken halka 3 (dusen ${kumul[1]}) ve ortalama ${(p.reduce((a, c) => a + c, 0) / p.length).toFixed(2)} gunluk pencere kullanilmaz`);
```

```
olcut                        aday yakalanan yanlis pozitif kacan
duzenleme uzakligi <= 0         1       1/8              0     7
duzenleme uzakligi <= 1         9       6/8              3     2
duzenleme uzakligi <= 2        11       7/8              4     1
duzenleme uzakligi <= 3        12       7/8              5     1
gorsel benzerlik = 0            5       5/8              0     3
birlesik (gorsel 0 ya da <=1)   10       7/8              3     1

birlesik olcutun kacirdigi: aboneportali-giris (uzaklik 6, pencere 3 gun)
yakalanan 7 taklit icin izleme penceresi: ortalama 11.29 gun, en kisa 4, en uzun 18
yanlis pozitiflerin elle inceleme yuku: 3 kayit

 # adim                         onkosul                     denetim                      kirilirsa dusen
 1 ad kaydi                     kayit hizmetine erisim      kayit akisinin izlenmesi     0
 2 posta ve sertifika kurulumu  kayitli ad                  seffaflik kaydinin izlenmesi 0
 3 ilk ileti                    hedef adres listesi         gosterge esigi               1
 4 kimlik bilgisi toplama       inandirici toplama noktasi  ikinci etmen                 3
 5 toplanan bilginin kullanimi  gecerli oturum              olagandisi oturum tespiti    6
zincir 5 adim, hepsinde denetim var; hic kirilmazsa dusen kalem 12
izleme varken en erken halka 1 (dusen 0), en gec halka 5 (dusen 6); erken kirma kazanci 6 kalem
kayit izleme yoksa en erken halka 3 (dusen 1) ve ortalama 11.29 gunluk pencere kullanilmaz
```

Karşılaştırma tablosu iki ölçütün farklı biçimde yanıldığını gösteriyor. Düzenleme uzaklığı eşiği
birden üçe çıkarken yakalanan altıdan yediye çıkıyor ve yanlış pozitif üçten beşe. Görsel benzerlik
tek başına yalnız beş taklit yakalıyor ama **hiç yanlış pozitif üretmiyor**. Birleşik ölçüt yedi
taklit yakalıyor ve üç yanlış pozitif üretiyor; uzaklık eşiği ikiyle aynı yakalamayı bir eksik
yanlış pozitifle veriyor. İki dar ölçütü birleştirmek, tek bir ölçütü gevşetmekten daha az yanlış
üretir — bu, eşik ayarının yerine geçen bir tasarım kararıdır.

Kaçan tek taklit iki ölçütün de sınırıdır. Korunan adı olduğu gibi içeren ve ona bir sözcük ekleyen
bir etiket, uzaklık cinsinden korunan addan uzaktır. Bunu yakalayacak ölçüt bir üçüncüsüdür:
korunan adın **alt dizi olarak** geçmesi. Bu ölçütün kendi yanlış pozitifi olacaktır ve bu ders onu
ölçmüyor; ölçtüğü şey, iki ölçütün birlikte de bir tanesini kaçırdığıdır.

Pencere satırı zaman tarafını veriyor. Yakalanan yedi taklidin kayıt günü ile ilk kullanım günü
arasında ortalama 11,29 gün var; en kısası dört, en uzunu on sekiz gün. Bu süre bir dedektörün
doğruluk ölçüsü değil, savunmanın **elindeki zamandır**: kayıt akışı izleniyorsa zincir birinci
halkada kırılabilir ve o anda hiçbir kalem düşmemiştir.

Pencerenin dağılımı ortalamadan daha çok şey söylüyor. En kısa pencere dört gündür ve tabloya
bakıldığında hangi kayda ait olduğu görünür: korunan etiketin farklı uzantıyla kaydedilmiş hali.
Kurması en ucuz olan taklit, kullanıma da en hızlı geçendir. En uzun pencere on sekiz gündür ve
aradaki oran dört buçuk kattır. Kayıt akışını haftada bir tarayan bir izleme, ortalamanın üzerinde
kalan kayıtları zamanında görür ve dört günlük pencereyi kaçırır; ölçüde belirleyici olan ortalama
değil, en kısa penceredir.

Zincir tablosu bunu kalem cinsinden yazıyor. Beş adımın hepsinde bir denetim var; zincir hiç
kırılmazsa düşen kalem on ikidir. Birinci halkada kırmak sıfır kalemle biter, beşinci halkada
kırmak altı kalemle — erken kırma kazancı altı kalemdir. Kayıt akışı izlenmiyorsa en erken
kırılabilen halka üçüncü adıma kayar: orada bir kalem düşmüştür ve ortalama on bir günlük pencere
hiç kullanılmamıştır. Yanlış pozitiflerin bedeli aynı tabloda üç kayıtlık elle incelemedir; bu, on
bir günlük pencerenin karşılığında ödenen ücrettir.

## Özet

- 25 kayıtlık kurgu listede 8 taklit var. Düzenleme uzaklığı 0 olan 1 kayıt, korunan etiketin farklı
  uzantıyla kaydedilmiş halidir; uzantıdan bağımsız karşılaştırma yapmayan tarama bunu görmez.
- Uzaklık eşiği 1'de 6/8 yakalanıyor ve 3 yanlış pozitif çıkıyor; eşik 3'te yakalanan 7'de kalırken
  yanlış pozitif 5'e çıkıyor.
- Görsel normalizasyon 25 etiketin 4'ünü değiştiriyor ve tek başına 5 taklidi 0 yanlış pozitifle
  yakalıyor. Bunlardan biri ham uzaklığı 2 olan bir kayıttır.
- Birleşik ölçüt 7/8 yakalıyor ve 3 yanlış pozitif üretiyor: aynı yakalamayı uzaklık eşiği 2'den 1
  eksik yanlış pozitifle veriyor.
- Kaçan tek taklit, korunan adı olduğu gibi içerip sözcük ekleyen kayıttır (uzaklık 6). İki ölçüt de
  yazımın değişmesine bakar; burada yazım değişmemiştir.
- Yakalanan 7 taklidin izleme penceresi ortalama 11,29 gün (en kısa 4, en uzun 18). Kayıt izlemesi
  varsa zincir 1. halkada kırılır (0 kalem), yoksa en erken 3. halkada (1 kalem); erken kırma
  kazancı 6 kalem, bedeli 3 kayıtlık elle incelemedir.

## Sonraki Adım

Bu dersin taklidi hedefi kendisine çağırıyordu: bir ad kaydediliyor ve hedefin ona gitmesi
bekleniyordu. Tersi de mümkündür — hedefin **zaten gittiği** bir yerin bozulması. Kurum içindeki
kullanıcıların bir bölümü her gün aynı dış kaynağa uğrar: ortak bir belge deposu, bir sektör
duyuru sayfası, bir betik ya da yazı tipi kaynağı. O kaynak kurumun denetiminde değildir ve tek bir
noktadır. Sonraki dersin sorusu budur: kaç kullanıcı aynı dış kaynağa gidiyor, bu paylaşılan
bağımlılık kaç zinciri aynı anda açıyor ve bir kaynak bütünlüğü denetimi bunların kaçını kırıyor.
