When Random Isn't
- लगभग 10 साल पुरानी यह घटना है, इसलिए कृपया यह मानकर चलें कि असली कोड खो जाने की वजह से कुछ हिस्से मुझे ठीक-ठीक याद नहीं हैं.
- कंप्यूटर सुरक्षा पसंद करने वाला कोई भी व्यक्ति इसे आनंद से पढ़ सके, इसलिए कुछ विवरण सरल किए गए हैं.
- 14 साल की उम्र में मैंने World of Warcraft खोजा और उसका आदी हो गया.
- फिर मुझे ऐसे add-on मिले जिनसे गेम का user interface बदला जा सकता था, और मैंने खुद उन्हें बनाना शुरू किया.
- Lua प्रोग्रामिंग भाषा में बने ये add-on कुछ
.lua source files से मिलकर बनते थे.
- मुझे यह बात बहुत आकर्षक लगी कि गेम मेरे अपने लिखे source code को load करके execute करता था.
Add-on security
- यूज़र द्वारा प्रोग्राम किए जा सकने वाले add-on होना पहली नज़र में बुरा विचार लग सकता है, क्योंकि इससे bot बन सकते हैं.
- Blizzard ने जो system बनाया था, वह मनमाने programming behavior को रोकने के लिए काफ़ी चतुर था.
- ज़्यादातर UI elements पूरी तरह unrestricted थे, क्योंकि वे सजावटी या सिर्फ़ जानकारी दिखाने वाले थे.
- जानकारी इकट्ठा करने वाले API, जैसे character health दिखाने वाला API call, unrestricted थे.
- लेकिन कुछ API calls सुरक्षित थे, ताकि उन्हें सिर्फ़ आधिकारिक Blizzard code से ही call किया जा सके.
- गेम के भीतर वास्तविक actions करने से जुड़े ज़्यादातर API सुरक्षित थे.
- किसी समय world position और camera direction लेने वाले API भी सुरक्षित कर दिए गए.
- अगर आप किसी खास spell को cast करने वाला button बनाना चाहते, तो क्लिक होने पर secure environment में code चलाने वाला एक special button बनाया जा सकता था.
- ऐसे buttons को combat के दौरान create, destroy या move नहीं किया जा सकता था, ताकि लड़ाई के बीच automation रोकी जा सके.
- secure environment में प्रोग्राम के ज़रिए यह तय किया जा सकता था कि कौन-सा spell cast करना है, लेकिन मनमानी automation के लिए ज़रूरी information gathering की अनुमति नहीं थी.
A backdoor channel
- कुछ साल बाद, जब मेरी रुचि ज़्यादा "serious" programming में हो गई, तो मैंने World of Warcraft लगभग छोड़ दिया.
- फिर भी secure environment को निष्प्रभावी करने का विचार मन में बना रहा.
- third-party software इस्तेमाल करने के बजाय, मैं तकनीकी रूप से अनुमत tools का उपयोग करके इसे एक चुनौती की तरह हल करना चाहता था.
- मुझे पता चला कि
random function secure environment में allowed functions की सूची में था, और मैंने सोचा कि इसके ज़रिए जानकारी चोरी-छिपे अंदर पहुँचाने का तरीका निकाला जा सकता है.
Random number generator woes
- पता चला कि
random असल में C के rand function का एक साधारण wrapper था.
rand का implementation एक सरल और कमज़ोर linear congruential generator था.
- मैंने RNG की internal state को reverse engineer करके उससे जानकारी भेजने का तरीका विकसित किया.
Putting it together
- जब RNG की internal state को reverse engineer करना संभव हो गया, तो secure environment में मनमाने automation decisions लेना भी संभव हो गया.
- insecure environment में information access करके निर्णय लिया जाता, और secure environment में "random" चुने गए action को execute कराया जाता.
Conclusion
- मुझे नहीं पता कि Blizzard ने shared और weak RNG state की इस समस्या को कब ठीक किया, या क्या उन्हें कभी यह एहसास हुआ कि यह समस्या थी भी.
- कुछ साल बाद जब मैंने code दोबारा चलाने की कोशिश की, तो वह काम नहीं कर रहा था.
- यह एक ऐसे वीडियो गेम में loophole का इस्तेमाल था जिसे मैं वास्तव में उपयोग में नहीं लाना चाहता था, लेकिन जो चीज़ random दिखती हो उसे manipulate करने में एक तरह का जादुई आकर्षण था.
GN⁺ की राय
- यह लेख कंप्यूटर सुरक्षा और programming का एक दिलचस्प उदाहरण पेश करता है.
- गेम के भीतर security को bypass करने के रचनात्मक तरीकों की खोज programming skills के महत्व और संभावित vulnerabilities के प्रति जागरूकता बढ़ाती है.
- RNG की कमज़ोरी का उपयोग करने की यह कहानी software developers को security और algorithms के महत्व की याद दिलाने वाला एक शिक्षाप्रद उदाहरण है.
1 टिप्पणियां
Hacker News राय
एक उपयोगकर्ता ने उल्लेख किया कि उसने कुछ महीने पहले StackOverflow पर "RNG (random number generator) inversion" के बारे में एक सवाल का जवाब दिया था। इस उपयोगकर्ता ने Java RNG पर हमला किया था, और क्योंकि वह MSVC RNG जैसे LCG (linear congruential generator) डिज़ाइन का उपयोग करता है तथा आंतरिक state के truncation को output करता है, इसलिए हमला करने का तरीका बहुत मिलता-जुलता है।
एक अन्य उपयोगकर्ता ने अनुमान लगाया कि यदि सर्वर वही RNG इस्तेमाल कर रहा हो, तो कम उपयोग वाला सर्वर, कम ping, RNG की मौजूदा state पर सटीक window हासिल करने की क्षमता, और ऊँची आर्थिक volatility वाले अन्य events को जल्दी trigger करने की क्षमता होने पर सैद्धांतिक रूप से इसका फायदा उठाया जा सकता है.
एक और उपयोगकर्ता ने इशारा किया कि दिया गया linear congruential RNG सिर्फ 12445 अलग-अलग संख्याएँ बनाने के बाद दोहराने लगता है, और कहा कि इस algorithm के लिए बेहतर parameters का उपयोग करना उचित होगा.
एक उपयोगकर्ता ने कहा कि World of Warcraft (WoW) ने उसके programming में रुचि की शुरुआत की। जब game रिलीज़ हुआ तब वह 6 साल का था, और private servers आने के बाद उसे अपना NPC बनाने का तरीका जानने में रुचि हुई। इसके जरिए उसने Lua सीखी, private server core compile करना, SVN, patch apply करना आदि सीखा.
John von Neumann का उद्धरण साझा करने वाले एक उपयोगकर्ता ने कहा कि random numbers बनाने के सभी तरीके पाप हैं, और सख्त arithmetic procedures random numbers बनाने का तरीका नहीं हैं.
एक उपयोगकर्ता ने कहा कि उसने WoW के auction house के लिए एक script लिखी थी, जो सभी auctions को scan करती थी, कम कीमत वाले items खरीदती थी और उन्हें फिर से auction पर डालती थी। अगर कोई कीमत कम कर देता, तो script cancel करके उससे थोड़ा कम दाम पर फिर से auction लगा सकती थी.
एक उपयोगकर्ता ने उस घटना का ज़िक्र किया जिसमें कमजोर random numbers की वजह से Hacker News hack हो गया था। उसने संबंधित link भी दिया.
एक उपयोगकर्ता ने "जब variables बदलते नहीं और constants स्थिर नहीं रहते" जैसी अभिव्यक्ति का उपयोग किया.
एक उपयोगकर्ता, जिसने WoW नहीं खेला था, ने कहा कि उसने सुना है कि कई add-ons private chat को communication माध्यम के रूप में इस्तेमाल करते थे। उसने कहा कि अगर कोई तरीका मौजूद हो, तो लोग आखिरकार उसे ढूँढ ही लेते हैं और इस्तेमाल भी करते हैं.
RNG के आर्थिक incentives के संदर्भ में, एक उपयोगकर्ता ने कहा कि जहाँ वास्तव में कुछ दाँव पर न लगा हो (जैसे game), वहाँ अपूर्ण RNG भी काफी होता है। लेकिन जहाँ पैसा या security महत्वपूर्ण हो (जैसे cryptocurrency wallets या online casinos), वहाँ RNG की quality बहुत महत्वपूर्ण हो जाती है.