1 पॉइंट द्वारा GN⁺ 2024-04-19 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Randar एक exploit है जो Minecraft Beta 1.8~1.12.2 में block तोड़ने पर बनने वाले item drop coordinates का उपयोग करके server की java.util.Random state को restore करता है और दूसरे players की location को backtrace करता है
  • मूल कारण RNG reuse है, जहां terrain/structure generation और mining events एक ही random number generator share करते हैं, और दिखाई देने वाली drop positions internal state का clue बन जाती हैं
  • item drop के X/Y/Z offsets World.rand.nextFloat() के लगातार तीन outputs होते हैं, इसलिए 48-bit seed के ऊपरी 24 bits expose होते हैं और LLL lattice reduction से seed जल्दी restore किया जा सकता है
  • restore किए गए seed को पीछे rewind करके जांचा जाता है कि क्या वह Woodland Mansion check से निकला value है; सही होने पर हाल में load हुए 1280×1280 block Woodland region की पहचान हो जाती है
  • अगर ReplayMod जैसे पुराने packet records में drop data बचा हो, तो server patch होने के बाद भी Beta 1.8~1.12.2 के समय की activity locations बाद में expose हो सकती हैं

Randar किस जानकारी को target करता है

  • लक्ष्य उसी world में मौजूद दूसरे players के in-game coordinates ढूंढना है
  • 2b2t को मुख्य example के रूप में इस्तेमाल किया गया है
    • 2b2t बिना नियमों वाला Minecraft “anarchy” server है
    • server map 3.6 quadrillion square tiles के scale का है, इसलिए location secrecy items को सुरक्षित रखने की मुख्य शर्त बन जाती है
  • Randar से पहले भी 2b2t में 2018~2021 के दौरान इस्तेमाल हुआ coordinate exploit Nocom था

Vulnerable versions और code mistake

  • समस्या Minecraft Beta 1.8 के 2011 release से 1.12.2 के 2017 release तक मौजूद है
    • 2b2t 14 अगस्त 2023 तक 1.12.2 पर ही रहा
  • मुख्य गलती यह थी कि java.util.Random instance को कई code paths में लापरवाही से reuse किया गया
    • terrain generation और mining जैसी game actions के बीच RNG share किया गया
    • java.util.Random खुद भी security RNG नहीं है
  • Minecraft समान world seed और समान location पर समान terrain लाने के लिए deterministic generation का उपयोग करता है
    • इस उद्देश्य के लिए java.util.Random का उपयोग स्वाभाविक है
    • समस्या यह है कि predictable होनी चाहिए ऐसी world generation RNG manipulation ने उन events को भी प्रभावित किया जिन्हें unpredictable होना चाहिए था

Woodland Mansion check और global World.rand

  • Woodland Mansion generation location check करने की प्रक्रिया में World.rand reset होता है
    • Woodland region 80×80 chunks की units में calculate होता है
    • उस region में Mansion बनने वाला chunk चुनने के लिए random.nextInt(60) चार बार call होता है
  • Vulnerable flow में World.setRandomSeed(seedX, seedY, seedZ) global this.rand में नया seed set करता है और वही object return करता है
  • 2b2t-specific formula यह है
seed = x * 341873128712 + z * 132897987541 - 4172144997891902323 mod 2^48
  • setRandomSeed सिर्फ actual Woodland Mansion के पास होने पर नहीं, बल्कि हर chunk load पर check के उद्देश्य से call होता है
  • Dimension-wise impact अलग है
    • Overworld मुख्य रूप से प्रभावित है
    • Nether safe है क्योंकि structure generation हमेशा safe RNG का उपयोग करता है
    • The End initial generation के समय end city के कारण प्रभावित होता है, लेकिन वही chunk बाद में फिर load होने पर हर बार असर नहीं डालता, इसलिए अपेक्षाकृत safe है

Item drop coordinates RNG को कैसे reveal करते हैं

  • block mine करने पर item block के अंदर random position पर drop होता है
    • उदाहरण के लिए block coordinate (10, 20, 30) हो तो item (10.25, 20.25, 30.25) से (10.75, 20.75, 30.75) के बीच दिखाई देता है
  • यह position X, Y, Z offsets को world.rand.nextFloat() तीन बार call करके तय करती है
  • drop coordinates से original nextFloat() values वापस निकाली जा सकती हैं
    • float में 0.5 multiply करने की प्रक्रिया सिर्फ exponent घटाती है, information loss नहीं होता
    • इसके बाद double में convert किया जाता है और block coordinates जोड़कर network पर full precision में भेजा जाता है
  • java.util.Random.nextFloat() 48-bit seed update करने के बाद ऊपरी 24 bits को integer के रूप में निकालकर 2^24 से divide करता है
    • LCG formula है newSeed = oldSeed * 25214903917 + 11 mod 2^48
    • लगातार तीन floats लगातार तीन seeds के ऊपरी 24 bits provide करते हैं

LLL lattice reduction से seed restore करना

  • Simple तरीका पहले measurement से match होने वाले lower 24-bit candidates के सभी 2^24 values try करना है
    • यह तरीका भी काम करता है, लेकिन धीमा है, इसलिए lattice method का उपयोग किया जाता है
  • तीन measurements निम्न तीन values की ranges provide करते हैं
    • seed
    • nextSeed(seed)
    • nextSeed(nextSeed(seed))
  • इन तीन values को 3D point (seed, nextSeed(seed), nextSeed(nextSeed(seed))) के रूप में देखें तो सभी possible seeds lattice structure बनाते हैं
  • Basis vectors इस तरह लिए जाते हैं
    • (1, a, a^2)
    • (0, c, 0)
    • (0, 0, c)
    • यहां a = 25214903917, c = 2^48
  • LLL basis reduction उसी lattice के लिए छोटा और लगभग orthogonal basis निकालता है
    • Mathematica example: LatticeReduce[{{1, a, a^2}, {0, c, 0}, {0, 0, c}}]
    • result basis है (1270789291, -2446815537, 2154219555), (-2355713969, 1026597795, 4110294631), (-3756485696, -2345310016, -2015749696)
  • measurement cube के center को reduced basis space में transform करने के बाद हर coefficient को nearest integer पर round करने से valid lattice point मिलता है, और पहला coordinate restored internal seed बनता है
  • Optimized Java code example तीन measurements से लगभग 10ns के level पर seed restore कर सकता है

Seed rewind करके location खोजने की प्रक्रिया

  • java.util.Random का LCG आगे और पीछे दोनों direction में चल सकता है
    • forward: newSeed = oldSeed * 25214903917 + 11 mod 2^48
    • backward: oldSeed = (newSeed - 11) * 246154705703781 mod 2^48
  • restored seed को पीछे rewind करते हुए check किया जाता है कि हर seed Woodland Mansion check से आया seed हो सकता है या नहीं
  • Minecraft world range -30 million से +30 million blocks तक है
    • implementation हर axis की Woodland region range -23440 से +23440 तक रखता है
    • possible Woodland regions की संख्या (23440*2+1)^2, यानी 2,197,828,161 है
  • 2.2 अरब candidates को सभी compare करने वाला तरीका धीमा है, और बड़ा HashSet भी बहुत memory लेता है
  • Z coefficient 132897987541 odd है, इसलिए mod 2^48 में इसका inverse है
    • inverse 211541297333629 है
    • इसका उपयोग करके केवल सभी X candidates 46,881 scan किए जाते हैं और Z calculate करके candidate region मिल जाता है

GPU और lookup table optimization

  • केवल X iterate करने वाला तरीका single seed के लिए reasonable है, लेकिन कई bots प्रति second कई blocks mine करें और हर measurement पर हजारों RNG steps check हों, तो low-end VPS पर real-time processing मुश्किल थी
  • बाद की implementation CUDA batch jobs और lookup table में बदल गई
    • lookup table key mansion seed के lower 32 bits हैं
    • value Woodland region का X coordinate है
    • lower 32-bit key में collision नहीं था, और लिखा है कि कारण समझ नहीं आया
  • table 2^32 entries और प्रति entry 2 bytes इस्तेमाल करती है, यानी करीब 9GB VRAM चाहिए
  • RTX 3090 पर प्रति second करीब 10 million seeds crack किए जा सकते थे
  • restore result सबसे हाल में chunk load हुआ 1280×1280 block Woodland region बताता है, और इतना काफी है कि कुछ मिनट search करके location पता चल सके

Actual server पर observed step distribution

  • Theoretically Woodland seeds के बीच average gap करीब 128,000 RNG steps है
  • 2b2t में अधिकतर Woodland seed कुछ दर्जन steps के भीतर मिल गया
    • measurement packet processing timing के कारण tick के बहुत early point पर होता है
    • आमतौर पर previous tick में chunk load हो चुका होता था
  • reliable measurement कम से कम 4 RNG steps से शुरू होता है
    • क्योंकि Woodland Mansion code observation से पहले rand.nextInt चार बार call करता है
  • बड़ा spike 1354 step multiples पर दिखाई देता है
    • end crystal explosion या wither skull की संभावना बताई गई है
    • end crystal explosion के मामले में block damage calculation 16^3-14^3=1352 और sound effects 2 बार मिलकर 1354 steps बनते हैं

ReplayMod और बाद में exposure का risk

  • server latest version में update हो गया हो या RNG manipulation patch कर दिया गया हो, फिर भी अगर पुराना data बचा है तो Randar risk बचा रहता है
  • कुछ Minecraft players ReplayMod जैसे mods से packets record करते हैं
    • अगर recording file में item drops शामिल हैं तो उस समय की server RNG state restore की जा सकती है
    • block तोड़ना बहुत common action है, इसलिए recording में शामिल होने की संभावना ज्यादा है
  • Beta 1.8~1.12.2 में active रही सभी locations को server के बहुत पहले update हो जाने पर भी exposed मानना चाहिए
  • Randar को सीधे चला कर देखने के लिए client-side web tool दिया गया है
    • hobune.stream/randar पर 1.12.2 ReplayMod file drag करके coordinates check किए जा सकते हैं
    • recording file browser से बाहर नहीं जाती

Randar operation और heatmap

  • SpawnMasons ने उन accounts से item drop coordinates record करना शुरू किया जो पहले से किसी दूसरे project के कारण 24/7 stone/cobblestone mine कर रहे थे
  • Nocom में इस्तेमाल headless Minecraft system reuse किया गया, और measurements store करने के लिए Postgres database जोड़ा गया
  • RNG measurements crack करने वाला software कई बार improve हुआ, और अंत में async CUDA batch job पर settle हुआ
  • cracked measurements database में add होने पर heatmap analysis table भी update होता था
    • full period, daily, hourly hit counts store किए जाते थे
    • Plotly Dash UI से specific time range और granularity चुनकर browser में देखा जा सके ऐसा बनाया गया
  • Elytra stash hunting से बनने वाले chunk load spam को हटाने के लिए केवल उन coordinates पर विचार किया गया जो कई distinct hours में load हुए थे
  • मिले hotspots को track करने के लिए simple shared annotation system भी जोड़ा गया
  • Nocom से लिए गए Baritone bot से item stashes चुराने और organize करने की प्रक्रिया AFK automate की गई

Protection के लिए decoy Woodland region

  • Randar हमेशा सबसे recent chunk को accurate तरीके से नहीं ढूंढता
    • RNG को पीछे rewind करते समय अगर ज्यादा recent decoy Woodland region पहले आ जाए, तो first match return करने वाला exploit false positive दे सकता है
  • Woodland seed कुल मिलाकर करीब 130,000 RNG seeds में से एक की दर से होता है, लेकिन distribution में outliers हैं
  • 2b2t में बताया गया कि लगभग 20,000 Woodland regions में से एक में ऐसी special hiding property होती है कि अगले 4 RNG steps के भीतर दूसरा Woodland region हो
  • SpawnMasons ने ऐसे regions में stash बनाए
    • render distance के कारण protection region के बाहर chunks load न हों, इसलिए structures compact बनाए
    • decoy location पर AFK account और छोटा base रखा ताकि दूसरे Randar users decoy location देखें
  • अपने Randar logs के अनुसार ये stashes पूरे period में adjacent Woodland region को गलती से load न करने वाली “clean” state में थे
  • Public release के समय बताया गया कि इन stashes को पहले ही move कर दिया गया था

Complete example और version-wise constraints

  • Java example दिया गया है जो SPacketSpawnObject में mining drop जैसे दिखने वाले item को detect करता है, drop coordinates को तीन float measurements में वापस बदलता है, फिर LLL-based cracking और Woodland region backtracking करता है
  • 2b2t की actual measurement example निम्न result देती है
    • item drop: 0.41882818937301636, 0.6833633482456207, 0.46088552474975586
    • RNG measurements: 5664934 14541261 7076144
    • internal seed: 95041827771683
    • Woodland region: -12008 0
    • location range: -15370368,-128 से -15369089,1151
  • diagram example Woodland Region 123,456 खोजता है
    • final location range 157312,583552 से 158591,584831 तक है
    • इसमें original input coordinates x=157440 z=583680 शामिल हैं
  • 1.11 से पहले के versions में exploitable structure Woodland Mansion नहीं बल्कि कोई दूसरी structure है, इसलिए अलग code चाहिए
  • 1.9 से पहले item position double के बजाय fractional part 5-bit fixed-point के रूप में भेजी जाती थी, इसलिए सिर्फ एक item से RNG state crack करना practical नहीं है और अलग measurement strategy चाहिए

Patch करने का तरीका

  • आसान तरीका RNG manipulation को disable करने वाला patch या setting ढूंढना है
  • Vulnerable implementation में World.setRandomSeed global this.rand पर seed set करके return करता है
public Random setRandomSeed(int seedX, int seedY, int seedZ) {
    this.rand.setSeed(seedX * 341873128712L + seedY * 132897987541L + seedZ + this.getWorldInfo().getSeed());
    return this.rand;
}
  • पूरी protection चाहिए तो हर call पर नया Random return करने के लिए बदल सकते हैं
public Random setRandomSeed(int seedX, int seedY, int seedZ) {
    return new Random(seedX * 341873128712L + seedY * 132897987541L + seedZ + this.getWorldInfo().getSeed());
}
  • performance की चिंता हो तो world generation के लिए dedicated अलग RNG field separateRandOnlyForWorldGen बनाकर उसे दूसरे purposes से share न करने दे सकते हैं
  • PaperMC 1.12.2 के लिए patch PaperWithRandarPatched commit और alternative patch file के रूप में दिया गया है

n0pf0x का appendix: दूसरे coordinate search methods और The End

  • n0pf0x ने Mason side के GPU large lookup table के बजाय cache-based coordinate search का उपयोग किया
    • hit होने पर उस coordinate और आसपास के radius के coordinates को HashMap में रखा जाता है
    • पहला pass RNG को पीछे rewind करते हुए cache hit या previous processed seed के साथ duplicate को जल्दी check करता है
    • दूसरा pass केवल तब चलता है जब पहला pass fail हो, और ऊपर बताए गए महंगे coordinate-finding algorithm का उपयोग करता है
  • यह cache method कम plausible valid locations को skip करने का असर देता है, इसलिए false positives घटाने में मदद कर सकता है
  • The End में chunk पहली बार generate होने पर ही RNG पर असर डालता है, इसलिए Overworld की तरह base chunk loads को repeat observe करना मुश्किल है
  • The End में जिन दो situations पर भरोसा किया जा सकता है
    • base पर मौजूद player घूमते हुए ungenerated chunk generate करे
    • base की ओर जाने वाला player अपने route पर नए chunk trail generate करे
  • trail के लिए automatic identification system बनाया जा सकता है, लेकिन n0pf0x ने implement नहीं किया और visually manual tracking किया
  • player identification के लिए End Occupancy Tracker(EOT) idea का उपयोग किया गया
    • यह assumption पर आधारित है कि प्रति tick RNG calls की संख्या loaded chunks की संख्या से कुछ हद तक correlate करती है, और यह उस dimension में player count से जुड़ती है
    • player join/leave के तुरंत बाद RNG call count spike या decrease होता है या नहीं देखकर The End में मौजूद player का अनुमान लगाया जाता है
  • EOT सिर्फ 9b9t पर test हुआ और 2b2t जैसे दूसरे server conditions में valid न हो सकता है
    • हर tick में reliably RNG sample कर पाना जरूरी है
    • The End में player activity बहुत ज्यादा हो तो यह और कठिन हो सकता है

1 टिप्पणियां

 
GN⁺ 2024-04-19
Hacker News की राय
  • 1999~2000 में International RoShamBo Programming Competition हुआ करती थी, जहाँ rock-paper-scissors computer bots आपस में मुकाबला करते थे [1]
    baseline bot सैद्धांतिक रूप से न हारने वाली strategy, यानी random choice, अपनाता था, लेकिन एक मज़ाकिया entry इस तरह डिज़ाइन की गई थी कि वह random number generator की state को reverse-engineer करके random player अगली बार क्या खेलेगा, इसका 100% सटीक अनुमान लगा सके
    संशोधन: वह bot Tim Dierks का “Nostradamus” था, और पहली competition में “supermodified” category का विजेता घोषित किया गया था [2]
    [1] https://web.archive.org/web/20180719050311/http://webdocs.cs...
    [2] https://groups.google.com/g/comp.ai.games/c/qvJqOLOg-oc

    • वह मैं ही था। इतने पुराने उद्धरण को फिर से देखना अच्छा लगा: “बेहतरीन technical skill और ‘जल्दी, बार-बार cheat करो’ वाले रवैये के साथ Tim computer game industry में AI programmer के रूप में एक शानदार करियर बना सकता है :)”
      असल में मैं security field में चला गया, TLS RFC लिखा, और Google security में principal engineer बन गया। यादें ताज़ा कराने के लिए धन्यवाद
    • मैंने पहले साल सबसे बुरी तरह optimal entry, cheesebot, submit की थी
      https://web.archive.org/web/20180719050236/http://webdocs.cs...
    • “supermodified” category की entries पर पूरी commentary बहुत ही मज़ेदार है
      Nostradamus को Certicom के engineering VP Tim Dierks ने लिखा था, जिनकी cryptography में गहरी expertise थी, और इसने random() generator की internal state को reverse-engineer करके optimal player को हरा दिया। उनके शब्दों में, “यह उम्मीद से कहीं आसान भी था और मुश्किल भी।” फिर भी sportsmanship के लिए इसने बाकी सभी opponents के खिलाफ optimally खेला
      Fork Bot, Dan Egnor के उस idea से बना जो competition के बारे में सुनने के कुछ मिनट बाद आया था; इसने “library routines allowed” नियम का फायदा उठाकर fork() से तीन processes शुरू किए, हर एक को अलग move खेलने दिया, और जो दो हार जाएँ उन्हें मार दिया। Andreas Junghanns ने इसे लगभग 10 lines of code में implement किया, लेकिन पहले turn के बाद तीनों moves Psychic Friends Network से हार गए, program terminate हो गया, और बाकी matches forfeit माने गए
      Psychic Friends Network Michael Schatz और RST Corporation के लोगों का लिखा हुआ बेहद मज़ेदार obfuscated C code था, जो good karma ढूँढने वाले helper functions, astrology advice, spaghetti और रहस्यमय pizza recipes, #define के ज़रिए Democrats को communists में बदलना, और God को undef करना जैसी चीज़ें करता था। stack frame के साथ यह ठीक-ठीक क्या करता था, यह अभी भी समझा जा रहा है, लेकिन meta-meta-cheater के खिलाफ न हो तो यह एक match में +998 से कम score नहीं करता था
      The Matrix को Darse Billings ने लिखा था, जिनके पास “Student for Life” जैसी प्रतिष्ठित उपाधि थी, और इसने “there is no spoon” के सरल सिद्धांत से हर opponent को perfect score के साथ हरा दिया
      The Matrix tournament program भी था, इसलिए इसे बाकी सभी algorithms, data structures, और output routines तक पूरा access था; इसीलिए भविष्य में इसके पीछे छोड़े जाने की संभावना कम मानी गई। इसलिए इस category को solved घोषित कर दिया गया और बाद की competitions में हटा दिया गया
    • याद है कि किसी ने एक online poker site पर भी ऐसा ही किया था, जिसने transparency बढ़ाने की सराहनीय कोशिश में pseudorandom number generator को document किया हुआ था
      आखिरकार उसी transparency की वजह से security बेहतर हुई
    • तो फिर वे pseudorandom number generator ही इस्तेमाल कर रहे थे?
  • LLL lattice reduction वही algorithm है जिसका इस्तेमाल कुछ दिन पहले एक CVE में biased nonces के ज़रिए PuTTY keys तोड़ने के लिए भी हुआ था
    tptacek ने attack को थोड़ा समझाया था, और एक cryptopals problem का link भी दिया था जिसे आँखें मिचमिचाकर देखो तो लगता है जैसे लगभग समझ रहे हो https://news.ycombinator.com/item?id=40045377
    इसी तरह SciCraft Minecraft server पर किसी काले जादू जैसे contraption से random number generator की state को deterministically manipulate किया जाता था, ताकि हर frame में एक खास block पर “random” lightning गिरे और creeper farm में बेहतर drops मिलें https://youtu.be/TM7SutJyDCk

    • Sean और Kelby, LLL क्या है यह कहीं बेहतर समझाते हैं, लेकिन LLL अस्तित्व में क्यों है, इस बारे में यह लेख अब तक देखी गई सबसे बेहतरीन चीज़ों में से एक है
      तीनों ही मामलों में आपको बस basic linear algebra चाहिए, और वह भी बहुत ज़्यादा नहीं। Kelby उम्मीद करता है कि आपको Gram-Schmidt समझ में आता हो, जो undergraduate linear algebra intro के midterm से ठीक पहले पढ़ाया जाने वाला topic है
      यह लेख कितना शानदार है, इसे कहने के लिए शब्द नहीं हैं। इसने मेरा हफ्ता बेहतर बना दिया
      बाद में Python में follow करने लायक उसी process की बहुत concise explanation:
      https://crypto.stackexchange.com/questions/37836/problem-wit...
    • एक RNG manipulation भी है जो blocks को हमेशा maximum value गिराने पर मजबूर करती है, और उसका वर्णन यहाँ है
      https://youtu.be/ZcdN1wCJPqM?t=390
    • “काले जादू जैसा contraption”, “आँखें मिचमिचाकर देखो तो लगता है जैसे लगभग समझ रहे हो” — cryptography को देखते समय मेरी यही हालत होती है :D
  • सुबह उठकर अगर दिखे कि पिछली रात जो blocks नहीं थे वे आसमान में तैर रहे हैं, पहले भूतिया धुंध जैसे लगें और फिर जल्द ही redstone, observer, slime blocks और अनंत TNT गिरते हुए दिखाई दें — ऐसी स्थिति की कल्पना करें
    यह सिर्फ इसलिए हुआ क्योंकि server ने मेरी location लीक कर दी। फिर भी अभी भागना संभव है, और शायद chest से कुछ ज़रूरी सामान कुछ ही सेकंड में निकालकर भागने या obsidian shelter बनाने का समय मिल जाए। लेकिन बस इतना ही
    precision-aim cannon बनाने का समय नहीं है, और वैसे भी altitude सही नहीं बैठा पाओगे। अगर elytra और rockets हों तो जाकर बाधा डालने की कोशिश कर सकते हो, लेकिन ठीक 16 chunks दूर एक विशाल world eater का गड्ढा है। क्या हर पास के Nether portal पर lava traps भी लगा दिए गए होंगे?

  • मैंने random number generator की समस्याओं पर बहुत दिलचस्प और मज़ेदार चीज़ें देखी हैं, लेकिन हासिल होने वाले फ़ायदे की तुलना में यह सबसे जटिल exploits में से एक है। यह किसी शानदार कला-कृति जैसा लगता है

    • अगर इस तरह की चीज़ बेची जाती, तो शायद इससे कुछ पैसे कमाए जा सकते थे, शायद हजारों डॉलर तक। लेकिन इसमें लगे काम को देखें तो यह अब भी छोटा इनाम है
    • Mojang developers के ऊपर-ऊपर से हानिरहित लगने वाले फैसलों का यहाँ जिस तरह दुरुपयोग हुआ है, वह सच में बहुत पसंद आया। बेहद शानदार
  • काफ़ी शानदार exploit है
    exploits की खुली छूट वाले server का विचार भी अच्छा है, और यह game के बिल्कुल अलग phase जैसा लगता है
    अगर metaverse सच में कभी हुआ, तो सिर्फ game के combat mechanics का इस्तेमाल करने के बजाय “वास्तव में लड़ना” शायद कुछ ऐसा ही दिखेगा

    • 2b2t combat भी सामान्य Minecraft जैसा नहीं दिखता
      बहुत पुराने समय से duplicate किए गए कीमती items की भरमार होने की वजह से PvP इस तरह का हो गया है कि लगातार end crystals बिखेरे जाते हैं, जिन्हें तोड़ने पर भारी damage होता है, और रक्षा इस बात पर निर्भर करती है कि आपके पास crit damage सोख लेने वाले “totems of undying” कितने हैं
      स्वाभाविक रूप से hacked clients end crystal placement, totem reload, और weak/strong positions की पहचान को automate कर देते हैं, और player बस उस guidance का पालन करते हुए damage देते रहते हैं
      इससे थोड़ा पहले तक server पर patch होने से पहले +32,767 damage वाली insta-kill hacked swords भी थीं
    • bugs और exploits के इर्द-गिर्द balance का converge होना, भले server उन्हें अनुमति न दे, तीव्र PvP sandbox games में काफ़ी सामान्य बात है
      ARK: Survival Evolved और Eve Online हजारों खिलाड़ियों वाले विशाल clans के metagame और bug abuse को चरम तक ले जाने के लिए बदनाम हैं
      यह हमेशा रोमांटिक नहीं होता। ARK में ऐसे mechanisms थे जिनसे players और उनके कई Steam accounts की doxxing की जा सकती थी, और लगता है कि Great War के दौरान कुछ in-game रिश्ते real life तक भी फैल गए थे
      कभी-कभी बहुत बुनियादी तरीके भी होते हैं। उदाहरण के लिए, raid के समय एक विशाल tower बनाकर उसे गिरा देना ताकि server पर denial of service हो और crash आ जाए, तो server 10–20 मिनट पुराने backup पर rollback हो जाता था, जिससे जिन bases में active players हों उन पर raid करना बहुत मुश्किल हो जाता था। यह बहुत पुराना तरीका है और कई साल पहले ठीक कर दिया गया
      Rust की एक policy यह भी थी कि bugs और exploits को YouTube पर फैलाने और सार्वजनिक करने के लिए प्रोत्साहित किया जाए, लेकिन उद्देश्य अलग था। इससे developers उन्हें जल्दी देख सकें और patch कर सकें। नतीजा यह हुआ कि game काफ़ी मजबूत बन गया, और वास्तविक external hacks के बिना उसका दुरुपयोग करना बहुत कठिन हो गया
    • बीच का एक उदाहरण Super Smash Bros Melee है। tournaments में स्वीकार की जाने वाली कई in-game tactics bugs पर निर्भर करती हैं
      लेकिन केवल वही जिनका manual abuse सामान्य controller से किया जा सके; यह वास्तविक hacking नहीं है। Wobbling नाम का एक exploit 2019 में ban किया गया था, जबकि यह game 2001 का है
    • gameplay के नज़रिए से मुझे असली anarchy server का विचार काफ़ी पसंद था, लेकिन असली 2b2t में chat में n-word इतना ज़्यादा था कि मैंने छोड़ दिया
    • “exploits की खुली छूट वाला server” क्या असल में लगभग हर VAC-रहित CS 1.6 server नहीं है?
  • मैंने अभी इस विषय पर एक वीडियो देखा। यह randomness के अलग-अलग स्रोतों के आपसी interaction के ख़तरे का एक स्पष्ट चेतावनी-उदाहरण है, और यह कई महत्वपूर्ण systems पर भी लागू होता है
    performance की वजह से code में random number generator को share करना आम है, लेकिन ऐसी बातें देखकर सच में रुककर सोचना पड़ता है

    • मुझे नहीं लगता कि मैंने कभी किसी serious software में pseudorandom number generator इस्तेमाल किया है, लेकिन सहज रूप से मैं सोचता था कि एक ही RNG को जितनी ज़्यादा जगहों पर इस्तेमाल किया जाए, ऐसे attacks उतने कठिन हो जाएँगे
      क्योंकि उसके update होने के points को पर्याप्त रूप से observe करना मुश्किल होगा। लेकिन यह मामला काफ़ी प्रभावशाली और मज़ेदार तरीके से दिखाता है कि वह intuition ग़लत है
  • यह वीडियो चौंकाने वाला है: https://www.youtube.com/watch?v=maMpMOnIJDE
    मुझे नहीं पता था कि community इतनी sophisticated है

    • इस वीडियो का narration इतना over-the-top है कि लगा जैसे Stuxnet की बात हो रही हो। फिर भी अच्छा है
    • Minecraft और MC anarchy community सच में पागल है
      अगर यह देखकर हैरानी हुई, तो यह भी देखो। दिमाग उड़ जाएगा
      https://www.youtube.com/watch?v=ea6py9q46QU
      और
      https://www.youtube.com/watch?v=GaRurhiK-Lk
  • इससे भी आगे, इस तरह का RNG cracking game के अंदर भी implement किया जा चुका है
    https://youtu.be/FPmQ0rnJjNc?si=tTFObcfZ-ILanL_A

  • हैरानी की बात यह है कि Minecraft के भीतर ही बनाया गया एक Mess Detector नाम का machine है। यह block drops के बजाय ignited TNT की position का उपयोग करके RNG की internal state का अनुमान लगाता है
    https://www.youtube.com/watch?v=FPmQ0rnJjNc

  • यह state compromise extension attack जैसा लगता है (https://en.wikipedia.org/wiki/Random_number_generator_attack)
    यह ऐसा attack है जो cryptographically secure pseudorandom number generator (CSPRNG) की जगह non-CSPRNG PRNG पर किया जा सकता है
    अब तो libraries में PRNG को default के रूप में देना भी कुछ खास सुरक्षित नहीं लगता। 2024 में TLSv1.0 या blowfish को default में अनुमति देने जैसा महसूस होता है।