How Do We Know Our Prngs Are Working Properly? Felix Dorre¨ and Vladimir Klebanov

How Do We Know Our Prngs Are Working Properly? Felix Dorre¨ and Vladimir Klebanov

How Do We Know Our PRNGs Are Working Properly? Felix Dorre¨ and Vladimir Klebanov Work supported by Karlsruhe Institute of Technology and the DFG priority program “Reliably Secure Software Systems” 33C3 https://wiki.debian.org/SSLkeys – BIND9 – cyrus imapd, uw-imapd, courier – OpenSSH (server, user keys) – apache2 (ssl certs) – OpenVPN, Openswan, – cfengine, puppet StrongSWAN, tinc – xrdp – DNSSEC – gitosis – X.509 – Kerberos (Heimdal) – pwsafe – encfs – vsftpd, proftpd, ftpd-ssl – Tor – telnetd-ssl – postfix, exim4, sendmail – DomainKeys, DKIM How Do We Know Our PRNGs Are Working Properly? 33C3 Services Affected by the Debian OpenSSL Disaster (2006–2008) – BIND9 – cyrus imapd, uw-imapd, courier – OpenSSH (server, user keys) – apache2 (ssl certs) – OpenVPN, Openswan, – cfengine, puppet StrongSWAN, tinc – xrdp – DNSSEC – gitosis – X.509 – Kerberos (Heimdal) – pwsafe – encfs – vsftpd, proftpd, ftpd-ssl – Tor – telnetd-ssl – postfix, exim4, sendmail – DomainKeys, DKIM https://wiki.debian.org/SSLkeys How Do We Know Our PRNGs Are Working Properly? 33C3 The “Technical” Consequence /* DO NOT REMOVE THE FOLLOWING CALL TO MD_Update()! */ if (!MD_Update(m, buf, j)) goto err; /* * We know that line may cause programs such as purify and valgrind * to complain about use of uninitialized data. The problem is not, * it's with the caller. Removing that line will make sure you get * really bad randomness and thereby other problems such as very * insecure keys. */ How Do We Know Our PRNGs Are Working Properly? 33C3 // HASHBYTES_TO_USE defines # of bytes returned by "computeHash(byte[])" // to use to form byte array returning by the "nextBytes(byte[])" method // Note, that this implementation uses more bytes than it is defined // in the above specification. A Tour of Implementations How Do We Know Our PRNGs Are Working Properly? 33C3 A Tour of Implementations // HASHBYTES_TO_USE defines # of bytes returned by "computeHash(byte[])" // to use to form byte array returning by the "nextBytes(byte[])" method // Note, that this implementation uses more bytes than it is defined // in the above specification. How Do We Know Our PRNGs Are Working Properly? 33C3 /* Take some ”random” data and make more ”random-looking” data from it */ /* Stupid C trick */ /* This fails silently and must be fixed. */ Be very careful when using this function to ensure that you do not produce a poor output state. (end-user documentation) A Tour of Implementations /* Put the data into the entropy, add some data from the unknown state, reseed */ How Do We Know Our PRNGs Are Working Properly? 33C3 /* Stupid C trick */ /* This fails silently and must be fixed. */ Be very careful when using this function to ensure that you do not produce a poor output state. (end-user documentation) A Tour of Implementations /* Put the data into the entropy, add some data from the unknown state, reseed */ /* Take some ”random” data and make more ”random-looking” data from it */ How Do We Know Our PRNGs Are Working Properly? 33C3 /* This fails silently and must be fixed. */ Be very careful when using this function to ensure that you do not produce a poor output state. (end-user documentation) A Tour of Implementations /* Put the data into the entropy, add some data from the unknown state, reseed */ /* Take some ”random” data and make more ”random-looking” data from it */ /* Stupid C trick */ How Do We Know Our PRNGs Are Working Properly? 33C3 Be very careful when using this function to ensure that you do not produce a poor output state. (end-user documentation) A Tour of Implementations /* Put the data into the entropy, add some data from the unknown state, reseed */ /* Take some ”random” data and make more ”random-looking” data from it */ /* Stupid C trick */ /* This fails silently and must be fixed. */ How Do We Know Our PRNGs Are Working Properly? 33C3 A Tour of Implementations /* Put the data into the entropy, add some data from the unknown state, reseed */ /* Take some ”random” data and make more ”random-looking” data from it */ /* Stupid C trick */ /* This fails silently and must be fixed. */ Be very careful when using this function to ensure that you do not produce a poor output state. (end-user documentation) How Do We Know Our PRNGs Are Working Properly? 33C3 A Tour of Implementations /* Put the data into the entropy, add some data from the unknown state, reseed */ /* Take some ”random” data and make more ”random-looking” data from it */ /* Stupid C trick */ /* This fails silently andMind must the be supply fixed. chain! */ Be very careful when using this function to ensure that you do not produce a poor output state. (end-user documentation) How Do We Know Our PRNGs Are Working Properly? 33C3 A Tour of Implementations |........blocks*20byte........|20byte|..44byte..| <..44byte..> <20byte> | | | +------+ +---------------------------|----------+ v v |........blocks*20byte........|20byte|..44byte..| <.....64bytes.....> | +----------------------------------+ Hash v |.............................|20byte|..44byte..| <20byte><20byte><..44byte..> | | | +---------------------+ +-----------------------------+ | v v |.............................|20byte|..44byte..| <.....64byte......> | +-------------------------+ Hash v |.............................|20byte|..44byte..| <20byte><20byte><..44byte..> How Do We Know Our PRNGs Are Working Properly? 33C3 A Tour of Implementations |........blocks*20byte........|20byte|..44byte..| <..44byte..> <20byte> | | | +------+ +---------------------------|----------+ v v |........blocks*20byte........|20byte|..44byte..| <.....64bytes.....> | +----------------------------------+ Hash v |.............................|20byte|..44byte..| <20byte><20byte><..44byte..> | | Have a (better) design document! | +---------------------+ +-----------------------------+ | v v |.............................|20byte|..44byte..| <.....64byte......> | +-------------------------+ Hash v |.............................|20byte|..44byte..| <20byte><20byte><..44byte..> How Do We Know Our PRNGs Are Working Properly? 33C3 Quality Assurance Measures for PRNGs How Do We Know Our PRNGs Are Working Properly? 33C3 – Unit-level tests and functional verification Quality Assurance Measures for PRNGs – System-level tests and functional verification How Do We Know Our PRNGs Are Working Properly? 33C3 Quality Assurance Measures for PRNGs – System-level tests and functional verification – Unit-level tests and functional verification How Do We Know Our PRNGs Are Working Properly? 33C3 – Regression tests (in particular NIST SP 800-90) Quality Assurance Measures for PRNGs – Statistical tests (DIEHARD, NIST SP800-22, etc.) How Do We Know Our PRNGs Are Working Properly? 33C3 Quality Assurance Measures for PRNGs – Statistical tests (DIEHARD, NIST SP800-22, etc.) – Regression tests (in particular NIST SP 800-90) How Do We Know Our PRNGs Are Working Properly? 33C3 Quality Assurance Measures for PRNGs – Manual code review How Do We Know Our PRNGs Are Working Properly? 33C3 Our Contribution – Identification of a common PRNG defect: entropy loss – Entroposcope – a static analysis tool for detecting entropy loss in real C and Java PRNGs How Do We Know Our PRNGs Are Working Properly? 33C3 seed m ix out PRNG Operation Cycle (Simplified) How Do We Know Our PRNGs Are Working Properly? 33C3 m ix out PRNG Operation Cycle (Simplified) seed How Do We Know Our PRNGs Are Working Properly? 33C3 out PRNG Operation Cycle (Simplified) seed m ix How Do We Know Our PRNGs Are Working Properly? 33C3 PRNG Operation Cycle (Simplified) seed m ix out How Do We Know Our PRNGs Are Working Properly? 33C3 PRNG Operation Cycle (Simplified) seed m ix out We treat a PRNG as a function g∶ {0, 1}m → {0, 1}n How Do We Know Our PRNGs Are Working Properly? 33C3 PRNG Operation Cycle (Simplified) Out of Scope: Bad Seeds – insufficient range (a priori) – skewed distribution – known to attacker seed m ix out How Do We Know Our PRNGs Are Working Properly? 33C3 PRNG Operation Cycle (Simplified) Out of Scope: Bad Seeds – insufficient range (a priori) – skewed distribution – known to attacker seed m ix Out of Scope: out One-Way Functions. – absent or insufficient – not one-way (e.g., Dual EC DRBG) How Do We Know Our PRNGs Are Working Properly? 33C3 PRNG Operation Cycle (Simplified) Out of Scope: Bad Seeds – insufficient range (a priori) – skewed distribution – known to attacker seed m ix Out of Scope: Out of Scope: Very out One-Way Functions. Powerful Attackers. – absent or insufficient – inspecting/corrupting – not one-way (e.g., PRNG state Dual EC DRBG) How Do We Know Our PRNGs Are Working Properly? 33C3 Formally A PRNG g∶ {0, 1}m → {0, 1}n suffers from entropy loss iff ∃seed 1, seed 2. seed 1 =~ seed 2 ∧ g(seed 1) = g(seed 2) . Reasoning complicated by use of crypto functions inside g. Entropy Loss The following are equivalent – PRNG suffers from entropy loss – Part of seed does not influence output – Two seeds produce the same output – Fewer possible outputs than seeds – g is not injective How Do We Know Our PRNGs Are Working Properly? 33C3 Reasoning complicated by use of crypto functions inside g. Entropy Loss The following are equivalent – PRNG suffers from entropy loss – Part of seed does not influence output – Two seeds produce the same output – Fewer possible outputs than seeds – g is not injective Formally A PRNG g∶ {0, 1}m → {0, 1}n suffers from entropy loss iff ∃seed 1, seed 2. seed 1 =~ seed 2 ∧ g(seed 1) = g(seed 2) . How Do We Know Our PRNGs Are Working Properly? 33C3 Entropy Loss The following are equivalent – PRNG suffers from entropy loss – Part of seed does

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    71 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us