2 puan yazan GN⁺ 2023-08-24 | 1 yorum | WhatsApp'ta paylaş
  • Electron tabanlı bir masaüstü uygulaması olan Discord, içeride Chromium penceresi olarak çalıştığı için web geliştirici araçları açılabilir; bu sayede istemci tarafı kod değiştirilebilir
  • Bazı modlu istemciler ve eklentiler, Nitro ücretli aboneliği gerektiren bazı özellikleri istemci tarafında açar
  • Temel nokta, Webpack code splitting ile bölünmüş modülleri webpackChunkdiscord_app değişkenine enjekte ederek iç işlevleri keşfetme ve değiştirme yöntemi
  • Ekran paylaşımı kalite kontrol işlevi yalnızca istemcide doğrulandığı için aşılabilir; ancak premium temalarda ek olarak sunucu senkronizasyon doğrulaması çalışır
  • Demo tekniklerinin tamamı Discord kullanım şartlarının ihlalidir; hesap askıya alma riski ve doğrulanmamış kod çalıştırma nedeniyle hesap ele geçirilmesi riski vardır

Genel bakış

  • Görünümü değiştiren veya özellik ekleyen çok sayıda modlu Discord istemcisi bulunur; bazı eklentiler Nitro ücretli aboneliği gerektiren özellikleri bile açar
  • Bu davranışın mümkün olmasını sağlayan teknik ilke, istemci yapısı analizi üzerinden açıklanır

Geliştirici araçlarını etkinleştirme

  • Discord, web teknolojileriyle çapraz platform uygulamalar oluşturan Electron framework'üyle geliştirildiğinden, web tarayıcısı içinde çalışan bir web sitesine benzer
  • Özünde bir Chromium penceresi olduğu için geliştirici araçları açılabilir; ancak varsayılan olarak devre dışıdır
    • Çok sayıda kullanıcının tehdit aktörlerinin sosyal mühendislik yönlendirmesiyle kötü amaçlı komutları yapıştırıp hesaplarının ele geçirildiği vakalar olduğu için engellenmiştir
  • Riski anlıyorsanız %appdata%/discord/settings.json yapılandırma dosyasına DANGEROUS_ENABLE_DEVTOOLS_ONLY_ENABLE_IF_YOU_KNOW_WHAT_YOURE_DOING değerini true olarak ekleyerek etkinleştirebilirsiniz
    • Ardından ctrl + shift + i ile geliştirici konsolunu çalıştırın

Discord işlevlerini yamalama

  • İlk yüklemeyi optimize etmek için kod birden çok parçaya bölünerek paralel veya gecikmeli yüklenir (lazy-loaded); Webpack'in code splitting özelliği kullanılır
  • Yüklenen tüm chunk'lar webpackChunkdiscord_app değişkeninde saklanır
  • Discord değişkenlerini ve işlevlerini kullanan kodu çalıştırmak için kodu bu değişkene enjekte etmek (inject) gerekir
    • a.c, tüm modülleri içeren nesnedir; her modül chunk_id, loaded, exports biçiminden oluşur
    • exports, modülün dışa aktardığı işlevleri, nesneleri ve ilkel değerleri içerir
  • Birden çok JavaScript modülünde dolaşan bir find işlevi oluşturularak belirli işlevler aranabilir ve çağrılabilir
    • Örnek: getCurrentUser() işlevini bulup çağırmak
  • Özgün işlevler başka işlevlerle değiştirilebilir (replace); böylece davranış değiştirilebilir ve doğrudan kod değişikliği yapılabilir

Yüksek kaliteli yayın akışını açma

  • Bu noktadan sonraki içerik Discord kullanım şartlarını açıkça ihlal eder ve hesabın askıya alınmasına yol açabilir; risk size aittir
  • Kullanıcının abonelik seviyesini kontrol eden canStreamMidQuality ve canStreamHighQuality adlı iki işlev, ekran paylaşımı kalite seçimi ekranının hemen öncesinde çağrılır
    • Bu iki işlevin dönüş değerleri true olmaya zorlanırsa, Nitro aboneliği olmadan da orijinal çözünürlükte 60 FPS ekran paylaşımı seçilebilir
  • Mevcut durumda Discord, iletilen stream'in aboneliği olmayan kullanıcı kriterlerine gerçekten uyup uymadığını sunucuda doğrulamıyor gibi görünüyor
    • Ancak Discord henüz uçtan uca şifreleme (End-to-End encryption) kullanmadığından tespit olasılığı vardır
    • Referans yazıya göre Discord, kullanıcıların ses ve video içeriklerini zaten inceliyor ve gelecekte ekran paylaşımı öncesinde sunucu tarafı doğrulama ekleyebilir

Premium temaları açma

  • Kullanıcının Nitro temalarını kullanıp kullanamayacağını döndüren canUseClientThemes işlevinin değeri true olarak değiştirilirse premium tema seçim düğmesi açılır
  • Ancak tema kısa süre uygulanır ve ardından hemen varsayılan temaya geri döner
    • Çünkü istemci tema değişikliğini kaydetmeye çalışır; ancak sunucu yetki olmadığını doğrular ve yanıt alındığında varsayılan temayı yeniden uygular
  • Yalnızca görünüm ayarları senkronizasyonunu engellemek için shouldSync işlevi yamalanıp değer appearance olduğunda false döndürmesi sağlanırsa tema değişikliği korunur
  • Temalar tamamen istemci tarafında yönetilir ve CSS'yi doğrudan değiştirmek de her zaman mümkündür; bu nedenle Discord'un bunu engellemesi zordur

Sonuç

  • Gösterilen hack'leri kolayca uygulayan kodlar vardır; ancak istemciyi değiştirmeden veya mod kullanmadan önce dikkatli olmak önemlidir
  • Discord, kullanım şartlarını ihlal eden hesapları istediği zaman askıya alabilir; hesap erişim yetkisine sahip doğrulanmamış kod çalıştırmak son derece tehlikelidir
    • Yazıdaki kodlanmış mesaj: "Anlamadığınız kodu geliştirici konsoluna yapıştırmayın — hesabınızı ele geçirmenin en kolay yolu"

1 yorum

 
GN⁺ 2023-08-24
Hacker News yorumları
  • Sona eklenmiş basit bir base64 ile kodlanmış blob’u çalıştırınca tüm özelliklerin açılması gibi bir şeyse, oldukça kolay bir saldırı vektörü olabilir diye düşünüyorum.
    Yazardan şüphelendiğim anlamına gelmiyordu; az önce decode ettim ve güzel ters köşe oldum.

    • base64 --decode çalıştırmaya üşenenler için sonucu buraya yapıştırıyorum:
      // Here's a cake if you thought about inspecting the code before executing it:
      let css = 'font-size: 36px; font-weight: bold; color: red';
      console.log("%cNEVER paste code you don't understand into the development console.", css);
      console.log("%cThis is the best way to compromise your account.", css);
  • “Görünüşe göre Discord, aktarılmakta olan stream’in gerçekten abonelik dışı kullanıcı kriterlerine uyup uymadığını sunucu tarafında doğrulamıyor”; bunu kimin iyi bir uygulama olduğunu düşündüğünü merak ediyorum.
    İstemci tarafı doğrulama gerçekten çok acemi işi bir hata gibi görünüyor.

    • Muhtemelen “bu harika bir uygulama”dan ziyade “biri bunu kırmanın yolunu bulursa o zaman yamalarız” yaklaşımıydı.
      Discord’u yıllardır kullanıyorum ve Nitro’nun erişim yetkisi yapısını aşmaya yönelik bir girişimi ilk kez duyuyorum; yaygın bir şey değilse özellikle umursamak için pek neden yok gibi.
    • Ben yalnızca tamamlanmış özellikleri, istenen nihai hâliyle uygulayıp PR açan tarafta olduğum için neden böyle yaptıklarını hiç bilmiyorum.
      Ayrı olarak, sadece bu ay beşinci yeni işime başladım; proje yöneticileriyle bir türlü iyi anlaşamıyorum galiba.
    • Bugünlerde insanların, özellikle de çocukların parayı epey kolay harcadığını düşünürsek bu kadarı bile yeterli olabilir.
      Böyle bir hack’i anlayıp Nitro’ya para vermeye de istekli kaç kişi vardır ki? Nitro özelliklerinin bir kısmını ya da tamamını açan çeşitli Discord istemci modlarını kullanan binlerce, belki on binlerce kişi vardır; ama bunu engellemenin gerçek gelire ne kadar dönüşeceği şüpheli.
      Şahsen bu özelliklere ihtiyacım varsa ya da istiyorsam ayda 10 dolar ödemek çok daha az uğraştırıcı. Discord her güncellendiğinde bozulacak modların peşinden koşmaktan ve bakımcıların içine kötü amaçlı kod koymamasını ummaktan daha iyi bence.
    • API üzerinden gizli kanalların adını, konusunu ve son mesaj zamanını da görebiliyorsunuz.
      Kanallar yalnızca istemcide gizlenmiş durumda. Açık olmak gerekirse, yine de o kanaldaki mesaj içeriklerini görebildiğiniz anlamına gelmiyor.
    • Bunun nedeni, bunun Discord API bileşeni değil, dünyanın dört yanına yüzlerce adet dağıtılmış ses sunucuları tarafında olması.
      Ses sunucusu yalnızca giriş yetkiniz olup olmadığını API’ye soruyor; sonrasında ise bir-çok yönlü paket yayınlayıcısı gibi çalışıyor.
  • Bu, meraklı ve yetkin anlamıyla klasik bir hacker’a daha yakın.
    Ciddi bir zarar yok; uygulamaların sihir olmadığını ve kodun havalı olduğunu yeniden hatırlatıyor.

    • “Cracker”a daha yakın da olabilir ama şirketlerin bilmemizi istemediği türden bir bilgi olduğu konusunda katılıyorum.
      Böylece bizden daha fazla parayı dirençle karşılaşmadan sıkıp çıkarabilsinler.
  • Tekrar hatırlatalım: Discord’a gönderdiğiniz her şey, DM’ler dahil, Discord’da düz metin olarak kaydedilir ve Discord ile o şirketi satın alan tarafça erişilebilir hâle gelir.
    Bir ara Microsoft alacak gibi görünüyordu; şimdi ise IPO yolunda gibi.
    Bir hesabınızın olması bile, yapay zeka için veri madenciliğine ya da Discord’un ve veritabanı/sistem yöneticilerinin erişimine kolay olan özel konuşmaları normalleştiriyor. FISA Amendments Act’in Section 702’si (FAA702), federal soruşturma kurumlarının bu verilere mahkeme kararı olmadan erişebilmesine izin veriyor.
    Sırf kripto para önden işlem yapma olasılığı bile günde on milyonlarca dolar değerinde olabilir.
    Arkadaşsanız arkadaşlarınıza uçtan uca şifreli olmayan sohbet sistemleri kullanmalarını önermemelisiniz. Tuzaktaki bal olmayalım.

    • Tekrar hatırlatalım: forumlara gönderdiğiniz her şey, DM’ler dahil, düz metin olarak kaydedilir ve yöneticiler tarafından erişilebilir.
      Kullanıcının anahtarları bizzat yönettiği gerçek bir zero-trust modeli uygulayan az sayıdaki servisten birini kullanmıyorsanız bu zaten beklenen bir durumdur. Mesajların saklanma nedeni, kullanıcının onlara tekrar erişebilmesidir.
      Matrix gibi uçtan uca şifreli grup mesajlaşmasını nispeten kullanıcı dostu şekilde başaran servisler de var, ama bunlar istisna sayılır. Elektronik iletişim platformlarının %95’inin yıllardır yaptığı şeyle aynı diye Discord’u özellikle kötü niyetliymiş gibi göstermek adil değil.
    • “Bir hesabınızın olması bile normalleştiriyor” deniyor ama bu zaten çoktan normalleşti ve Discord kazandı.
      Bunun iyi olduğunu söylemiyorum, ama bazı topluluklarda katılmamak dışında seçenek yok.
      Eski “herkes WhatsApp kullanıyor” durumundan bile daha kötü. O zaman karşınızdakinin numarası olduğu için başka yoldan iletişim kurmak kolaydı; Discord’un cazibesi ise bire bir sohbet değil, yarı kamusal alanlara sahip topluluklar. Buradaki kamusal, herkese açık anlamında değil; daha çok yaklaşık 100 kişinin okuması anlamında.
    • Neyse ki Discord’da iz bırakmadan mesaj silme var.
      Bir mesajı sildiğinizde artık veritabanında saklanmıyor.
  • Yakın zamanda OpenAI, beta test kullanıcıları için olan Discord’u aniden devre dışı bıraktı; artık kiminle ne konuştuğumuzu göremiyoruz.
    Sunucu yöneticisinin kayıtları gözden geçirmesine de imkân bırakmadan topluluğu birbirinden koparmamak için sohbeti dışa aktarmanın bir yolu var mı diye merak etmiştim.
    Discord sohbetlerini dışa aktaran epey Chrome uzantısı var, ama çoğu bazı özellikleri ücretli olarak kilitlemiş gibi görünüyor.
    Meğerse Chrome klasöründen uzantı kaynağını kopyalayıp JavaScript’te is_pro gibi boolean kontrollerini değiştirdikten sonra sıkıştırılmamış uzantı olarak yeniden yüklemek çok kolaymış.

  • Böyle hileler kullanırsanız engellenebileceğinizi haklı olarak uyarıyor, ama Discord’un böyle bir şey yüzünden kullanıcıları engellediğine dair bir geçmişi var mı?

    • Discord, insanları herhangi bir nedenle engellemekten çekinmiyor.
      Alternatif istemci kullanmayı da engelliyor. Hesabınız önemliyse Discord’u kurcalamamak en iyisi.
    • En popüler modlardan biri olan Vencord’un README’sinde şöyle yazıyor:
      “İstemciyi değiştirmek Discord Hizmet Şartları’na aykırıdır.”
      Ancak Discord buna epey kayıtsız ve istemci modu kullandığı için engellendiği bilinen bir vaka yok. Dolayısıyla kötüye kullanım davranışı uygulayan eklentiler kullanmadığınız sürece genelde sorun yaşamazsınız. Endişelenmenize gerek yok; yerleşik eklentilerin hepsinin güvenli olduğu söyleniyor.
  • Bazı temaların bu şekilde açılmasını anlayabilirim, ama streaming kalitesini sunucu tarafı yerine istemci tarafı kontrolle belirlemeleri epey anlaşılması zor.

    • Özellikle de yalnızca giriş/çıkış bitrate’ini kontrol etmek yeterli olduğu için.
      Gerçek görüntüye erişmek gerekmiyor; tamamen şifreli olsa bile aktarılan veri miktarına bakarak hangi kalitede stream yapıldığını anlayabilirsiniz.
  • Frontend mühendisliğinin temel ilkesi bir kez daha doğrulandı:
    “Asla, ama asla istemciye güvenme.”

  • Bunun yalnızca istemci tarafında halledilebildiğini gördüğümden beri geliştirici araçlarını ve 1080p60 streaming düğmesini açıp kullanıyorum; gerçekten çalışıyor.
    Kaç yıldır böyle bilmiyorum ama Discord tarafında kimse umursamıyor gibi.

  • Daha önce bu yola girmeyi denemiştim, ama özellikle güncellemelerden sonra istemciyi tutarlı biçimde yamalamanın yolunu bulamadığım için sonunda vazgeçtim.
    Fakat bu yöntemi görünce yeniden “açıp kurcalamak” isteği geldi.
    Bu şekilde kullanılabilir API’leri taramanın basit bir yolu var mı? Hepsini log’lamayı denedim ama map’ler, uluslararasılaştırma vb. yüzünden ortalık çok karışıktı. Acaba biri zahmete girip tersine mühendislik dokümantasyonu gibi bir şey hazırladı mı merak ediyorum.