1 puan yazan GN⁺ 8 일 전 | 1 yorum | WhatsApp'ta paylaş
  • Yalnızca indexedDB.databases() dönüş sırası ile Firefox tabanlı tarayıcılarda süreç ömrü boyunca korunan kalıcı bir tanımlayıcı üretmek mümkün
  • Bu tanımlayıcı origin kapsamını aşarak paylaşılır; bu yüzden birbiriyle ilgisiz siteler bile aynı tarayıcı çalışma zamanında aynı değeri gözlemleyebilir ve bunu cross-origin izleme için kullanabilir
  • Firefox Private Browsing modunda, tüm özel pencereler kapatıldıktan sonra bile süreç yaşamaya devam ediyorsa tanımlayıcı korunur; Tor Browser'da New Identity sonrasında da varlığını sürdürür
  • Bunun nedeni, Gecko'nun IndexedDB uygulamasında özel veritabanı adlarını UUID tabanlı dosya adlarına eşlemesi ve sonucu sıralamadan dışarıya açmasıdır
  • Mozilla, düzeltmeyi Firefox 150 ve ESR 140.10.0 ile yayımladı; dahili depolama sırasını dışarıya göstermeyen bir tasarım, gizliliğin korunması açısından önemlidir

Güvenlik açığına genel bakış

  • Tüm Firefox tabanlı tarayıcılarda, indexedDB.databases() tarafından döndürülen öğelerin sırası üzerinden süreç ömrü boyunca korunan bir tanımlayıcı çıkarılabiliyor
    • Bir web sitesi birden fazla IndexedDB veritabanı oluşturup dönüş sırasını kontrol ettiğinde, çalışan tarayıcı süreci için benzersiz ve deterministik bir tanımlayıcı üretebiliyor
    • Bu davranış origin düzeyinde değil, süreç düzeyinde ortaya çıkıyor; birbirleriyle ilgisiz siteler de aynı tarayıcı çalışma zamanı içinde aynı tanımlayıcıyı gözlemleyebiliyor
  • Firefox Private Browsing modunda, tüm özel pencereler kapatıldıktan sonra bile Firefox süreci çalışmaya devam ediyorsa tanımlayıcı korunuyor
    • Tor Browser'da çerezleri ve geçmişi temizleyip yeni bir Tor devresi kullanan New Identity sonrasında da bu kalıcı tanımlayıcı korunuyor
    • Bu durum, sonraki tarayıcı etkinliğinin önceki etkinlikle bağlanmaması gerektiği beklentisiyle çelişiyor ve kullanıcıların güvendiği bağlantısızlık garantisini zayıflatıyor
  • Mozilla ve Tor Project'e sorumlu bildirim yapıldı
    • Mozilla, düzeltmeyi Firefox 150 ve ESR 140.10.0 ile yayımladı
    • Yama Mozilla Bug 2024220 altında takip ediliyor; kök neden Gecko'nun IndexedDB uygulamasında olduğundan Tor Browser ve diğer Firefox tabanlı tarayıcılarla da ilgili
  • Düzeltme ilkesi basit
    • Tarayıcı, süreç kapsamındaki dahili depolama sırasını dışarıya açmamalı
    • Sonuçlar normalize edilerek veya sıralanarak döndürülürse entropi kaldırılabilir ve kalıcı tanımlayıcının kötüye kullanımı engellenebilir

Neden önemli

  • Özel tarama modu ve gizlilik odaklı tarayıcılar, farklı bağlamlarda kullanıcıyı tanımlamayı zorlaştırma amacı taşır
    • Genel beklenti 1: Ortak depolama ya da açık kimlik mekanizmaları yoksa, birbiriyle ilgisiz siteler aynı tarayıcı örneğiyle etkileşime girip girmediğini anlayamamalı
    • Genel beklenti 2: Özel oturum bittiğinde, o oturumla ilişkili bilgiler de ortadan kalkmalı
  • Bu davranış her iki beklentiyi de bozuyor
    • Siteler, çerezler, localStorage veya açık siteler arası kanallar olmadan da yalnızca tarayıcının dahili depolama davranışından tanımlayıcı türetebiliyor
    • API'nin döndürdüğü veritabanı adı sırasından yüksek kapasiteli bir tanımlama sinyali elde edilebiliyor
  • Geliştirici açısından çıkarılacak dersler var
    • Gizlilik açıkları yalnızca tanımlayıcı verilere doğrudan erişimden kaynaklanmaz
    • Dahili uygulama ayrıntıları deterministik olarak açığa çıktığında da gizlilik sızıntısı yaşanabilir
  • Güvenlik ve ürün perspektifinden kilit nokta
    • Görünüşte zararsız bir API bile kalıcı süreç düzeyi durumu sızdırıyorsa siteler arası izleme vektörüne dönüşebilir

IndexedDB ve indexedDB.databases()

  • IndexedDB, istemci tarafında yapılandırılmış veri depolamak için kullanılan bir tarayıcı API'sidir
    • Web uygulamaları bunu çevrimdışı destek, önbellekleme, oturum durumu ve diğer yerel depolama amaçları için kullanır
    • Her origin, bir veya daha fazla adlı veritabanı oluşturabilir; object store ve büyük hacimli veriler depolanabilir
  • indexedDB.databases(), geçerli origin'in görebildiği veritabanı metadata'sını döndürür
    • Geliştiriciler bunu mevcut veritabanlarını kontrol etmek, depolama kullanımını debug etmek ve uygulama durumunu yönetmek için kullanabilir
  • Normal gizlilik beklentileri altında bu API'nin dönüş sırası başlı başına tanımlayıcı bilgi taşımamalıdır
    • Veritabanı metadata'sının nötr ya da normalize edilmiş biçimde sunulması gerekir
    • Asıl sorun, Firefox tabanlı tarayıcılarda dönüş sırasının hiç de nötr olmamasıydı

indexedDB.databases() nasıl kalıcı bir tanımlayıcıya dönüştü

  • Firefox Private Browsing modunda indexedDB.databases(), metadata'yı veritabanı oluşturma sırasına göre değil, dahili depolama yapısından türeyen bir sırayla döndürüyor
    • İlgili uygulama konumu dom/indexedDB/ActorsParent.cpp
  • Private Browsing modunda veritabanı adları doğrudan disk tanımlayıcısı olarak kullanılmıyor
    • Bunun yerine genel hash tablosu StorageDatabaseNameHashtable = nsTHashMap<nsString, nsString> üzerinden UUID tabanlı dosya adı tabanına eşleniyor
    • Bu eşleme OpenDatabaseOp::DoDatabaseWork() içindeki GetDatabaseFilenameBase() içinde yapılıyor
  • aIsPrivate true olduğunda, sitenin verdiği veritabanı adı oluşturulan bir UUID ile değiştirilip genel StorageDatabaseNameHashtable içinde saklanıyor
    • Anahtar olarak yalnızca veritabanı adı string'i kullanılıyor
    • IndexedDB QuotaClient ömrü boyunca korunuyor
    • Tüm origin'ler arasında paylaşılıyor
    • Yalnızca Firefox tamamen yeniden başlatıldığında sıfırlanıyor
  • Daha sonra indexedDB.databases() çağrıldığında Firefox, GetDatabasesOp::DoDatabaseWork() içinde QuotaClient::GetDatabaseFilenames(...) aracılığıyla veritabanı dosya adlarını topluyor
    • Veritabanı taban adları bir nsTHashSet içine ekleniyor
    • Yinelemeden önce herhangi bir sıralama yapılmıyor
  • Nihai sonuç sırası, hash set'in dahili bucket yerleşiminin dolaşılmasına göre belirleniyor
    • UUID eşlemesi Firefox sürecinin ömrü boyunca kararlı kaldığı için, dönüş sırası da üretilen UUID değerlerinin, hash fonksiyonu davranışının, hash tablosu kapasitesinin ve ekleme geçmişinin deterministik bir fonksiyonu olarak korunuyor
    • Bu sıra sekmeler ve özel pencereler arasında korunuyor ve yalnızca Firefox tamamen yeniden başlatıldığında sıfırlanıyor
    • Hem UUID eşlemesi hem de hash set dolaşımı origin düzeyinde değil, süreç düzeyinde

Yeniden üretim yöntemi

  • Basit bir PoC ile davranış gösterilebiliyor
    • Farklı iki origin aynı script'i barındırıyor
    • Her script sabit bir veritabanı adı kümesi oluşturuyor, indexedDB.databases() çağırıyor, dönüş sırasını çıkarıyor ve ekrana yazdırıyor
  • Etkilenen Firefox Private Browsing ve Tor Browser derlemelerinde bu iki origin, aynı tarayıcı sürecinin ömrü boyunca aynı permütasyonu gözlemliyor
    • Tarayıcı yeniden başlatıldığında permütasyon değişiyor
  • Kavramsal çıktı örneği
    • Oluşturma sırası: a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p
    • Dönüş sırası: g,c,p,a,l,f,n,d,j,b,o,h,e,m,i,k
  • Kritik nokta tam sıranın ne olduğu değil
    • Orijinal oluşturma sırasından farklı olması
    • Birbiriyle ilgisiz origin'lerde aynı sıranın görünmesi
    • Yenilemede, yeni özel pencerede ve tüm özel pencereler kapatıldıktan sonra bile korunması
    • Yalnızca tarayıcının tamamen yeniden başlatılmasıyla yeni bir sıranın oluşması
    • Böylece gizlilik açısından istenmeyen özellik doğrudan doğrulanabiliyor

Gizlilik etkisi

  • Bu açık, tek bir tarayıcı çalışma zamanı içinde hem cross-origin izlemeyi hem de same-origin izlemeyi mümkün kılıyor
  • cross-origin etkisi

    • Birbiriyle ilgisiz web siteleri aynı tanımlayıcıyı bağımsız olarak türetip aynı çalışan Firefox veya Tor Browser süreciyle etkileşime girdiklerini çıkarabiliyor
    • Çerezler veya başka ortak depolama olmadan da alan adları arasındaki etkinlik bağlanabiliyor
  • same-origin etkisi

    • Firefox Private Browsing modunda, Firefox süreci çalışmaya devam ettiği sürece tüm özel pencereler kapatılsa bile tanımlayıcı korunuyor
    • Bir site, görünüşte yeni bir özel oturum gibi duran sonraki ziyaretleri yeniden tanıyabiliyor
    • Tor Browser'da kalıcı tanımlayıcı, çalışan tarayıcı süreci içinde New Identity yalıtımını fiilen etkisizleştiriyor
    • Tamamen ayrık olması gereken oturumlar arasında bağlantı kurulmasına izin veriyor
  • Neden özellikle Tor Browser'da daha ciddi

    • Tor Browser, siteler arası bağlanabilirliği azaltmak ve tarayıcı örneği düzeyinde tanımlamayı en aza indirmek üzere tasarlanmıştır
    • Süreç ömrü boyunca korunan kalıcı bir tanımlayıcı bu tasarım hedefiyle doğrudan çelişir
    • Yalnızca tüm süreç yeniden başlatılana kadar yaşasa bile, yoğun kullanım sırasında bağlantısızlığı zayıflatmak için yeterlidir

Entropi ve fingerprinting kapasitesi

  • Bu sinyal yalnızca kalıcı değil, aynı zamanda yüksek kapasiteli
    • Bir site N adet veritabanı adını kontrol edebiliyorsa gözlemlenebilir permütasyon sayısı N! olur
    • Teorik entropi log2(N!)
  • Kontrol edilebilen 16 ad varsa teorik alan yaklaşık 44 bit eder
    • Gerçek ortamlardaki eşzamanlı tarayıcı örneklerini ayırt etmek için yeterli bir düzeydir
  • Dahili hash tablosu davranışı nedeniyle gerçekte erişilebilir permütasyon sayısı biraz daha düşük olabilir
    • Ancak güvenlik açısından temel nokta değişmez
    • Açığa çıkan sıra, güçlü bir tanımlayıcı olarak çalışacak kadar entropi sağlamaya devam eder

Nasıl düzeltildi

  • Doğru düzeltme, dahili depolama yerleşiminden türeyen entropi sızıntısını durdurmaktır
    • En temiz azaltım yöntemi, sonuçları sözlük sırası gibi kanonik bir sırada döndürmektir
    • Bu, geliştiriciler için API'nin kullanışlılığını korurken fingerprinting sinyalini ortadan kaldırabilir
  • Her çağrıda çıktıyı rastgeleleştirmek de kararlı sırayı gizleyebilir
    • Ancak sıralama daha basit, daha öngörülebilir ve geliştiricilerin anlaması açısından daha iyi bir seçenektir
  • Güvenlik mühendisliği açısından ideal düzeltme koşulları
    • Düşük kavramsal karmaşıklık
    • Minimum uyumluluk riski
    • Gizlilik sızıntısını doğrudan ortadan kaldırma

Sorumlu bildirim

  • Mozilla ve Tor Project'e sorumlu bildirim yapıldı
    • Mozilla, düzeltmeyi Firefox 150 ve ESR 140.10.0 ile yayımladı
    • Yama Mozilla Bug 2024220 altında takip ediliyor
  • Davranışın kaynağı Gecko'nun IndexedDB uygulamasıdır
    • Tor Browser dahil Gecko tabanlı türev tarayıcılar, kendi azaltım önlemleri yoksa etkilenebilir

Gizlilik odaklı tasarım

  • Küçük uygulama ayrıntıları bile anlamlı gizlilik sorunlarına yol açabilir
    • Birbiriyle ilgisiz web siteleri aynı tarayıcı çalışma zamanı boyunca origin sınırlarını aşarak etkinliği bağlayabilir
    • Tanımlayıcı, kullanıcı beklentisinden daha uzun süre yaşayarak özel oturum sınırlarını zayıflatabilir
  • Olumlu tarafı, düzeltmenin basit ve etkili olmasıdır
    • Çıktıyı döndürmeden önce normalize etmek bu entropi kaynağını ortadan kaldırabilir
    • Beklenen gizlilik sınırları geri yüklenebilir
  • Gözden kaçması kolay ama etkisi büyük olan ve gizlilik açısından hassas özellikler geliştirilirken dikkat edilmesi gereken bir açık türü

1 yorum

 
GN⁺ 8 일 전
Hacker News yorumları
  • Bu araştırmanın gerçekten etkileyici olduğunu ve yazının da çok iyi kaleme alındığını düşündüm
    Sonunda bir ürün reklamı çıkacak sandım ama çıkmaması daha da şaşırttı
    Yine de bu şirketin ürünü fingerprinting yapıyorsa, bu zafiyeti neden Mozilla’ya bildirdiğini merak ediyorum
    Etik dışı olsa bile, rakiplerden ayrışmak istiyorlarsa bunu gizli tutmak ticari açıdan daha mantıklı olmaz mıydı diye düşünüyorum
    Tehdit aktörlerinin sorumlu açıklama uğruna kendi zero-day’lerini yaktığını pek görmedim

    • Ben kendi ürünümüzde zafiyet kullanmıyorum
    • Bence zaten baştan beri o zafiyete dayanmıyorlardı; ayrıca bunu yayımlayınca başkalarının da kullanamaz hâle gelmesi önemli
  • Yazıda dendiği gibi tanımlayıcı, Firefox süreci çalıştığı sürece kalabiliyorsa, Tor Browser oturum bitince mutlaka tamamen kapatılmalı
    Tek bir oturum içinde farklı kullanım amaçlarını karıştırmamak da önemli

  • OP’nin verdiği bağlantı benim Tor ortamımda zaman aşımına uğradı ama Wayback sürümü sorunsuz açıldı
    Ayrıca bu konuyu çalışan akademik araştırmacılar olup olmadığını merak ediyorum
    EFF gibi kuruluşların çalışmalarını biliyorum ama ben daha çok STK aktivistlerinden ziyade üniversite hocaları ya da MSR, PARC gibi saf araştırma laboratuvarlarını arıyorum
    Gizliliğe çok önem veren biri olarak noscript, ublock origin ve firefox containers şeklindeki kişisel holy trinity ile güvenliği epey toparlayabiliyorum ama anonimlik fingerprinting yüzünden sürekli parmaklarımın arasından kayıp gidiyor gibi geliyor
    Buna stylometry’yi de geniş anlamda fingerprinting sayarsak durum daha da öyle

    • Web fingerprint konusu hem saldırı hem de savunma tarafında aktif biçimde araştırılan bir alan
      Örnek olarak PETS gibi konferanslara bakmak faydalı olabilir
  • Benim asıl garip bulduğum, web sitelerinin kullanıcıya sormadan ya da haber vermeden bu tür bilgilere erişebilmesi
    Neden tarayıcılar, telefonlardaki gibi, sunucu ya da uygulama böyle bilgilere erişirken izin onayı istemiyor diye merak ediyorum

    • Tarayıcı fingerprinting’i daha çok tarayıcının sunduğu özelliklerin bir yan etkisi gibi görüyorum
      Tarayıcı sürümünü söyleyen user agent da bir yere kadar makul; sistemde hangi fontların olduğunu sormak da yazı tipi desteği açısından tamamen kaldırılamıyor
      Saat dilimi, dil, klavye düzeni, ekran boyutu ve pencere boyutu da normal web işleyişi için gerekli
      Video ya da ses oynatıcının hangi formatları desteklediğini bilmek, uygun medyayı sunmak için doğal olarak gerekiyor
      JavaScript zamanı okuyabildiği sürece, bunu sunucu saatiyle karşılaştırıp sistem saatindeki sapmayı bulmak da kolay
      Bunlar tek tek birikince neredeyse her tarayıcı sonunda benzersiz şekilde ayırt edilebilir hâle geliyor
    • En çok kullanılan tarayıcıyı yapan şirket bir reklam şirketi
      Üstelik o şirket, en büyük rakibinin finansmanının da önemli bir kısmını sağlıyor
      O yüzden bu durum bana şaşırtıcı gelmiyor
    • Yine de uygulamalardan daha iyi gibi geliyor
      Uygulamalar tanımlayıcılara ve cihaz özelliklerine çok daha fazla erişebiliyor
      Google Play services olmayan, görece daha iyi korunmuş sistemlerde bile durum böyle
    • Bu da Android gibi telefonları düşündürüyor
      Hatta Apple tarafında neredeyse hiç ince ayarlı kontrol olmaması daha da can sıkıcı
    • Web kullanılabilirliğini korumak, fingerprinting’i engellemek ve kullanıcıyı onlarca yüzlerce izin açılır penceresiyle boğmamak arasında çok hassas bir çizgi var diye düşünüyorum
      Tarayıcılar artık işletim sistemi kadar karmaşık olduğundan, sistemin herhangi bir parçası istemeden açığa çıkıp kötüye kullanılabilir
  • Yazıdaki process-scoped ifadesi bana biraz kafa karıştırıcı geldi
    Mozilla’nın 2021’de Firefox için deneysel one-process-per-site özelliğini tanıtırken, masaüstü Firefox’ta tüm siteler arasında işletim sistemi süreci düzeyinde sınırlar oluşturduğunu anlattığını hatırlıyorum
    İlgili yazı: Introducing Site Isolation in Firefox
    Bu yüzden bu özelliğin hâlâ tam olarak dağıtılmadığını mı, yoksa dağıtılıp IndexedDB’nin bu izolasyonun dışında mı kaldığını merak ediyorum

    • Bu yorumu gördükten sonra ancak, bazı küresel davranışların kaldığını ve fingerprinting’in o aralıktan yapılabildiğini anladım
      Öyleyse bu epey ilginç bir açıklama gibi geliyor
  • Bu anlatıma göre tarayıcı yeniden başlatılınca kalıcı olmuyor gibi duruyor; öyleyse saldırgan açısından faydası epey azalmaz mı diye düşünüyorum

    • Yazıda alıntılanan şu bölümün riski iyi anlattığını düşünüyorum
      Firefox Private Browsing’de tüm özel pencereler kapatılsa bile, Firefox süreci yaşamaya devam ederse tanımlayıcı kalabiliyor
      Tor Browser’da ise çerezleri ve geçmişi temizleyip yeni Tor devresi kullanan tam sıfırlama amaçlı New Identity kullanılsa bile kararlı tanımlayıcının korunduğunu anlıyorum
    • Bu durumda kullanılan yöntem id bridging
      Önce web sitesi tarayıcıyı fingerprint ediyor ve çereze bir ID ile fingerprint’i kaydediyor
      Sonraki oturumda yeniden fingerprint yapıp bunu çerezle karşılaştırıyor; değer değişmişse eski fingerprint ile yenisini sunucuya birlikte bildirip birbirine bağlıyor
    • Birçok kullanıcı tarayıcısını aylarca açık bırakıyor
    • Gerçekten faydasının çok düşüp düşmediğinden emin değilim
      Devlet kurumlarının zaten birçok düğümü biliyor ya da izleyebiliyor olması muhtemel; ayrıca çeşitli meta verileri çapraz bağlayarak insanları epey isabetli biçimde tanımlayabileceklerini düşünüyorum
      Bunun her zaman yüzde 100 doğru olması da gerekmiyor; yakın çevre bilgisi ya da duvarın ötesinden gelen veriler gibi hedefin kendisi dışındaki dolaylı bilgilerden çokça toplamak da yeterli olabilir
      Bunu, bir tür vekil bilgi üzerinden kimlik tespiti yapmak gibi görüyorum
  • Açıkçası birçok Web Standardı, gerçek işlevden çok fingerprinting için kullanılıyor gibi görünüyor
    IndexedDB’yi de gerçek depolama amacıyla kullanan site sayısı az gibi; kim gerçekten buna mecbur ki diye düşünüyorum
    Bu yüzden web standartlarını durmadan genişletme yönünün baştan hatalı olduğunu düşünüyorum
    Tarayıcı, cihazla etkileşim için yalnızca asgari API’leri sunmalı; IndexedDB gibi şeyler de değerli verileri sızdırmayacak WebAssembly kütüphaneleriyle uygulanabilir
    Örneğin canvas, platforma özgü kütüphaneleri çağıran çizim rutinleri yerine yalnızca resim tamponuna erişim verseydi fingerprinting değeri çok daha düşük olurdu diye düşünüyorum

    • "Local Storage Editor" gibi tarayıcı eklentileriyle sitelerin Local Storage içeriği doğrudan görülebiliyor
      Benim şimdiye kadar gördüğüm örneklerde bunun gmail gibi yerlerde uzun ömürlü görselleri önbelleğe almak ya da çerez yerine oturum durumunu korumanın başka bir yolu olarak kullanıldığı oldu
  • Burada biraz kafam karıştı
    IndexedDB’nin UUID’si tüm origin’ler arasında paylaşılıyorsa, o zaman sıralama yerine veritabanı içeriğinin kendisiyle tarayıcıyı tanımlamak gerekmez miydi diye düşündüm

    • Sayfada anlaşılır bir örnek var
      Bir sayfa a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p adlı veritabanlarını oluşturup sıralarını sorguladığında, genel ad-UUID eşlemesine göre örneğin g,c,p,a,l,f,n,d,j,b,o,h,e,m,i,k gibi bir sonuç alabiliyor
      Temel zafiyet, Firefox süreci yaşadığı sürece hangi web sitesi aynı ad kümesine sahip veritabanlarını oluşturursa oluştursun, içerikten bağımsız olarak tam olarak aynı sıralamayı görmesidir
      Bu yüzden bu, zaman boyunca sabit kalan, yüksek entropili bir tanımlayıcı yani bir fingerprint oluyor
      Origin’ler arasında paylaşılıyor ve site verileri silindikten sonra bile aynı adlarla yeniden oluşturulunca sıralama üzerinden fingerprint tekrar elde edilebiliyor
    • Veri içeriği elbette origin kapsamıyla sınırlı
      Aksi hâlde IndexedDB çok kolay bir evercookie olurdu
    • Tarayıcıda origin’ler arasında paylaşılan şey veritabanı içeriği değil, UUID eşlemesi
      Her origin’e yalnızca o origin’le ilişkili veritabanı alt kümesinin gösterildiğini anlıyorum
  • Tor Browser’ın hâlâ varsayılan olarak JavaScript’e izin verip vermediğini merak ettim
    Benim anladığım kadarıyla JavaScript çalıştırmayı engellemek bu zafiyetten de etkilenmemek anlamına gelir gibi

    • Pratikte JavaScript’i kapatmak sizi fingerprint açısından daha görünür kılıyor
      JS’yi kapatan kullanıcı çok az olduğu için hemen çok daha küçük bir gruba düşüyorsunuz ve o grubun içinde benzersiz olmanız kolaylaşıyor
      Elbette JS olmayınca ayrıntılı bilgi toplama seçenekleri azalıyor ama aynı nedenle daha az bilgiyle de ayırt edilmeniz kolaylaşıyor
      Ayrıca Tor Browser garip biçimde navigator.platform değerini hiç spoof etmiyor; bu yüzden User-Agent Windows gibi görünse bile site hâlâ Linux kullanıp kullanmadığınızı görebiliyor