Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CharruaCon - Secure My Random

CharruaCon - Secure My Random

Presentación sobre seguridad en RNGs @ CharruaCon 2017

http://charrua.org/

cphoton

May 11, 2017
Tweet

More Decks by cphoton

Other Decks in Technology

Transcript

  1. Algunas definiciones (cont.) RNG: Random Number Generator PRNG: Pseudo-RNG -

    Algoritmo que produce sucesión de números cuasi-aleatorios • Rápidos • Determinísticos • Periódicos SEMILLA SALIDA
  2. Algunas definiciones (cont.) TRNG: True RNG - Hardware que utiliza

    diferentes eventos físicos para la generación: • Ruido en circuitos electrónicos • Reflección de fotones • Desintegración radioactiva
  3. Algunas definiciones (cont.) CSPRNG: Cryptographically Secure RNG - Subconjunto de

    PRNG, que agrega las siguientes características: • Salida indistinguible de una fuente real de números aleatorios • No es posible predecir la secuencia de bits
  4. Encriptar / Desencriptar información Generación de Contraseñas, Claves Publicas/Privadas, Sal

    Tokens de algún tipo, por ejemplo: autenticación, password reset, CSRF, nonce Generación de UUIDs Casos de uso que requieren CSPRNG
  5. Algunos incidentes CVE-2008-0166: Debian SSLkeys, falla en implementación de RNG

    causó problemas en múltiples servicios: OpenSSH, OpenVPN, DNSSEC, Certificados X.509, Tor, postfix, exim4, apache2, xrdp, etc.
  6. Algunos incidentes Caso de fraude en máquinas de slots en

    casinos debido a incorrecta elección de PRNG Casos de llaves débiles por mal uso de RNG Vulnerabilidad de RNG de Android - Wallets de Bitcoin con claves privadas débiles
  7. Cómo configurar en… Linux (cont.) Cómo aumentar la entropía: rng-tools

    - combina fuentes de HWRNG (TPM, RDRAND, virtio, RasPi SoC) haveged - implementa HArdware Volatile Entropy Gathering and Expansion Usa estado interno de CPU como fuente de entropía Útil para entornos donde no hay hardware disponible (p.ej. VMs) Caveat: Virtualización de la instrucción rdtsc puede disminuir la calidad de la generación
  8. Cómo configurar en… Windows, macOS Windows: MS Crypto API, Cryptographic

    Service Providers. No deshabilitar el servicio “Cryptographic Services”. macOS: /dev/random, Apple Security Framework
  9. Cómo usar en… Java java.security.SecureRandom.getInstance(algorithm, provider); La selección de algoritmos

    y proveedores dependen de la implementación del JRE instalado SecureRandom random = new SecureRandom(); byte bytes[] = new byte[20]; random.nextBytes(bytes);
  10. Cómo usar en… .NET (C#) using System.Security.Cryptography; using(RandomNumberGenerator rng =

    new RNGCryptoServiceProvider()) { byte[] tokenData = new byte[32]; rng.GetBytes(tokenData); string token = Convert.ToBase64String(tokenData); }
  11. Cómo usar en… JavaScript (Node.JS) const crypto = require('crypto'); //

    Asíncrono crypto.randomBytes(256, (err, buf) => { if (err) throw err; // ... }); // Síncrono const buf = crypto.randomBytes(256);
  12. Cómo usar en… JavaScript (browser) Advertencia: No es recomendable realizar

    operaciones que involucren realizar criptografía en el browser
  13. Cómo usar en… JavaScript (browser, cont.) Web Crypto API (beta)

    let buf = new Uint32Array(32); window.crypto.getRandomValues(buf); SJCL - Stanford JavaScript Crypto Library sjcl.random.startCollectors(); const value = sjcl.random.randomWords(256, paranoia);
  14. Recomendaciones No usar Math.random() en situaciones donde CSPRNG es más

    adecuado Usar /dev/urandom (o /dev/random, en algunos casos) Usar los frameworks del lenguaje - no reinventar la rueda
  15. Referencias RFC: Randomness requirements for Security: https://www.ietf.org/rfc/rfc4086.txt HAVEGED: http://security.stackexchange.com/questions/34523/is-it-appropriate-to-use-haveged-as-a-source-of-entropy-on-virtual -machines

    Linux: https://lwn.net/Articles/525459/ Java: https://docs.oracle.com/javase/8/docs/api/index.html?java/security/SecureRandom.html https://www.synopsys.com/blogs/software-security/issues-when-using-java-securerandom/ .NET: https://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider(v=vs.110).aspx Node.JS: https://nodejs.org/api/crypto.html#crypto_crypto_randombytes_size_callback JS Crypto considered harmful: https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2011/august/javascript-cryptography-considere d-harmful/ SJCL: https://github.com/bitwiseshiftleft/sjcl Charlas: How do we know our PRNGs work properly? (33c3): https://www.youtube.com/watch?v=c_CalG1rL0I (QA de PRNGs) Wheel Of Fortune (33c3): https://www.youtube.com/watch?v=brYdF-iks0Q (PRNGs en ambientes embebidos)
  16. Q&A

  17. Bonus Content (slides notes) Entropía: http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.20.1016 Bug en V8: https://v8project.blogspot.com/2015/12/theres-mathrandom-and-then-theres.html

    TRNG Security: http://perso.telecom-paristech.fr/~danger/SETI/TRNG_SETI.pdf http://iopscience.iop.org/article/10.1088/0143-0807/30/5/026/pdf Vulnerabilidades por errores de implementación en RNG: https://github.com/g0tmi1k/debian-ssh https://www.schneier.com/blog/archives/2017/02/predicting_a_sl.htm https://www.schneier.com/blog/archives/2012/02/lousy_random_nu.html https://web.stanford.edu/class/ee380/Abstracts/150513-slides.pdf https://android-developers.googleblog.com/2013/08/some-securerandom-thoughts.html Linux: https://lwn.net/Articles/525459/ http://security.stackexchange.com/questions/34523/is-it-appropriate-to-use-haveged-as-a-source-of-entropy-on-virtual-machines Windows: https://technet.microsoft.com/en-us/library/cc962093.aspx https://developer.apple.com/library/content/documentation/Security/Conceptual/cryptoservices/RandomNumberGenerationAPIs/Rando mNumberGenerationAPIs.html#//apple_ref/doc/uid/TP40011172-CH12-SW2 macOS Sierra: man getentropy https://developer.apple.com/reference/security/1399291-secrandomcopybytes