SlideShare a Scribd company logo
Much Ado About Randomness Aleksandr Yampolskiy, Ph.D.
Randomness Random number generation is easy to get wrong.
In Theory Cryptography is based on  random numbers : Secret keys must be random Random bits are needed for public-key encryption, signatures, SSL, etc. A common assumption in theory is a  random oracle model , where all parties have   access to a   perfect random source  [BR92]. Under this assumption, many crypto tools can be proven  formally secure .
In Practice Kaminsky bug used to  poison DNS  caches. Debian OpenSSL versions <0.9.8g-9 generated  weak SSL keys . Some  Majordomo  versions were susceptible to subscribing victim to thousands of mailing lists. Kerberos 4   secret keys could be guessed in a few seconds . Netscape 1.1  generated  SSL keys  using time and process ID as seed; easily guessable and breakable.
Example #1 -  unsigned char  magic_cookie[LEN];  -  srand ( time (NULL));  - for ( int  i=0; i<LEN; i++) magic_cookie[i] =  rand()  & 0xFF; X Windows “magic cookie” used a weak LCG generator and was guessable in X11R6.
Example #2 protected void  doStart() { //…     _random= new  java.util.Random(); _random.setSeed(_random.nextLong()^System.currentTimeMillis()^hashCode()^Runtime.getRuntime().freeMemory());   _sessions =  new  MultiMap(); //... } Jetty 4.2.26 used java.util.Random to generate predictable session ID which could be brute-forced.
Example #3 global variable seed;  function  RNG_CreateContext ()  ( seconds ,  microseconds ) = time of day;  pid  = process ID;  ppid  = parent process ID;  a =  mklcpr ( microseconds );  b =  mklcpr ( pid  +  seconds  + ( ppid  << 12));  seed =  MD5 (a, b);  function  mklcpr (x) // simple scrambler return ((0xDEECE66D * x + 0x2BBB62DC) >> 1); function  MD5 (x) // secure hash function In 1996, two UC Berkeley students reverse-engineered Netscape 1.1 and found… bad! In 1996, two UC Berkeley students reverse exploit Netscape 1.1
Lessons Learnt Numbers , used to derive session IDs and keys,  weren’t truly random ! Seeds must be unpredictable 128 bit sequences are sufficient All possibilities equally likely Best seeds are truly random PRG  (pseudorandom number generator)  must be secure No detectable pattern Even if attacker guesses some pseudorandom bits, no correlation to other bits.
Two Types of Randomness Truly random  number generator Radioactive decay. Disk timing. Fair coin flip. Randomness inherent in PC disk IO, thread scheduling, etc.. Pseudo-random  number generator (aka computational) Generate a small “truly random” seed. Stretch into a larger pseudo-random sequence. Fact:  In practice, we use pseudo-random number generators.
What is (Pseudo)-Random? PRG random seed pseudorandom string impossible  w.r.t. computationally  unbounded  observer possible  w.r.t. computationally  bounded  observer if the PRG is “hard to invert” relative to the observer 01010111001… 1001
What is (Pseudo)-Random? (cont.) PRG random seed pseudorandom string random string   look   indistinguishable to any  efficient observer Definition   [Blum-Micali-Yao]:  PRG is a polytime function whose output is  indistinguishable from random by any  efficient  observer 01010111001… 11010011010… 1001
Attacking Weak PRGs Find programs with weak PRG  Break-in  Guess the initial  seed of a PRG Guess the state  of a PRG
Finding programs with weak PRG If  source code  is available , grep for weak API  calls. If  only a binary  is available, reverse engineer the program or  grep for weak system calls . For  client programs ,  use Stompy or Ent  to analyze output’s randomness quality. For  web-based programs, use BurpSuite or WebScarab  proxy to analyze session ID randomness. Google Hacking  for weak session IDs.
Finding programs with weak PRG (cont.) High-entropy session ID generators use things like: java.security.SecureRandom (Java) System.Security.Cryptography.RNGCryptoServiceProvider (.NET) /dev/urandom, /dev/(s)random (if the latter, look for exhaustion attacks!) OpenSSL’s RAND bytes hardware security module.  It’s pretty easy to quickly identify weak, low-entropy session ID generation in the code. They use the  time and date a random  static string  in the source code the  output of C library rand, the output of java.util.Random small  (32 bits or less) numbers a cryptographic hash (like MD5) of anything low in entropy to generate their session IDs.
Know Weak API The weak API generally use insecure constructions such as  LCG, LSFR, Mersenne twister , etc. The strong API may use  DES, SHA-1 based PRNG, Blum-Blum-Shub , etc.
Reverse Engineering The Binaries Many Java programs mistakenly use  java.util.Random  to generate session IDs instead of  java.security.SecureRandom root# javap -c BadRandom | grep Random Compiled from &quot;BadRandom.java&quot; public class BadRandom extends java.lang.Object{ public BadRandom(); 0: new #2; //class java/util/Random 4: invokespecial #3; //Method java/util/Random.&quot;<init>&quot;:()V 24: invokevirtual #9; //Method java/util/Random.nextInt:()I
Reverse Engineering the Binaries Similarly, C/C++ programs use  rand() or random()  instead of reading from  /dev/random .  Note /dev/random blocks and /dev/urandom doesn’t but may produce randomness of worse quality. root# strings bad_random __gmon_start libc.so.6 _IO_stdin_used srand time printf … root# nm bad_random | grep rand          U rand@@GLIBC_2.0          U srand@@GLIBC_2.0
Analyzing the Output Without Binaries Compute entropy of the stream Count number of characters in each position FIPS 140-2  statistical PRNG tests Monobit test : Are there as many 1’s as 0’s? Runs test : Are the number of runs (sequences of only 0’s or 1’s) as expected for random numbers? Maurer’s test : Can the sequence be compressed? Next-bit test : given m bits of the sequence, predict (m+1) st  bit Just compress the data using WinRAR
java.util.Random Random&quot; points plotted on acube using the infamousRANDU algorithm. The  java.util.Random  PRG is really a linear congruential generator (LCG) where  x (n+1)  = ax n  + b (mod m)  for large constants a, b and moduli n,m synchronized protected int next(int bits) { seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);  return (int)(seed >>> (48 - bits)); }
java.security. SecureRandom class SpinStop extends Throwable { SpinStop() {} } class SpinSlave extends Thread { long millis; Thread parent; SpinSlave(long millis, Thread parent) { this.millis= millis; this.parent= parent; } public void run() { try {  Thread.sleep(millis); parent.stop(new SpinStop()); stop(); } catch (InterruptedException ex) { parent.stop(ex); } } } class SpinMaster extends Thread { long millis; long counter; SpinMaster(long millis) { this.millis= millis; this.counter= 0; } public void run() { try { Thread t= new SpinSlave(millis, this); t.start(); while (true) { counter ++; Thread.yield(); } } catch (SpinStop s) { } } } public class Spinner { public static long spin(long millis) throws InterruptedException { SpinMaster t= new SpinMaster(millis); t.start(); t.join(); return t.counter; } } SHA1PRNG + Thread Scheduling
Entropy of java.util.Random In practice things aren’t that bad. For  20,000 samples , the entropy of java.util.Random and java.security.SecureRandom streams is almost identical. For both,  14.2877123795 bits of entropy . They also pass all FIPS 140-2 tests. For  200,000 samples , java.security.SecureRandom has slightly more entropy than java.util.Random, but is it significant? For  java.util.Random , we get  17.6095804744 bits of entropy For  java.security.SecureRandom , we get  17.6096204744 bits of entropy
Is java.security.SecureRandom that much worse than java.util.Random? Folklore says that it is. But it really depends on OS: OpenSolaris (SunOS 5.11) : 67.9 slower   Windows XP, 64.5 times slower   Windows 7, 24.5 times slower   MAC OS X, Leopard: 25.1 times slower  
Hacking Java bytecode to use SecureRandom Java.security.SecureRandom inherits from java.util.Random and has all its methods ASM bytecode manipulation framework:  http://asm.ow2.org/   Replace Random with SecureRandom in the bytecode public class ChangeMethodCallAdapter extends MethodAdapter {    @Override    public void visitMethodInsn(int opcode, String owner, String name, String desc) {      System.out.println(&quot;ChangeMethodCallAdapter(): opcode=&quot; + opcode + &quot;,owner=&quot; + owner + &quot;,name=&quot; + name + &quot;,desc=&quot; + desc);      if (&quot;java/util/Random&quot;.equals(owner)) {          mv.visitMethodInsn(opcode, &quot;java/security/SecureRandom&quot;, name, desc);      } else {          mv.visitMethodInsn(opcode, owner, name, desc);      }    } gilt-ml-ayampolskiy:ClassTransformer ayampolskiy$ javap -c API | grep Random     8: new #5; //class java/util/Random     12: invokespecial #6; //Method java/util/Random.&quot;<init>&quot;:()V     27: invokevirtual #7; //Method java/util/Random.nextInt:(I)I gilt-ml-ayampolskiy:new ayampolskiy$ javap -c API | grep Random     8: new #28; //class java/util/Random     12: invokespecial #31; //Method java/security/SecureRandom.&quot;<init>&quot;:()V     27: invokevirtual #35; //Method java/security/SecureRandom.nextInt:(I )I
Google Hacking Know the common session cookie names (SESSIONID,JSESSIONID,PHPSESSID,PHPSESSIONID, etc.) Google for the cookie names:  inurl:&quot;?sessionid=” Even better, try googling session IDs with non-random sequences “66”, “128”:  inurl:”?sessionid=128” How about “ lang:java java.util.Random session”
Testing Randomness of Client Programs Fourmilab’s entropy tests: http://www.fourmilab.ch/random/ Stompy (session stomper): http://lcamtuf.coredump.cx/stompy.tgz  . Seems to be too “optimistic”
“ We could not arrest or charge this suspect because technically, no offence was being committed as there was no legislation in place to say that the act being committed was criminal. So, we had to let him go,” said Sergeant Jemesa Lave of the Fiji Police Cyber Crime Unit.
Amazon.com experiment Amazon.com uses a  session-id , a 17-digit random number- is a persistent cookie that expires after 7 days. It is set the first time you reach Amazon. Its value does not change after you log in, nor when you switch users. 
Testing Randomness of Web-Based Programs Several nice  GUI tools to analyze session IDs  for common problems (  WebScarab, BurpSuite , SPI Cookie Cruncher,Foundstone CookieDigger, etc) Test alphabet distribution, average bits changed, FIPS tests, etc.
WebScarab – Predictable Cookies Entropy is a measure of uncertainty regarding a discrete random variable. For many purposes, the Shannon entropy is the only measure needed. Shannon entropy is defined byShannon (4.1) has the unit  bits. Not amazon.com
WebScarab – amazon.com
Burpsuite - amazon.com
BurpSuite – amazon.com Typical amazon.com session-id  18 0-3029497-6907862
BurpSuite – amazon.com
Conclusion Use good seeds and strong PRNGs. Know what the strong API for generating secure random numbers are (SecureRandom, /dev/random) Try out Stompy, Ent, WebScarab, BurpSuite. Happy hacking!
Questions, Comments?
References “ Brute-force exploitation of web application session IDs” [Endler ‘01] “ Hold your sessions: an attack on Java session-id generation” [GM ’05]

More Related Content

PPT
OWASP Much ado about randomness
PPTX
Alexey Sintsov- SDLC - try me to implement
PPTX
Eloi Sanfelix - Hardware security: Side Channel Attacks [RootedCON 2011]
PPTX
OWASP Poland Day 2018 - Pedro Fortuna - Are your Java Script based protection...
PDF
Threat stack aws
PPTX
Эксплуатируем неэксплуатируемые уязвимости SAP
PPTX
Do WAFs dream of static analyzers
KEY
groovy & grails - lecture 7
OWASP Much ado about randomness
Alexey Sintsov- SDLC - try me to implement
Eloi Sanfelix - Hardware security: Side Channel Attacks [RootedCON 2011]
OWASP Poland Day 2018 - Pedro Fortuna - Are your Java Script based protection...
Threat stack aws
Эксплуатируем неэксплуатируемые уязвимости SAP
Do WAFs dream of static analyzers
groovy & grails - lecture 7

What's hot (20)

PDF
The Anatomy of an Exploit (NDC TechTown 2019))
PPTX
1300 david oswald id and ip theft with side-channel attacks
PDF
The Anatomy of an Exploit (NDC TechTown 2019)
PPTX
SAST and Application Security: how to fight vulnerabilities in the code
PDF
[PH-Neutral 0x7db] Exploit Next Generation®
PDF
Exploitation and State Machines
PDF
Defcon 22-colby-moore-patrick-wardle-synack-drop cam
PDF
Offensive cyber security: Smashing the stack with Python
PDF
Embedded device hacking Session i
PDF
Applications secure by default
PPTX
Современные технологии и инструменты анализа вредоносного ПО_PHDays_2017_Pisk...
PDF
Chromium Sandbox on Linux (NDC Security 2019)
PPTX
Shooting the troubles: Crashes, Slowdowns, CPU Spikes
PDF
Codetainer: a Docker-based browser code 'sandbox'
PDF
Malware Analysis on a Shoestring Budget
PDF
Classic Vulnerabilities (ACCU Keynote 2022)
PDF
System Hacking Tutorial #1 - Introduction to Vulnerability and Type of Vulner...
PDF
Source Boston 2009 - Anti-Debugging A Developers Viewpoint
PPTX
Cisco IOS shellcode: All-in-one
The Anatomy of an Exploit (NDC TechTown 2019))
1300 david oswald id and ip theft with side-channel attacks
The Anatomy of an Exploit (NDC TechTown 2019)
SAST and Application Security: how to fight vulnerabilities in the code
[PH-Neutral 0x7db] Exploit Next Generation®
Exploitation and State Machines
Defcon 22-colby-moore-patrick-wardle-synack-drop cam
Offensive cyber security: Smashing the stack with Python
Embedded device hacking Session i
Applications secure by default
Современные технологии и инструменты анализа вредоносного ПО_PHDays_2017_Pisk...
Chromium Sandbox on Linux (NDC Security 2019)
Shooting the troubles: Crashes, Slowdowns, CPU Spikes
Codetainer: a Docker-based browser code 'sandbox'
Malware Analysis on a Shoestring Budget
Classic Vulnerabilities (ACCU Keynote 2022)
System Hacking Tutorial #1 - Introduction to Vulnerability and Type of Vulner...
Source Boston 2009 - Anti-Debugging A Developers Viewpoint
Cisco IOS shellcode: All-in-one
Ad

Similar to Much ado about randomness. What is really a random number? (20)

PPTX
Secure coding for developers
PPTX
Cracking Pseudorandom Sequences Generators in Java Applications
PDF
J45015460
PPTX
Java/Scala Lab 2016. Владимир Гарбуз: Написание безопасного кода на Java.
PDF
40120140502003
PDF
Sullivan randomness-infiltrate 2014
PDF
What is pseudo random number
PPTX
Amanda Sopkin - Computational Randomness: Creating Chaos in an Ordered Machin...
PDF
l_08png.pdf
PPTX
Information and data security pseudorandom number generation and stream cipher
PPTX
Information and network security 30 random numbers
PDF
Python Programming - IX. On Randomness
PPTX
Cargo Cult Security UJUG Sep2015
PDF
When Crypto Attacks! (Yahoo 2009)
PPT
Cryptography and SSL in Smalltalk - StS 2003
PDF
Encryption Deep Dive
PPT
Lecture06-Random-Number-Genedawrators.ppt
PDF
Filippo, Plain simple reality of entropy
PDF
Encryption Boot Camp at JavaZone 2010
PPTX
«Applied cryptanalysis stream ciphers» by Vladimir Garbuz
Secure coding for developers
Cracking Pseudorandom Sequences Generators in Java Applications
J45015460
Java/Scala Lab 2016. Владимир Гарбуз: Написание безопасного кода на Java.
40120140502003
Sullivan randomness-infiltrate 2014
What is pseudo random number
Amanda Sopkin - Computational Randomness: Creating Chaos in an Ordered Machin...
l_08png.pdf
Information and data security pseudorandom number generation and stream cipher
Information and network security 30 random numbers
Python Programming - IX. On Randomness
Cargo Cult Security UJUG Sep2015
When Crypto Attacks! (Yahoo 2009)
Cryptography and SSL in Smalltalk - StS 2003
Encryption Deep Dive
Lecture06-Random-Number-Genedawrators.ppt
Filippo, Plain simple reality of entropy
Encryption Boot Camp at JavaZone 2010
«Applied cryptanalysis stream ciphers» by Vladimir Garbuz
Ad

More from Aleksandr Yampolskiy (20)

PPT
New York REDIS Meetup Welcome Session
PDF
"Managing software development" by Peter Bell
PPT
Recruiting Great Engineers in Six Easy Steps
PPTX
You Too Can Be a Radio Host Or How We Scaled a .NET Startup And Had Fun Doing It
PPT
Malware Goes to the Movies - Briefing
PPT
Privacy and E-Commerce
PPT
Eight simple rules to writing secure PHP programs
PPT
Social media security challenges
PPTX
Social Engineering and What to do About it
PPT
Malware goes to the movies
PDF
Inoculation strategies for victims of viruses
PDF
Number theory lecture (part 1)
PDF
Number theory lecture (part 2)
PPT
Threshold and Proactive Pseudo-Random Permutations
PPT
Secure information aggregation in sensor networks
PPT
A verifiable random function with short proofs and keys
PPT
Towards a theory of data entangelement
PPT
Price of anarchy is independent of network topology
PPT
Business Case Studies
PPT
Spreading Rumors Quietly and the Subgroup Escape Problem
New York REDIS Meetup Welcome Session
"Managing software development" by Peter Bell
Recruiting Great Engineers in Six Easy Steps
You Too Can Be a Radio Host Or How We Scaled a .NET Startup And Had Fun Doing It
Malware Goes to the Movies - Briefing
Privacy and E-Commerce
Eight simple rules to writing secure PHP programs
Social media security challenges
Social Engineering and What to do About it
Malware goes to the movies
Inoculation strategies for victims of viruses
Number theory lecture (part 1)
Number theory lecture (part 2)
Threshold and Proactive Pseudo-Random Permutations
Secure information aggregation in sensor networks
A verifiable random function with short proofs and keys
Towards a theory of data entangelement
Price of anarchy is independent of network topology
Business Case Studies
Spreading Rumors Quietly and the Subgroup Escape Problem

Recently uploaded (20)

PPTX
1. Introduction to Computer Programming.pptx
PDF
Machine learning based COVID-19 study performance prediction
PPTX
TLE Review Electricity (Electricity).pptx
PPTX
OMC Textile Division Presentation 2021.pptx
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPTX
SOPHOS-XG Firewall Administrator PPT.pptx
PPTX
cloud_computing_Infrastucture_as_cloud_p
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PPTX
Tartificialntelligence_presentation.pptx
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
1. Introduction to Computer Programming.pptx
Machine learning based COVID-19 study performance prediction
TLE Review Electricity (Electricity).pptx
OMC Textile Division Presentation 2021.pptx
Reach Out and Touch Someone: Haptics and Empathic Computing
SOPHOS-XG Firewall Administrator PPT.pptx
cloud_computing_Infrastucture_as_cloud_p
Group 1 Presentation -Planning and Decision Making .pptx
Spectral efficient network and resource selection model in 5G networks
Per capita expenditure prediction using model stacking based on satellite ima...
Advanced methodologies resolving dimensionality complications for autism neur...
Agricultural_Statistics_at_a_Glance_2022_0.pdf
NewMind AI Weekly Chronicles - August'25-Week II
Building Integrated photovoltaic BIPV_UPV.pdf
Encapsulation_ Review paper, used for researhc scholars
Mobile App Security Testing_ A Comprehensive Guide.pdf
gpt5_lecture_notes_comprehensive_20250812015547.pdf
Tartificialntelligence_presentation.pptx
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Digital-Transformation-Roadmap-for-Companies.pptx

Much ado about randomness. What is really a random number?

  • 1. Much Ado About Randomness Aleksandr Yampolskiy, Ph.D.
  • 2. Randomness Random number generation is easy to get wrong.
  • 3. In Theory Cryptography is based on random numbers : Secret keys must be random Random bits are needed for public-key encryption, signatures, SSL, etc. A common assumption in theory is a random oracle model , where all parties have access to a perfect random source [BR92]. Under this assumption, many crypto tools can be proven formally secure .
  • 4. In Practice Kaminsky bug used to poison DNS caches. Debian OpenSSL versions <0.9.8g-9 generated weak SSL keys . Some Majordomo versions were susceptible to subscribing victim to thousands of mailing lists. Kerberos 4 secret keys could be guessed in a few seconds . Netscape 1.1 generated SSL keys using time and process ID as seed; easily guessable and breakable.
  • 5. Example #1 - unsigned char magic_cookie[LEN]; - srand ( time (NULL)); - for ( int i=0; i<LEN; i++) magic_cookie[i] = rand() & 0xFF; X Windows “magic cookie” used a weak LCG generator and was guessable in X11R6.
  • 6. Example #2 protected void doStart() { //…     _random= new java.util.Random(); _random.setSeed(_random.nextLong()^System.currentTimeMillis()^hashCode()^Runtime.getRuntime().freeMemory()); _sessions = new MultiMap(); //... } Jetty 4.2.26 used java.util.Random to generate predictable session ID which could be brute-forced.
  • 7. Example #3 global variable seed; function RNG_CreateContext () ( seconds , microseconds ) = time of day; pid = process ID; ppid = parent process ID; a = mklcpr ( microseconds ); b = mklcpr ( pid + seconds + ( ppid << 12)); seed = MD5 (a, b); function mklcpr (x) // simple scrambler return ((0xDEECE66D * x + 0x2BBB62DC) >> 1); function MD5 (x) // secure hash function In 1996, two UC Berkeley students reverse-engineered Netscape 1.1 and found… bad! In 1996, two UC Berkeley students reverse exploit Netscape 1.1
  • 8. Lessons Learnt Numbers , used to derive session IDs and keys, weren’t truly random ! Seeds must be unpredictable 128 bit sequences are sufficient All possibilities equally likely Best seeds are truly random PRG (pseudorandom number generator) must be secure No detectable pattern Even if attacker guesses some pseudorandom bits, no correlation to other bits.
  • 9. Two Types of Randomness Truly random number generator Radioactive decay. Disk timing. Fair coin flip. Randomness inherent in PC disk IO, thread scheduling, etc.. Pseudo-random number generator (aka computational) Generate a small “truly random” seed. Stretch into a larger pseudo-random sequence. Fact: In practice, we use pseudo-random number generators.
  • 10. What is (Pseudo)-Random? PRG random seed pseudorandom string impossible w.r.t. computationally unbounded observer possible w.r.t. computationally bounded observer if the PRG is “hard to invert” relative to the observer 01010111001… 1001
  • 11. What is (Pseudo)-Random? (cont.) PRG random seed pseudorandom string random string look indistinguishable to any efficient observer Definition [Blum-Micali-Yao]: PRG is a polytime function whose output is indistinguishable from random by any efficient observer 01010111001… 11010011010… 1001
  • 12. Attacking Weak PRGs Find programs with weak PRG Break-in Guess the initial seed of a PRG Guess the state of a PRG
  • 13. Finding programs with weak PRG If source code is available , grep for weak API calls. If only a binary is available, reverse engineer the program or grep for weak system calls . For client programs , use Stompy or Ent to analyze output’s randomness quality. For web-based programs, use BurpSuite or WebScarab proxy to analyze session ID randomness. Google Hacking for weak session IDs.
  • 14. Finding programs with weak PRG (cont.) High-entropy session ID generators use things like: java.security.SecureRandom (Java) System.Security.Cryptography.RNGCryptoServiceProvider (.NET) /dev/urandom, /dev/(s)random (if the latter, look for exhaustion attacks!) OpenSSL’s RAND bytes hardware security module. It’s pretty easy to quickly identify weak, low-entropy session ID generation in the code. They use the time and date a random static string in the source code the output of C library rand, the output of java.util.Random small (32 bits or less) numbers a cryptographic hash (like MD5) of anything low in entropy to generate their session IDs.
  • 15. Know Weak API The weak API generally use insecure constructions such as LCG, LSFR, Mersenne twister , etc. The strong API may use DES, SHA-1 based PRNG, Blum-Blum-Shub , etc.
  • 16. Reverse Engineering The Binaries Many Java programs mistakenly use java.util.Random to generate session IDs instead of java.security.SecureRandom root# javap -c BadRandom | grep Random Compiled from &quot;BadRandom.java&quot; public class BadRandom extends java.lang.Object{ public BadRandom(); 0: new #2; //class java/util/Random 4: invokespecial #3; //Method java/util/Random.&quot;<init>&quot;:()V 24: invokevirtual #9; //Method java/util/Random.nextInt:()I
  • 17. Reverse Engineering the Binaries Similarly, C/C++ programs use rand() or random() instead of reading from /dev/random . Note /dev/random blocks and /dev/urandom doesn’t but may produce randomness of worse quality. root# strings bad_random __gmon_start libc.so.6 _IO_stdin_used srand time printf … root# nm bad_random | grep rand         U rand@@GLIBC_2.0         U srand@@GLIBC_2.0
  • 18. Analyzing the Output Without Binaries Compute entropy of the stream Count number of characters in each position FIPS 140-2 statistical PRNG tests Monobit test : Are there as many 1’s as 0’s? Runs test : Are the number of runs (sequences of only 0’s or 1’s) as expected for random numbers? Maurer’s test : Can the sequence be compressed? Next-bit test : given m bits of the sequence, predict (m+1) st bit Just compress the data using WinRAR
  • 19. java.util.Random Random&quot; points plotted on acube using the infamousRANDU algorithm. The java.util.Random PRG is really a linear congruential generator (LCG) where x (n+1) = ax n + b (mod m) for large constants a, b and moduli n,m synchronized protected int next(int bits) { seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1); return (int)(seed >>> (48 - bits)); }
  • 20. java.security. SecureRandom class SpinStop extends Throwable { SpinStop() {} } class SpinSlave extends Thread { long millis; Thread parent; SpinSlave(long millis, Thread parent) { this.millis= millis; this.parent= parent; } public void run() { try { Thread.sleep(millis); parent.stop(new SpinStop()); stop(); } catch (InterruptedException ex) { parent.stop(ex); } } } class SpinMaster extends Thread { long millis; long counter; SpinMaster(long millis) { this.millis= millis; this.counter= 0; } public void run() { try { Thread t= new SpinSlave(millis, this); t.start(); while (true) { counter ++; Thread.yield(); } } catch (SpinStop s) { } } } public class Spinner { public static long spin(long millis) throws InterruptedException { SpinMaster t= new SpinMaster(millis); t.start(); t.join(); return t.counter; } } SHA1PRNG + Thread Scheduling
  • 21. Entropy of java.util.Random In practice things aren’t that bad. For 20,000 samples , the entropy of java.util.Random and java.security.SecureRandom streams is almost identical. For both, 14.2877123795 bits of entropy . They also pass all FIPS 140-2 tests. For 200,000 samples , java.security.SecureRandom has slightly more entropy than java.util.Random, but is it significant? For java.util.Random , we get 17.6095804744 bits of entropy For java.security.SecureRandom , we get 17.6096204744 bits of entropy
  • 22. Is java.security.SecureRandom that much worse than java.util.Random? Folklore says that it is. But it really depends on OS: OpenSolaris (SunOS 5.11) : 67.9 slower  Windows XP, 64.5 times slower  Windows 7, 24.5 times slower  MAC OS X, Leopard: 25.1 times slower 
  • 23. Hacking Java bytecode to use SecureRandom Java.security.SecureRandom inherits from java.util.Random and has all its methods ASM bytecode manipulation framework: http://asm.ow2.org/ Replace Random with SecureRandom in the bytecode public class ChangeMethodCallAdapter extends MethodAdapter {    @Override    public void visitMethodInsn(int opcode, String owner, String name, String desc) {      System.out.println(&quot;ChangeMethodCallAdapter(): opcode=&quot; + opcode + &quot;,owner=&quot; + owner + &quot;,name=&quot; + name + &quot;,desc=&quot; + desc);      if (&quot;java/util/Random&quot;.equals(owner)) {          mv.visitMethodInsn(opcode, &quot;java/security/SecureRandom&quot;, name, desc);      } else {          mv.visitMethodInsn(opcode, owner, name, desc);      }    } gilt-ml-ayampolskiy:ClassTransformer ayampolskiy$ javap -c API | grep Random    8: new #5; //class java/util/Random    12: invokespecial #6; //Method java/util/Random.&quot;<init>&quot;:()V    27: invokevirtual #7; //Method java/util/Random.nextInt:(I)I gilt-ml-ayampolskiy:new ayampolskiy$ javap -c API | grep Random    8: new #28; //class java/util/Random    12: invokespecial #31; //Method java/security/SecureRandom.&quot;<init>&quot;:()V    27: invokevirtual #35; //Method java/security/SecureRandom.nextInt:(I )I
  • 24. Google Hacking Know the common session cookie names (SESSIONID,JSESSIONID,PHPSESSID,PHPSESSIONID, etc.) Google for the cookie names: inurl:&quot;?sessionid=” Even better, try googling session IDs with non-random sequences “66”, “128”: inurl:”?sessionid=128” How about “ lang:java java.util.Random session”
  • 25. Testing Randomness of Client Programs Fourmilab’s entropy tests: http://www.fourmilab.ch/random/ Stompy (session stomper): http://lcamtuf.coredump.cx/stompy.tgz . Seems to be too “optimistic”
  • 26. “ We could not arrest or charge this suspect because technically, no offence was being committed as there was no legislation in place to say that the act being committed was criminal. So, we had to let him go,” said Sergeant Jemesa Lave of the Fiji Police Cyber Crime Unit.
  • 27. Amazon.com experiment Amazon.com uses a  session-id , a 17-digit random number- is a persistent cookie that expires after 7 days. It is set the first time you reach Amazon. Its value does not change after you log in, nor when you switch users. 
  • 28. Testing Randomness of Web-Based Programs Several nice GUI tools to analyze session IDs for common problems ( WebScarab, BurpSuite , SPI Cookie Cruncher,Foundstone CookieDigger, etc) Test alphabet distribution, average bits changed, FIPS tests, etc.
  • 29. WebScarab – Predictable Cookies Entropy is a measure of uncertainty regarding a discrete random variable. For many purposes, the Shannon entropy is the only measure needed. Shannon entropy is defined byShannon (4.1) has the unit bits. Not amazon.com
  • 32. BurpSuite – amazon.com Typical amazon.com session-id 18 0-3029497-6907862
  • 34. Conclusion Use good seeds and strong PRNGs. Know what the strong API for generating secure random numbers are (SecureRandom, /dev/random) Try out Stompy, Ent, WebScarab, BurpSuite. Happy hacking!
  • 36. References “ Brute-force exploitation of web application session IDs” [Endler ‘01] “ Hold your sessions: an attack on Java session-id generation” [GM ’05]

Editor's Notes

  • #20: http://www.javamex.com/tutorials/random_numbers/lcg_planes.shtml
  • #25: http://www.flickr.com/whitehouse?phpsessid=6ec6733ca8594df4268ef8708a5438c2.