1 puan yazan GN⁺ 2023-12-23 | 1 yorum | WhatsApp'ta paylaş
  • WhatsApp mesajlarında normal bir site gibi görünen bağlantı ve önizleme gösterilirken, gerçek tıklama saldırganın sitesine yönlendiren bir phishing açığı keşfedildi
  • Bunun nedeni, mesaj gövdesindeki bağlantı ile önizleme verisinin ayrı gönderilmesi ve matchedText kaldırılarak önizleme uyumsuzluğu oluşturulabilen bir yapının bulunması
  • U+202E Right-To-Left Override karakteri, URL’nin görüntülenme yönünü ters çevirerek gerçek alan adını meşru bir alan adı gibi gösterebilir
  • Saldırgan, taklit edeceği hedefin bir ayna alan adını hazırladıktan sonra orijinal sitenin önizlemesini koruyup yalnızca text değerini değiştirerek kurbanı kandırabilir
  • Meta, URL normalleştirme mantığını dinamik olarak ayarlayabildiğini söyledi; kullanıcıların ise bir bağlantıya tıklamadan önce onu kopyalayıp gerçek adresi kontrol etmesi gerekiyor

WhatsApp bağlantı önizlemesi ile gerçek bağlantının ayrıldığı nokta

  • Araştırmacı, WhatsApp mesajı alıcısının bağlantı önizlemesini render ederken HTTP isteği gönderip göndermediğini doğrulamak için arkadaşına bir webhook.site bağlantısı gönderdi
  • HTTP isteği yalnızca gönderici tarafında bir kez oluştu ve alıcının bağlantıyı ayrıca render etmediği doğrulandı
  • Bu davranış nedeniyle, WhatsApp mesajlarında bağlantı ve önizleme bilgisinin birlikte taşındığı sonucuna varıldı ve ikisinin birbirinden farklı hale getirilip getirilemeyeceği test edildi

Sorun #1: bağlantı önizlemesi uyumsuzluğu

  • WhatsApp Web mesajlarını bir proxy üzerinden doğrudan değiştirmeye çalışıldı, ancak WhatsApp’ın E2EE yapısı nedeniyle Burp Suite gibi araçlarla basit müdahale zordu
  • Bunun yerine, mesaj WebSocket üzerinden şifrelenmiş olarak gönderilmeden hemen önce JavaScript’te breakpoint konularak mesaj nesnesi incelendi
  • Mesaj nesnesinde bağlantı gövdesi ile önizleme bilgisinin ayrı özellikler olarak bulunduğu görüldü
    • text: mesaj gövdesi
    • canonicalURL: önizlemenin altında gösterilen alan adı
    • matchedText: canonicalURL ile karşılaştırılan bir değer gibi görünüyor; bu değerin text içinde de yer alıp almadığı test edildi
  • instagram.com için oluşturulan mesaj nesnesinde text, google.com olarak değiştirildiğinde önizleme kayboldu ve yalnızca Google bağlantısı kaldı
  • matchedText özelliği silindiğinde, gerçek bağlantı ile önizlemenin farklı olduğu bir uyumsuz mesaj oluşturulabildi

Sorun #2: U+202E ile bağlantı gösterimini kamufle etme

  • Gerçek bağlantı gövdesi açığa çıkmasın diye, Unicode karakterlerinin metin gösterimini değiştirip değiştirmediği fuzzing ile denendi
  • U+202E, bir Right-To-Left Override karakteridir ve metni kullanıcıya ters sırada gösterir
  • Yalnızca U+202E kullanıldığında bağlantı biçimi garip göründüğü için tıklanma olasılığının düşük olduğu düşünüldü; meşru bir URL gibi görünmesi için ters çevrilmiş bir dizge kurgulamak gerekiyordu

Ayna URL oluşturma yöntemi

  • Amaç, ters çevrildiğinde https://instagram.com gibi görünen bir URL üretmekti
  • Basit ters çevrilmiş dizge moc.margatsni//:sttph olurdu, ancak .margatsni gibi bir TLD kaydedilemez
  • Çözüm, gerçekten kaydedilebilir bir TLD’yi alt alan adı gibi görünecek şekilde kullanmaktı
    • Örneğin Hollanda TLD’si .nl kullanılırsa ln.instagram.com gibi görünen bir dizge oluşturulabiliyor
  • URL’nin https:// ile başlıyormuş gibi görünmesi gerektiğinden, sonuna geçerli bir yol olan //:sptth eklendi
  • Sonuç olarak https://moc.margatsni.nl//:sptth, U+202E ile birleştirildiğinde https://ln.instagram.com//:sptth gibi görünebilir
  • Araştırmacı bu yöntemi 2K2E olarak adlandırdı

Saldırı akışı

  • Saldırgan, taklit etmek istediği sitenin ayna alan adını satın alır
    • Örnek: ln.instagram.com gibi görünmesini istiyorsa moc.margatsni.nl alan adını satın alır
  • Önce orijinal alan adının bağlantısını içeren bir mesaj oluşturularak o sitenin önizlemesi elde edilir
    • Örnek nesnede text, matchedText, canonicalUrl değerlerinin tümü https://instagram.com/ olarak yer alır
    • description, title, jpegThumbnail, thumbnailDirectPath gibi önizlemeyle ilgili değerler de bulunur
  • Ardından matchedText kaldırılır ve text değeri \u202ehttps://moc.margatsni.nl//:sptth biçimine çevrilir
  • Nihai mesaj Instagram önizlemesini gösterir, ancak tıklandığında saldırganın hazırladığı alan adına gidebilir

Meta’nın yanıtı ve diğer platformlarla karşılaştırma

  • Meta, birden fazla platform ve ortamı desteklediği için platforma özgü URL normalleştirme yöntemlerinin sunucu tarafı mantığından farklı olabileceğini söyledi
  • Gerçek spam ve kötüye kullanım ortaya çıktığında URL normalleştirme mantığını dinamik olarak ayarlayabilen bir sistem bulunduğunu açıkladı
  • Araştırmacı, Meta’nın bu güvenlik sorununu proaktif biçimde çözmekten çok, sistem bunu spam olarak algıladığında tepki vermeyi tercih ediyor gibi göründüğünü değerlendirdi
  • X, TikTok ve Pinterest, U+202E karakteri için temizleme işlemi uyguluyor; bu da onları WhatsApp’tan ayırıyor

Kullanıcıların uygulayabileceği azaltma yöntemi

  • WhatsApp bağlantılarına yalnızca görünen şekline bakarak güvenmek zor
  • 2K2E phishing’den kaçınmak için bağlantıya tıklamadan önce onu kopyalayıp panodaki önizlemeden gerçek adresi kontrol etmek gerekiyor
  • Pano önizlemesi, U+202E karakteri temizlenmiş durumdaki bağlantı adresini gösterebilir
  • Araştırmacı, daha sonra uygun temizleme işlemi olmadığı için 2K2E’ye açık başka servisler de buldu

1 yorum

 
GN⁺ 2023-12-23
Hacker News görüşleri
  • Oldukça zekice kötüye kullanılmış bir özellik kombinasyonu, ancak genel güvenlik etkisi muhtemelen düşük sayılır
    En iyi ihtimalle bile alıcıyı bağlantıyı tarayıcıda açmaya yönlendiriyor; bu yüzden polis ya da istihbarat kurumu gibi bir saldırgan değilse, genelde cihazdaki yamalanmamış yazılımları istismar eden ek saldırılar gerekir
    Teknik olarak buna tam olarak clickjacking demek de zor. Clickjacking genelde görünmez bir HTML çerçevesini başka içeriğin üstüne bindirmeyi ifade eden çok spesifik bir tekniktir
    https://owasp.org/www-community/attacks/Clickjacking
    https://portswigger.net/web-security/clickjacking

    • Ben de buna clickjacking demezdim. Gerçek clickjacking, kurbanın farkında olmadan hesapla ilgili bir işlem yapmasını sağlamaya yönelik bir tekniktir; istemediği bir bağlantıyı açtırmak bunun kadar ciddi değil
    • Eğer o bağlantı Instagram ile birebir aynı görünen bir giriş ekranı gösteriyorsa, WhatsApp önizlemesinde bir kez ikna olduktan sonra URL’yi tekrar kontrol edecek kullanıcıların oranı sence kaç olur?
  • Herkes UTF sağdan sola karakterlere odaklanıyor ama Meta en azından önizleme URL’sinin mesajdaki URL’den farklı olabileceği sorununu kabul etmeliydi
    Bunun kısaltılmış URL’leri açmak için yapıldığını anlıyorum, ama Meta ve WhatsApp’ın uygulayabileceği akıllıca geçici çözümler mutlaka vardır gibi geliyor

    • Hayır. Uçtan uca şifreleme olduğunda önizlemenin gönderici ya da alıcı tarafında üretilmesi gerekir. Alıcı önizlemeyi üretirse IP adresi sızar. Sonuçta önizleme özelliğini kaldırmak gerekir
  • Clickjacking, bir öğeye tıkladığını sanarken aslında genelde üstte şeffaf biçimde duran başka bir öğenin tıklama olayını yakalaması demektir
    Görünen alttaki katmana odak verip onblur olayının oluştuğunu algılarsan, kullanıcı olayı almasa bile saldırgan tıklamayı anlayabilir
    OP’nin bulduğu şey havalı ama clickjacking değil. Ben de zamanında RTL karakterleri kullanarak ekran koruyucu dosyalarını, yani Windows’ta yalnızca uzantısı farklı olan sıradan çalıştırılabilir dosyaları, Word belgesi gibi göstermiştim. Sanırım arkadaşlara ya da öğretmenlere şaka yapmak içindi ama nedenini pek hatırlamıyorum
    OP bir adım ileri gidip bunun başka sistemlerde nasıl farklı gösterilebildiğini bulmuş. Kullanıcı hangi öğeye tıkladığını sanmakta yanılmıyor; bağlantının nereye gideceğini sanmakta yanılıyor, dolayısıyla bu clickjacking değil ve yazının girişinde bağlantı verilen Wikipedia sayfası da bunu doğruluyor
    Clickjacking’in gerçekten istismar edildiğini hiç görmedim ama OP’nin bulduğu yöntemin suistimal edilebileceğini düşünüyorum
    Dürüst olmak gerekirse, kullanıcıların bir bağlantıya tıklarken son etki alanını ayırt edebileceği beklentisini çoktan bıraktım. Çoğu kişi bu kavramı zaten anlamıyor, kalanlar için de ayırt etmek zor
    Ayırt edebildiğini düşünenler bile tüm bağlantılar sendgrid.tld/j3ovi3bfogobbledypoop93jnri2o gibi yerlere gidince pes ediyor. İnsanları her gün takip amacıyla karmaşıklaştırılmış bu şüpheli çöp bağlantılara tıklamaları için eğitiyoruz ve kimse bunu umursamıyor

  • Güzel bir hack. Asıl sorun WhatsApp ya da Unicode ters yön karakterleri değil, URL’lerin zor olması
    visa.securesite.com gibi basit bir örnekle bile birçok insan kandırılabiliyor. Yakın gelecekte iyi bir çözüm de görünmüyor

    • Bu özel durumda ise kullanıcı tıklayacağı şeyi anlamaya çalışırken aktif biçimde yanıltılıyor; yani bu daha çok yetersiz filtreleme/temizleme sorunu gibi
      Ana makine adı ve etki alanı etrafındaki genel karmaşa daha zor bir problem ama tarayıcılar etki alanı adı bölümünü vurgulayarak bunu bir ölçüde hafifletmeye çalıştı. Çoğu phishing tekniğinde olduğu gibi bunu da muhtemelen sonunda passkey bitirecek
  • RTL var olduğu sürece devasa güvenlik açıklarının kaynağı oldu. Bu dilleri bilmeyen insanların hiçbir kazançları olmadan riske maruz kalmaması için, işletim sisteminde tüm RTL’yi devre dışı bırakan bir ayarın neden olmadığını anlamıyorum

    • İşletim sisteminden bağımsız olarak, metin gösteren tüm OS widget’larında böyle bir seçenek olmalı. Android TextView da dahil
      Geliştirici belirli bir metin aralığını açıkça inceleyip izin vermediği sürece varsayılan olarak tüm çift yönlü metin geçersiz kılmalarını devre dışı bırakmalı
      Dünya nüfusunun %1’inden azını gözetme adına tüm metin işleme yığınını varsayılan olarak savunmasız hale getirmek mantıklı değil
  • Meta’nın bu sorunu düzeltmemesi ve bu araştırmacıya bug bounty de vermemesi hayal kırıklığı yaratıcı

    • Bu yılın başlarında Google’a benzer bir sorun bildirdim ama “yalnızca sosyal mühendislikle gerçekleşebilir” ve “bunu düzeltmenin kullanıcıları anlamlı ölçüde daha az savunmasız yapmayacağı düşünülüyor” gerekçeleriyle reddedildi
      Ayrıntıları burada anlatmayacağım ama Google Search’ün bazen URL’leri yeniden yazma biçimi nedeniyle saldırganlar gerçek URL’yi gizleyebiliyor
      Web sitelerinde ve uygulamalarda gösterilen URL’lere asla güvenmemek en iyisi
    • Herhalde OSS projelerine hukuki tehdit göndermekle fazla meşguller
    • Muhtemelen neyin düzeltilmesinin istendiği, örneğin RTL karakterlerinin engellenmesi talebi yeterince açık anlatılamadı ve Meta bunu yanıltıcı olabilecek tüm URL’lerin düzeltilmesi talebi gibi anlamış olabilir. Bu ise pratikte imkânsız
    • Düzeltirler. Sadece bounty hunter’a ödeme yapmazlar
  • “Tam beklendiği gibi, bağlantı ve önizleme ayrı gönderilmiş!” noktası daha büyük bir UI tasarım sorunu. Neden sıradan bir kullanıcı güvenlik için bağlantı ile önizlemeyi karşılaştırmak zorunda olsun ki?

    • Bu bir güvenlik ödünleşimi. Bağlantı önizlemesi gibi faydalı bir özellik sunmak istiyorsan birkaç seçenek var
      1. Gönderen tarafında üretilir. Dezavantajı sahte olabilmesidir
      2. Alıcı tarafında üretilir. Dezavantajı alıcının IP’sinin sızmasıdır
      3. Üçüncü bir taraf üzerinden üretilir. Dezavantajı bilginin üçüncü tarafa sızmasıdır
        Genel olarak bence en iyi seçenek 1. Gönderen zaten kendi tüm mesajlarını “sahteleyebilir”; önizlemeyi mesajın bir parçası olarak eklemesi de çok farklı değil
        Buradaki sorun, bu içeriğin gönderenden geldiğinin açık olmaması. Ayrı bir konuşma balonu gibi gösterildiği için kullanıcıların %99’u bunun gönderen tarafından sağlandığını anlamaz gibi geliyor
        Üstelik zaten asıl önemli olan URL. Saldırganın kontrol ettiği bir URL’ye tıklarsan, saldırgan önizlemede istediği her şeyi gösterebilir. Bu yüzden önizlemeyi “gerçek” olmaya zorlamanın getirisi çok küçük
      4. seçenek de fena olmayabilir. Özellikle çift kör benzeri bir yöntemle uygulanırsa, bir tarafa bağlanıp onun ikinci tarafa iletmesi sağlanabilir. Böylece birincisi IP’yi görür, ikincisi hedefi görür; iş birliği yapmadıkları sürece ikisini aynı anda göremezler
        Ama böyle bir altyapıyı kurup sürdürmenin getirisi nispeten düşük
  • Yazının en altında bunun tersine mühendislik olarak sınıflandırılmasını beğendim

  • Bu clickjacking değil. Clickjacking, saldırganın tıklamayı ele geçirip kullanıcının istemediği ya da fark etmediği başka bir hedefe gerçekten tıklamasını sağlamasıdır
    Metni sağdan sola akıtan RTL kod noktaları bir uluslararasılaştırma özelliğidir ve bununla insanları şaşırtmak yeni bir açık değil