Meltdown & Spectre Nedir?

Gökhan
11 min readJan 17, 2020

Bu konumuzda üretilen tüm işlemcileri kapsayan Meltdown ve Spectre zafiyetlerini derinlemesine inceliyoruz.

  • Temelde işlemcinin çalışma yapısını hedef alan, donanım bariyerini aşarak kritik bilgilere erişebilen büyük güvenlik açıklarıdır.
  • 2018'in Mayıs ayında Google tarafından tespit edildiği açıklanan bu zafiyetler, şu ana kadar üretilen bütün işlemcileri kapsamaktadır.
  • Intel, AMD ve ARM tarafından üretilen bütün işlemcilerin bu zafiyetten etkilendiği belirtilmekte. Zafiyetten etkilenen işlemciler için henüz kalıcı bir çözüm bulunmuyor.

Açığın Kaynağı

Bu iki güvenlik açığının da ortaya çıkmasına sebep olan kaynaklar hemen hemen aynı. Bunlar kernel bazlı olmakla birlikte, donanımsal düzeyde olduğundan dolayı kalıcı şekilde onarılmaları mümkün değil.

Açıkların kaynağına geçmeden önce, işlemcinin bir process’i Virtual Memory’e nasıl aldığını ve bu alanda nasıl yönettiğini öğrenmemiz gerekli.

CPU Timing Information Attack

CPU Timing Information Attack, işlemcinin authentication işlemleri sırasında geçirdiği zamana göre kelime bazlı tahmin yapılan bir saldırı türüdür.

Örneğin, bir uygulamada authenticate olmak isteniyor. Bu uygulama da User Mode üzerinde Virtual Memory’de çalıştırıldığından dolayı izlenebiliyor.
Uygulamada giriş yapacağımız parolamız “bilgi” olsun. Saldırgan, hedef sistem üzerinde kelime denemelerine başlıyor.
- a harfini deniyor ve red yanıtı alıyor.
- b harfini deniyor ve red yanıtı alıyor, çünkü şifre sadece “b” harfinden oluşmuyor.
Fakat b harfini denediği sırada sistem olması gerekenden daha uzun bir sürede red yanıtını veriyor. Çünkü işlemci, “b” harfi ile “bilgi” parolasını karşılaştırırken, bir harfin uyum sağladığını görüyor, diğer harflere sorgu yapıyor. Bu durumda da ufak bir gecikme yaşanıyor.
Saldırgan bunu farkediyor ve b harfinin parolada bulunduğunu anlıyor. Denemelerine “ba, bb, bc” şeklinde devam ediyor. Bu aşamadan sonra saldırgan için gerekli olan tek şey zaman.

Hemen hemen bütün programlama dillerinde string karşılaştırma işlemi donanıma yük olmaması adına optimize edilmiştir ve iki string de karakter karakter karşılaştırılır. Bu da Timing Info. Attack zafiyetinin oluşmasının önünü açmaktadır.

Peki Meltdown ve Spectre ile ilgisi ne?

Meltdown açığı, işlemcinin karakter bazlı karşılaştırmasını da takip edebilmektedir.

Virtual Memory — Memory Isolation

- VM

Temel anlamda fiziksel donanımın (RAM, CPU, HDD) uygulamalardan soyutlanmasını sağlayan bir tekniktir. Bu sayede uygulama, sistem donanımının üstünde bir kaynak istiyorsa bu kaynak sistem tarafından verilebilmektedir.

Örneğin, sistemde 4 GB bir bellek var ve yarısı dolu durumda. Uygulamanın ihtiyacı olan ise 3 GB bellek alanı. Bu tarz durumlarda Virtual Memory sayesinde gerekli olan bellek alanı, harddiskten ayrılabilmekte.

Bu ayırma işlemini yapan ise kernel’dir. Kernel, her bir Virtual Memory alanını 4KB boyutundaki page adı verilen bölümlere ayırmıştır.

- Memory Isolation

Bu yönetim türü ise, kernel tarafından kullanılan bellek alanının, kullanıcı tarafından kullanılan bellek alanı ile çakışmasını önlemektedir. Normal şartlarda OS (işletim sistemleri) bir process’in, başka bir process’in bellek alanına veya kernel bellek alanına erişmesini engeller.

Bununla birlikte, her bir process, kendisini yürütebilmesi için kernel bellek alanındaki bir adres ile eşleşir ve donanıma bu şekilde bağlanır. Yani donanıma doğrudan bağlantı yapabilen bir uygulama, önceden kernel adresi ile eşleşir, kernel onun yerine bağlantıyı sağlar ve istediği bilgileri verir. Bu bilgiler tabii ki kernel tarafından saklanmaz.

CPU Cache & Main Memory

Modern işlemcilerde, yapılacak olan işlemlerin daha da hızlı gerçekleştirilmesi için önbelleklendirme adı verilen bir yöntem kullanılmaktadır. Bu yöntem sayesinde daha önceden CPU önbelleğine yazılmış veriler diskten veya RAM’den okumaya göre çok daha hızlı şekilde okunur ve işlenir.

Günümüzdeki neredeyse tüm CPU’larda dahili RAM’ler bulunmaktadır. Standart RAM’ler ile karşılaştırıldığında boyut olarak çok küçük olsalar da, hız önceliği bakımından tercih edilmektedirler.

Bu RAM’ler CPU ile entegre chip içerisinde gelir ve CPU’nun bu bölgeye erişmesi normal belleklere göre çok daha hızlı olmaktadır. Bu bölgeye de CPU Cache adı verilir.

Fakat dikkat edilmesi gereken bir nokta ise, CPU Cache’de tutulan veriler uzun ömürlü değildir ve yenileri geldikçe silinmektedir.

Modern CPU’larda L1-L2-L3 önbellekleri bulunmaktadır. Bunların boyutları sırasıyla farklılık gösterir. Bunun sebebi sık kullanılan verinin daha düşük boyutlu fakat daha hızlı ulaşılabilen bellek alanına yazılmasından kaynaklanır.

Örneğin L1 önbelleği 1KB alana sahipse L3 önbelleği 4KB alana sahiptir. Fakat L1 önbelleğine yazılan veriler, L3 önbelleğine yazılan verilerden daha sık kullanılmaktadır. Buna örnek olarak oturum açma bilgileri veya Windows Loglarını verebiliriz.

Speculative Execution (Hatanın Kaynağı)

Günümüz işlemcilerinin yapısı talimatları doğrudan işlemeyi olanaksız kılmaktadır. Her CPU thread (iş parçacığı)’nın kendine ait bir adres yolu vardır ve verilen talimatı bu adres yolu üzerinden diğer thread’ler ile paylaşarak gerçekleştirir.

Önceki başlığımızdaki önbelleklendirme de bu başlıkta son derece önem arz etmektedir.

Daha önce de söylediğimiz gibi CPU, verileri cache’leyerek saklar. Önbellekte yeterli alan yoksa veya istediği veriyi önbellekte bulamazsa RAM’e gider. Bu durum da gecikmeler yaşanmasına sebep olur.

Bu sebeple modern işlemcilerin hepsi, henüz bellekten yanıt gelmesini beklerken işlem yapmaya başlar ve bunu da işlem sırasına göre yapmayabilir. Fakat henüz yanıt gelmeden başladığı için işlem daha kısa sürede tamamlanmış olur. Bu optimizasyon tekniğine de Speculative Execution denmektedir.

Bu optimizasyon tekniği yaklaşık 20 yıldır kullanılmakla birlikte, işlemcilerle birlikte gelen dahili yazılımlarda sürekli olarak algoritması geliştirilmektedir. Elbette bu uzaktan bağlantı ile mümkün olamayacağından yalnızca donanımsal değişikliklerde ortaya çıkmaktadır.

Zafiyetlerin Bunlarla İlgisi Ne?

Şu ana kadar neredeyse tüm işlemcilerin yaptığı optimizasyon tekniklerinden ve çalışma mantıklarından bahsettik. Peki zafiyetlerin bunlarla ilgisi ne?

Son maddede bahsettiğimiz Speculative Execution aslında başlı başına bir zafiyet oluşturuyor.

User Mode’da gerçekleştirilen bütün işlemlerin User Mode içerisinde kaldığından bahsetmiştik. OS için ayrılan alandan hiçbir uygulama Kernel Memory’e ulaşamazdı. Fakat Meltdown doğrudan kernel memory alanına ulaşabiliyor. Örnek bir kod ile inceleyelim.

1. uint8_t* probe_array = new uint8_t[256 * 4096];
2. // … Make sure probe_array is not cached
3. uint8_t kernel_memory = *(uint8_t*)(kernel_address);
4. uint64_t final_kernel_memory = kernel_memory * 4096;
5. uint8_t dummy = probe_array[final_kernel_memory];
6. // … catch page fault
7. // … determine which of 256 slots in probe_array is cached

Aşama 2 Timing Attack

uint8_t dummy = probe_array[1 * 4096] HIZLI
uint8_t dummy = probe_array[2 * 4096] HIZLI
uint8_t dummy = probe_array[3 * 4096] HIZLI
uint8_t dummy = probe_array[4 * 4096] HIZLI
.
.
.
uint8_t dummy = probe_array[67 * 4096] YAVAŞ

Peki önceki kodda ne yapıldı?

Kısaca anlatmak gerekirse, işlemci için bir process oluşturuldu, oluşturulan bu process izlemeye alındı ve anlık olarak cache’lendi. 4KB’lık page sayfasına aktarıldı. İşlemcinin speculative execution yapması sağlandı. Son kodda timing attack yapıldı. İşlemcinin yanıt süresi tespit edildi ve istenen process tarafından authenticate edilen parola bilgisi alındı.

Son kodda “uint8_t dummy = probe_array[67 * 4096]” alanının daha yavaş işlendiği görüldü. Bu da authenticate edilen işlemde ASCII tablosundaki 67 değerinin karşılık geldiği “C” harfinin parolada bulunduğu anlamına geliyor.

Parolanın uzunluğuna göre timing attack ile kernel memory’den alınan bilgiler doğrultusunda authenticate işlemi birebir takip edilebilir.

Eğer ki olası bütün kernel memory adreslerine erişmeye çalışırsak OS tarafından Segmentation Fault hatası verilecektir. Fakat her bir adres için 256 farklı deneme yapılması durumunda bütün kernel memory’sini user process içine, buna bağlı olarak da User Mode içine almış oluruz.

Gördüğünüz gibi aslında erişimin imkansız olması gereken kernel memory’e sadece User Mode’da bir process çalıştırarak erişebiliyoruz. Bu şu ana kadar keşfedilen en büyük güvenlik açıklarından yalnızca biri.

Aslında daha basit anlatırsak hiçbir şekilde koda gerek kalmaz.

Normal şartlarda execute edilebilen bir process yalnızca OS Memory’de kalır ve user mode içerisinde çalışır. Kernel memory’e kendisi erişemez. Fakat istek yollayabilir. Çeşitli durumlara göre de donanım ile olan bağlantısında kernel memory’i köprü olarak kullanabilir.

Meltdown güvenlik açığında ise, işlemcinin Speculative Execution yaparak önceden veri işlemesinden yararlanılıyor ve process tarafından izlemeye alınıyor. Bu izleme sonucunda kernel memory’nin bir adresinin bilgisi cache’leniyor. Bu adres bilgisi ile diğer sorgular da yapılıyor. Her bir sorgu için 256 farklı deneme yapılabiliyor ve bu sayede parola elde edilebiliyor.

Bu bahsettiğimiz güvenlik açığı kredi kartı bilgilerinden kullanıcı parolalarına kadar aklınıza gelebilecek her şeye erişim sağlanmasına yol açıyor.

Meltdown

Meltdown güvenlik açığı, en kritik açık olarak kabul ediliyor. Örnek kodumuzda gösterdiğimiz açık aslında bir Meltdown açığıydı.

Meltdown temelde uygulamaların donanım ile arasındaki bariyeri kırarak önbellekteki verileri okumasına izin veren bir güvenlik açığıdır.

1995 yılından bu zamana kadar üretilen tüm Intel işlemcilerde bulunmaktadır. Itanium çipine sahip sunucu işlemcileri ve bazı Intel Atom işlemciler ise bu zafiyetten etkilenmemektedir.

AMD ve ARM tarafında ise Meltdown açığı bulunmamaktadır. Bu konuda AMD ve ARM biraz daha güvenli bir ortam oluşturmaktadır.

Meltdown güvenlik açığı istismarı sırasında kullanıcı hiçbir şey farketmez. Standart bir process de aynı kodları yürüterek Speculative Execution tetikleyebilir ve Segmentation Fault almadan verileri okuyabilir.

Neler Yapılabilir? — Meltdown

Meltdown güvenlik açığı ile kullanıcı parolaları, önbellekte tutulan bütün bilgiler, donanım bilgileri, işlemci desteğine bağlı olarak coğrafi konum bilgileri ve çevrimiçi bankacılık bilgileri dahi elde edilebilir.

Meltdown güvenlik açığının en kritik noktasından birisi ise bulut sunucularında da istismar edilebiliyor olmasıdır. Intel Xeon işlemcilerin de bu açıktan etkilendiğini düşünürsek, standart bir bulut sunucunun da etkilenmesi çok da ilginç bir durum değil.

Bir bulut sunucuda Meltdown istismarı gerçekleşmesi durumunda o an CPU’larda tutulan önbellek verileri okunabilir, kullanıcıların dosyaları açığa çıkabilir ve en önemlisi de aktif oturumlar takip edilerek hesap bilgileri ele geçirilebilir.

Henüz böyle bir skandal yaşandı mı net bir bilgi yok. Mevcut bulut hizmetleri (Microsoft OneDrive, Google Drive, Yandex.Disk vs.) henüz bu konu hakkında etkilendiklerine veya bilgi sızdırıldığına dair bir bilgi paylaşmadı. Fakat bu asla olmayacağı anlamına veya olmadığı anlamına gelmiyor. Günümüzdeki birçok dev şirket, bilgi sızdırıldığından aylar sonra haberdar olabiliyor.

Neler Yapılamaz? — Meltdown

Öncelikle şunu belirtmemizde fayda var: Meltdown güvenlik açığı sistemdeki bütün bilgilere erişim sağlayamaz.

Daha önceki sayfalarda işlemcinin çalışma yapısından ve güvenlik açığının yalnızca önbelleklerde gerçekleştiğinden bahsetmiştik. Yani bu demek oluyor ki, önbelleklenmeyen veriler güvende.

Fakat modern işlemcilerde execute edilen neredeyse her process, kendi veritabanındaki verileri sürekli olarak önbelleklendirmesi için CPU’ya iletiyor. Bu da doğal olarak veri güvenliğini tehlikeye atıyor.

  • Meltdown sabit diskteki bir veriyi okuyamaz, sızdıramaz.
  • Meltdown GPU işlemcisinde çalışamaz, görsel veri sızdıramaz.
  • Meltdown yalnızca Intel işlemcilerde olan bir sorundur. AMD ve ARM işlemcilerde veri sızdırılamaz.
  • Meltdown istismarı sırasında güvenlik yazılımları tarafından process tespit edilemez.
  • Meltdown istismarı gerçekleştiren process zararlı kod barındırmayabilir. İstismarı standart bir kernel memory bağlantı isteği de gerçekleştirebilir.

Alınabilecek Önlemler — Meltdown

Aslında Meltdown için alınabilecek bir önlem yok. Intel tarafında gerçekleşen bu zafiyet için yapılabilecek tek şey Speculative Execution algoritmasının kernel memory’e veri göndermesinin engellenmesi. Yeni nesil işlemcileride (i9 i7 i5 8.nesil ve üstü) Speculative Execution algoritmaları baştan yazılmış durumda ve Meltdown’a karşı donanımsal bir önlem alınmış durumda. Fakat net bir çözüm oluşturmuş değil. Yalnızca process’in, kernel memory’de olan deneme süresini uzatmış oluyor.

AntiVirus yazılımları ise bu konuda herhangi bir çözüm sunamıyor. Çünkü açtığımız tarayıcı bile Kernel Memory’e bağlantı isteği yolluyor. Bu sebeple zararlı process’ler tespit edilemiyor.

Yazılımsal olarak güvenlik firmalarının denemeye başladığı bir yöntem ise sezgisel tespit ile çalışıyor. Uygulama gereğinden fazla süre Kernel Memory’e bağlı kalıyorsa uygulamayı sonlandırıyor. Fakat bunun da kesin bir çözüm olmadığını belirtelim. Zira execute edilebilen bir process olmasına gerek yok, bir uygulama uzantısı (DLL) ile de mevcut bir process’e inject edilebiliyor.

Microsoft , Google ve Apple gibi dev şirketler işletim sistemleri için halihazırda güvenlik yamaları yayınlamış durumdalar. Bu güvenlik yamaları açığı kapatmıyor, aksine performansı düşürüyor.

Speculative Execution optimizasyonunun daha process belli olmadan işleme başladığını öğrenmiştik. Yayınlanan güvenlik güncelleştirmeleri ise bu optimizasyonu devre dışı bırakmak amacıyla CPU Thread’lerinin frekansını düşürüyor. Bu sayede Speculative Execution optimizasyonu tam performans olmadığı için çalışmıyor ve Meltdown zafiyeti «henüz» istismar edilemiyor.

Spectre

Bir diğer güvenlik zafiyetimiz ise Spectre. Şu ana kadar hep kernel memory’den veri okuyarak doğrudan bilgilere erişimden bahsettik. AMD ve ARM işlemcilerde ise bu işlemin mümkün olmadığını, çünkü Speculative Execution’ın 3’ün üzerinde sayıda hata vermesi durumunda Segmentation Fault hatası verdiğini biliyoruz.

Fakat şu ana kadar üretilen bütün işlemcileri etkileyen bir güvenlik açığı daha var. Spectre.

Intel, AMD, ARM vs. Üretilen tüm işlemcilerde meydana gelen bu güvenlik zafiyeti, Ghost App olarak tanımlanmakta. Bir uygulamanın kendine ait alt bir uygulama ile veya başka bir uygulama ile olan izolasyon mekanizmasını kırarak bir köprü oluşturur ve ilgili uygulamalardan bilgi sızdırır.

Spectre’nin en kritik özelliklerinden birisi ise tarayıcılar üzerinden Javascript kullanılarak oluşturulabilmesi.

Neler Yapılabilir ? — Spectre

Spectre güvenlik zafiyeti ile, aktif uygulamalar arasında bir veri okuma işlemi gerçekleştirilmektedir. Örneğin tarayıcıdan doğrulama alabilecek bir uygulamayı engeller ve tarayıcıdan aldığı tokeni belleğe kaydeder. Bu token içerisinde de çerezlerden tutun şifrelenmiş verilere kadar her şey bulunabilir.

  • Kimlik bilgileri sızdırılabilir.
  • Online bankacılık işlemleri izlenebilir.
  • Tarayıcı üzerinden Javascript kullanılarak istismar edilebilir.
  • OS üzerinden kayıt defteri ile bağlantı kurarak yardımcı uygulama ile kendisini sistem başlangıcına alabilir.
  • AntiVirus uygulamaları tarafından farkedilmez.
  • Zararlı bir eylem göstermediğinden dolayı kullanıcı tarafından fark edilmez.

Alınabilecek Önlemler — Spectre

Spectre’ye uygun halihazırda işletim sistemleri ve tarayıcılar için güvenlik yamaları hazırlanmış durumda. Bu yamalar bellek bütünlüğü sağlayarak hayalet uygulama oluşmasını engelliyorlar ve Spectre için bir engel oluşturuyorlar.

  • İşletim sistemlerinin en güncel versiyonları kullanılmalı.
  • Güvenlik güncellemeleri yapılmalı.
  • Kullanılan tarayıcılarda arka planda çalışan ek uygulamalar olmamalı.
  • Hiçbir eklentinin gizli modda çalışmasına izin verilmemeli.
  • Otomatik Javascript yürütmesi devre dışı bırakılmalı.
  • Üçüncü parti trackerlar tarayıcı ayarlarından devre dışı bırakılmalı.
  • Flash Player gibi otomatik yürütme destekleyen pluginler devre dışı bırakılmalı.
  • Güncel tarayıcılar kullanılmalı.

Tarayıcı Üzerinden İstismarı — Spectre

Spectre güvenlik açığının güncel olmayan tarayıcılar üzerinde istismar edilebildiğinden bahsetmiştik.

Tarayıcılardaki sorgusuz Java downloader tarzı bir script ile, javascript tetiklenerek bir yan uygulama çalıştırılır. Fakat çalıştırılan bu uygulama tarayıcının alt uygulaması gibi görünür. Örneğin Google Chrome’un 20 tane alt process ile çalışması gibi.

Çalıştırılan bu yan uygulama , system framework’ü üzerinden tarayıcıya girilen verileri izlemeye başlar. Eğer yan uygulama kendisini bir sekmeye bağlı tutmuyorsa, aktif bir güncellemesi varsa verileri anlık olarak saldırgana iletir.

Google Chrome sürüm 63 ile birlikte «Site Isolation» adı verilen bir özellik getirildi. Bu özellik ile bir sekmede açılacak bir javascript kodu yalnızca o sekmeye bağlı kalabilecek. Sekmenin dışına çıkıp yan uygulama olarak çalışamayacak.

Halihazırda bu özellik Mozilla Firefox’ta deneme amaçlı test ediliyordu. Sekmelerin birbirleri ile arasındaki iletişimi kesen bu özellik, dezavantaj olarak Win32 uygulamalarının tarayıcı ile doğrulama yapmasına izin vermiyor (örn. Discord).

Mozilla’dan önce ise Microsoft bu özelliği aslında farkında olmadan kullanmaya başlamıştı. Microsoft Edge Browser ile 2016 yılından beri sekme izolasyonu kullanan Microsoft bu sayede Edge kullananların Spectre’den etkilenmeyeceğini de geçtiğimiz aylarda duyurdu. UWP Şeklinde çalışan Microsoft Edge Browser, verilerin diske değil doğrudan belleğe yazılmasını sağlıyor ve bellek bütünlüğü oluşturuyor.

UWP (Universal Windows Platform) Uygulamalarında Meltdown ve Spectre

2015 yılında hayatımıza giren Windows 10 ile birlikte, daha yaygın kullanılmaya başlanan bir özellik te UWP uygulamaları oldu. Asıl adı «Evrensel Windows Platformu» olan bu uygulama tipleri, kısa açılma süreleri ile dikkatleri çekiyordu.

Aslında Microsoft tarafından ilk defa UWP uygulamaları ile Meltdown ve Spectre tökezlemiş oldu.

UWP uygulamaları temelde sürekli olarak bellek üzerinde aktiftirler. Herhangi bir şekilde diskten veri almazlar, yalnızca bellekte çalışırlar. Kapatıldıkları zaman ise arka planda uyku moduna geçerler ve verilerini yine bellekte saklarlar. Bu sayede hem bellek bütünlüğü oluşur, hem diskten uyandırmaya göre çok daha hızlı şekilde uyandırılırlar hem de memory dump imkanı azalır.

Memory Dump aslında daha çok Crack gruplarından duyduğumuz bir şeydir. Fakat Meltdown ve Spectre de kernel memory’e aynı işlemi yapmaktadır. İstek yollayarak alternatif yollardan dump etmektedir.

UWP uygulamalarında ise veriler sürekli bellekte tek parça halinde tutulduğu için memory dump olanağı azalmaktadır. Bu sebeple UWP uygulamalarında özellikle Spectre açığı daha zor istismar edilmektedir.

Son Olarak

Meltdown ve Spectre günümüz teknolojisinin performans açlığını doyurmak için çalışanların gözden kaçırdığı önemli bir detay olarak teknoloji tarihindeki yerini aldı. Performansı ön plana alarak güvenliği göz ardı etmenin kısa vadede yüksek performanslı ürünler ortaya çıkarsak da, uzun vadede bu ürünlerin performansını kendi ellerimizle azaltmamıza sebep olacağını kötü bir şekilde öğrenmiş olduk.

İlerleyen yıllarda geliştirilen işlemcilerde Speculative Execution yerine farklı bir algoritma mı kullanılır, yoksa transistörler (cpu threadler) baştan mı dizayn edilir bilinmez. Fakat teknoloji devlerinin bu konu hakkında şimdiden çalışmaya başladıkları da bir gerçek.

Evlerimizdeki bilgisayarlarda, cep telefonlarında, tabletlerde, akıllı saatlerde, akıllı televizyonlarda, kısacası CPU kullanan neredeyse bütün elektronik aygıtlarda meydana gelen bu güvenlik açıkları daha uzun bir süre bizi meşgul edecek gibi duruyor. Kullanıcı güvenliğinin tekrardan ön planda olması gerektiğini bu şekilde öğrenmek bizim için kötü bir deneyim olsa da, teknoloji firmalarının önümüzdeki yıllarda üretecekleri teknolojilere çok dikkat edecekleri artık kesinleşmiş durumda.

Son kullanıcılar olarak yapmamız gereken tek şey, performans tutkusuna kapılmak yerine güvenliği ön plana almamız olmaldır.

A. Gökhan Ayışığı

--

--

Gökhan

Information Security Specialist / Computer Engineer