2 पॉइंट द्वारा GN⁺ 2023-08-24 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Electron-आधारित डेस्कटॉप ऐप Discord अंदरूनी तौर पर Chromium विंडो की तरह काम करता है, इसलिए वेब developer tools खोले जा सकते हैं और इनके जरिए client-side code में बदलाव संभव है
  • कुछ modded clients और plugins, Nitro paid subscription की ज़रूरत वाले कुछ फीचर्स को client side पर अनलॉक कर देते हैं
  • Webpack code splitting से बँटे modules को webpackChunkdiscord_app वेरिएबल में inject करके internal functions को खोजने और बदलने का तरीका इसका मुख्य आधार है
  • screen sharing quality जाँचने वाला function केवल client पर verify होता है, इसलिए उसे bypass किया जा सकता है, लेकिन premium themes के लिए server sync validation अतिरिक्त रूप से काम करती है
  • डेमो में दिखाए गए सभी तरीके Discord की Terms of Service का उल्लंघन हैं और इनमें account suspension का जोखिम तथा unverified code चलाने से account compromise होने का खतरा मौजूद है

अवलोकन

  • रूप बदलने या फीचर जोड़ने वाले कई modded Discord clients मौजूद हैं, और कुछ plugins तो Nitro paid subscription वाले फीचर्स भी अनलॉक कर देते हैं
  • client structure के analysis के जरिए यह समझाया गया है कि यह तकनीकी रूप से कैसे संभव होता है

Developer Tools सक्षम करना

  • Discord को Electron framework पर बनाया गया है, जो web technologies से cross-platform apps बनाता है, इसलिए यह web browser के भीतर चलने वाली website जैसा है
  • मूल रूप से यह एक Chromium window है, इसलिए developer tools खोले जा सकते हैं, लेकिन ये default रूप से disabled रहते हैं
    • कई यूज़र्स social engineering के जरिए attackers द्वारा बहकाए जाने पर malicious commands paste कर चुके हैं, जिससे accounts compromise हुए, इसलिए इसे block किया गया
  • अगर आप जोखिम समझते हैं, तो %appdata%/discord/settings.json settings file में DANGEROUS_ENABLE_DEVTOOLS_ONLY_ENABLE_IF_YOU_KNOW_WHAT_YOURE_DOING का मान true जोड़कर इसे enable किया जा सकता है
    • इसके बाद ctrl + shift + i से developer console खोली जा सकती है

Discord functions को patch करना

  • शुरुआती loading optimization के लिए code को कई chunks में बाँटा जाता है और उन्हें parallel या lazy-loaded रूप में लोड किया जाता है, इसके लिए Webpack का code splitting फीचर इस्तेमाल होता है
  • सभी loaded chunks webpackChunkdiscord_app वेरिएबल में स्टोर होते हैं
  • Discord variables और functions का उपयोग करने वाला code चलाने के लिए इस वेरिएबल में code inject करना पड़ता है
    • a.c सभी modules को रखने वाला object है, और हर module chunk_id, loaded, exports के रूप में बना होता है
    • exports में module से export किए गए functions, objects और primitive values शामिल होते हैं
  • कई JavaScript modules में घूमने वाला find function बनाकर किसी खास function को खोजा और call किया जा सकता है
    • उदाहरण: getCurrentUser() function को खोजकर call करना
  • original function को किसी दूसरे function से replace करके उसके behavior को बदला जा सकता है, यानी सीधे code modification संभव है

High-quality streaming अनलॉक करना

  • इस बिंदु के बाद की सामग्री Discord की Terms of Service का स्पष्ट उल्लंघन है और इससे account suspension हो सकता है, इसलिए जोखिम आपको खुद उठाना होगा
  • user के subscription tier को जाँचने वाले canStreamMidQuality, canStreamHighQuality नाम के दो functions screen sharing quality selection screen से ठीक पहले call होते हैं
    • अगर इन दोनों functions का return value ज़बरदस्ती true कर दिया जाए, तो Nitro subscription के बिना भी source resolution 60 FPS screen sharing चुनी जा सकती है
  • फ़िलहाल ऐसा लगता है कि Discord server पर यह verify नहीं करता कि भेजी जा रही stream वास्तव में non-subscriber limits का पालन कर रही है या नहीं
    • हालांकि Discord अभी End-to-End encryption का उपयोग नहीं करता, इसलिए detection की संभावना बनी रहती है
    • संदर्भित लेख के अनुसार Discord पहले से ही users के audio और video content की जाँच करता है, और भविष्य में screen sharing से पहले server-side validation जोड़ सकता है

Premium themes अनलॉक करना

  • अगर यह बताने वाले canUseClientThemes function का मान true कर दिया जाए कि user Nitro themes इस्तेमाल कर सकता है या नहीं, तो premium theme selection button अनलॉक हो जाता है
  • लेकिन theme थोड़ी देर के लिए apply होकर तुरंत default theme पर वापस चली जाती है
    • क्योंकि client theme change को save करने की कोशिश करता है, लेकिन server verify करता है कि इसकी अनुमति नहीं है, और response मिलने पर default theme फिर से apply कर देता है
  • अगर shouldSync function को patch करके appearance value होने पर false return कराया जाए, ताकि केवल appearance settings sync रुक जाए, तो theme change बना रहता है
  • themes पूरी तरह client side पर manage होती हैं और CSS को सीधे modify करना भी हमेशा संभव है, इसलिए Discord के लिए इसे रोकना मुश्किल है

निष्कर्ष

  • डेमो में दिखाए गए hacks को आसानी से लागू करने वाला code मौजूद है, लेकिन client modification या mods इस्तेमाल करने से पहले सावधानी बेहद ज़रूरी है
  • Discord Terms of Service का उल्लंघन करने वाले accounts को कभी भी suspend कर सकता है, और account access रखने वाले unverified code को चलाना बहुत खतरनाक है
    • लेख में encoded message: "जिस code को आप समझते नहीं हैं, उसे developer console में paste मत करें — account compromise होने का यह सबसे आसान तरीका है"

1 टिप्पणियां

 
GN⁺ 2023-08-24
Hacker News की राय
  • अंत में लगे साधारण base64 encoded blob को चलाने से अगर सारी सुविधाएँ चालू हो जाती हैं, तो यह काफी आसान attack vector बन सकता है, ऐसा लगता है
    मेरा मतलब लेखक पर शक करना नहीं था, और अभी decode करके देखा तो मैं फँस गया

    • जिन लोगों को base64 --decode चलाने में आलस है, उनके लिए नतीजा यह है:
      // 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);
  • “फिलहाल Discord सर्वर पर यह verify नहीं करता दिखता कि भेजी जा रही stream सच में non-subscriber वाली limits का पालन कर रही है”, तो सोचता हूँ किसने इसे अच्छी implementation माना होगा
    Client-side validation तो सचमुच बहुत basic गलती लगती है

    • यह “यह शानदार implementation है” से ज़्यादा “अगर किसी ने तोड़ने का तरीका ढूँढ लिया तो तब patch कर देंगे” जैसा रहा होगा
      Discord को कई साल इस्तेमाल करते हुए Nitro के access-control structure को bypass करने की कोशिश के बारे में पहली बार सुन रहा हूँ, और अगर यह widespread नहीं है तो खास परवाह करने की वजह भी नहीं दिखती
    • मैं तो सिर्फ finished feature को, जैसे final रूप में चाहिए वैसा बनाकर PR डालने वाली स्थिति में हूँ, इसलिए बिल्कुल समझ नहीं आता कि ऐसा क्यों किया गया
      अलग बात यह है कि इस महीने ही मैंने पाँचवीं नई job शुरू की है, और लगता है project managers से मेरी बिल्कुल नहीं बनती
    • आजकल लोग, खासकर बच्चे, पैसे काफी आसानी से खर्च कर देते हैं, यह देखते हुए इतना काफी हो सकता है
      ऐसे hack को समझने और Nitro के लिए पैसे देने की इच्छा रखने वाले लोग कितने होंगे, पता नहीं। Nitro features में से कुछ या सारे enable करने वाले कई Discord client mods इस्तेमाल करने वाले हजारों, शायद दसियों हजार लोग होंगे, लेकिन इसे रोकने से असल revenue कितना आएगा, यह संदेह है
      निजी तौर पर, अगर मुझे वह feature चाहिए या पसंद है तो महीने के 10 डॉलर देना कहीं कम झंझट वाला है। Discord update के साथ टूट जाने वाले mods का पीछा करते रहना, और उम्मीद करना कि maintainer malware न डाल दे, उससे बेहतर लगता है
    • API के जरिए hidden channels के नाम, topic और आखिरी message का समय भी देखा जा सकता है
      channel सिर्फ client में छिपे होते हैं। स्पष्ट कर दूँ, फिर भी उस channel के messages की content नहीं देख सकते
    • यह Discord API component नहीं, बल्कि दुनिया भर में deploy किए गए सैकड़ों voice servers की तरफ की चीज़ है
      voice server सिर्फ API से check करता है कि entry permission है या नहीं, और उसके बाद one-to-many packet broadcaster की तरह काम करता है
  • यह जिज्ञासु और skilled अर्थ में classic hacker के ज्यादा करीब है
    कोई गंभीर नुकसान भी नहीं, और यह फिर याद दिलाता है कि apps जादू नहीं हैं और code cool होता है

    • “cracker” के ज्यादा करीब भी हो सकता है, लेकिन इस बात से सहमत हूँ कि यह उस तरह की knowledge है जिसे companies नहीं चाहतीं कि हम जानें
      ताकि वे बिना resistance के हमसे और ज्यादा पैसे निचोड़ने की कोशिश कर सकें
  • फिर याद दिला दूँ कि Discord पर भेजी गई हर चीज़, DM समेत, Discord में plaintext में record होती है और Discord तथा उस company को खरीदने वाली entity के लिए accessible हो जाती है
    एक समय ऐसा लग रहा था कि Microsoft इसे खरीदेगा, और अब लगता है IPO की तरफ जा रहा है
    सिर्फ account होना ही AI के लिए data mining या Discord और database/system admins द्वारा इस्तेमाल की जा सकने वाली निजी बातचीत को normalise कर देता है। FISA Amendments Act के Section 702(FAA702) के तहत federal investigative agencies बिना warrant भी ऐसे data तक access कर सकती हैं
    केवल cryptocurrency front-running की संभावना ही रोज़ाना करोड़ों डॉलर की value रखती होगी
    अगर आप दोस्त हैं तो दोस्त को end-to-end encrypted न होने वाला chat system इस्तेमाल करने की सलाह नहीं देनी चाहिए। जाल में रखे शहद मत बनो

    • फिर याद दिला दूँ कि forums पर भेजी गई हर चीज़, DM समेत, plaintext में record होती है और admins के लिए accessible होती है
      अगर आप उन कुछ services में से किसी का इस्तेमाल नहीं कर रहे जो user-managed keys वाला असली zero trust model implement करती हैं, तो यह स्वाभाविक है। messages store करने की वजह यह है कि users बाद में उन्हें access कर सकें
      Matrix जैसी services भी हैं जो end-to-end encrypted group messaging को अपेक्षाकृत friendly तरीके से कर लेती हैं, लेकिन वे exceptions हैं। electronic communication platforms के 95% ने जो तरीका अपनाया है वही अपनाने के लिए सिर्फ Discord को खास तौर पर malicious कहना fair नहीं है
    • “सिर्फ account होने से normalise हो जाता है” कहते हैं, लेकिन यह बहुत पहले ही normalise हो चुका है और Discord जीत चुका है
      इसका मतलब यह नहीं कि यह अच्छा है, लेकिन कुछ communities में भाग न लेने के अलावा कोई विकल्प नहीं है
      यह पुराने “हर कोई WhatsApp इस्तेमाल करता है” से भी खराब है। तब आपके पास सामने वाले का number होता था, इसलिए दूसरे तरीके से contact करना आसान था, लेकिन Discord का आकर्षण निजी बातचीत नहीं, बल्कि semi-public spaces वाली communities हैं। यहाँ public का मतलब सबके लिए open नहीं, बल्कि लगभग 100 लोग पढ़ते हैं जैसा है
    • अच्छी बात है कि Discord में trace-less message deletion है
      message delete करने पर वह database में आगे store नहीं रहता
  • हाल ही में OpenAI ने beta testers वाला Discord अचानक disable कर दिया, जिससे हम अब यह नहीं देख पा रहे कि हमने किसके साथ क्या discuss किया था
    सोच रहा था कि क्या chat export करने का कोई तरीका है ताकि server admins logs खंगालने का रास्ता छोड़े बिना community को आपस में कटने न दें
    Discord chats export करने वाले Chrome extensions काफी हैं, लेकिन लगता है उनमें से ज्यादातर ने कुछ features paid lock के पीछे रखे हैं
    पता चला कि Chrome folder से extension source copy करके JavaScript में is_pro जैसे boolean checks बदलना और फिर unpacked extension के रूप में reload करना बहुत आसान था

    • DiscordChatExporter: https://github.com/Tyrrrz/DiscordChatExporter
      यह API को non-standard तरीके से इस्तेमाल करने वाला standalone program है, लेकिन लगता है इसे इस्तेमाल करने की वजह से किसी के ban होने का मामला अभी तक नहीं देखा
  • सही warning तो देते हैं कि ऐसे tricks इस्तेमाल करने पर ban हो सकते हैं, लेकिन क्या Discord ने कभी इस तरह की चीज़ के लिए users को ban किया है?

    • Discord किसी भी वजह से लोगों को ban करने में हिचकता नहीं
      alternative clients इस्तेमाल करना भी रोकता है। अगर account important है तो Discord से छेड़छाड़ न करना बेहतर है
    • सबसे popular mods में से एक Vencord के README में यह लिखा है:
      “Client modifications are against Discord’s Terms of Service.”
      हालांकि Discord इस पर काफी indifferent है, और client mod इस्तेमाल करने की वजह से ban हुए known cases नहीं हैं। इसलिए अगर abuse behavior implement करने वाले plugins नहीं इस्तेमाल करते, तो आम तौर पर ठीक रहना चाहिए। चिंता न करने की बात यह है कि built-in plugins सब safe बताए जाते हैं
  • कुछ themes का इस तरह enable होना समझ आता है, लेकिन streaming quality को server-side की बजाय client-side check से तय कराना काफी समझ से बाहर है

    • खासकर इसलिए क्योंकि सिर्फ input/output bitrate check करना काफी है
      actual video तक access की जरूरत भी नहीं, और वह पूरी तरह encrypted हो तब भी भेजे गए data की मात्रा देखकर पता चल सकता है कि किस quality में stream हो रही है
  • frontend engineering का golden rule फिर सही साबित हुआ
    “कभी भी, कभी भी client पर भरोसा मत करो”

  • जब से देखा कि इसे सिर्फ client-side से handle किया जा सकता है, तब से developer tools और 1080p60 streaming button on करके इस्तेमाल कर रहा हूँ, और यह सच में काम करता है
    कितने साल हो गए पता नहीं, लेकिन लगता है Discord की तरफ से कोई परवाह नहीं करता

  • पहले इस रास्ते पर जाने की कोशिश की थी, लेकिन खासकर updates के बाद client को consistently patch करने का तरीका नहीं मिला, इसलिए आखिरकार छोड़ दिया
    लेकिन यह तरीका देखकर फिर “खोलकर poke करने” की इच्छा हो रही है
    इस तरीके से available APIs को scan करने का कोई आसान तरीका है क्या? मैंने सब log करने की कोशिश की थी, लेकिन maps, internationalization वगैरह की वजह से बहुत mess था। सोच रहा हूँ क्या किसी ने मेहनत करके reverse engineering docs जैसा कुछ बना रखा है