- 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_appdeğ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.jsonyapılandırma dosyasınaDANGEROUS_ENABLE_DEVTOOLS_ONLY_ENABLE_IF_YOU_KNOW_WHAT_YOURE_DOINGdeğerinitrueolarak ekleyerek etkinleştirebilirsiniz- Ardından
ctrl + shift + iile geliştirici konsolunu çalıştırın
- Ardından
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_appdeğ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ülchunk_id,loaded,exportsbiçiminden oluşurexports, modülün dışa aktardığı işlevleri, nesneleri ve ilkel değerleri içerir
- Birden çok JavaScript modülünde dolaşan bir
findişlevi oluşturularak belirli işlevler aranabilir ve çağrılabilir- Örnek:
getCurrentUser()işlevini bulup çağırmak
- Örnek:
- Ö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
canStreamMidQualityvecanStreamHighQualityadlı 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
trueolmaya zorlanırsa, Nitro aboneliği olmadan da orijinal çözünürlükte 60 FPS ekran paylaşımı seçilebilir
- Bu iki işlevin dönüş değerleri
- 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
canUseClientThemesişlevinin değeritrueolarak 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
shouldSyncişlevi yamalanıp değerappearanceolduğundafalsedö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
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.
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.
Ayrı olarak, sadece bu ay beşinci yeni işime başladım; proje yöneticileriyle bir türlü iyi anlaşamıyorum galiba.
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.
Kanallar yalnızca istemcide gizlenmiş durumda. Açık olmak gerekirse, yine de o kanaldaki mesaj içeriklerini görebildiğiniz anlamına gelmiyor.
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.
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.
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.
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.
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_progibi boolean kontrollerini değiştirdikten sonra sıkıştırılmamış uzantı olarak yeniden yüklemek çok kolaymış.API’yi standart dışı şekilde kullanan bağımsız bir program, ama bunu kullandığı için engellenen birini henüz görmedim sanırım.
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ı?
Alternatif istemci kullanmayı da engelliyor. Hesabınız önemliyse Discord’u kurcalamamak en iyisi.
“İ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.
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.