Revisión de seguridad: ¿es segura esta clase de envoltorio mcrypt de PHP?

4


  

Actualización (6 de febrero de 2015):
  Parece que la clase en cuestión se ha actualizado como respuesta a las respuestas aquí (a través de un problema, ahora cerrado, planteado en github).



Estaba buscando una biblioteca fácil de usar para cifrar archivos en PHP. PHP proporciona funcionalidad de cifrado a través de la biblioteca de mcrypt . Sin embargo, hay muchas opciones de configuración y opciones, suficientes de ellas para cometer muchos errores.

Entonces, en lugar de cometer esos errores, busqué una caída en la clase (licencia de código abierto, sin restricciones de marco) que ya ha descubierto cómo aplicar la funcionalidad de forma segura. Hay muchos ejemplos por ahí, pero parece que no puedo encontrar ningún código que haya sido revisado por cualquier persona con conocimientos previos sobre esto.

El mejor candidato que he encontrado hasta ahora está en github: Pixelfck / SymmetricEncryption
El código parece bastante bien escrito, la clase es bastante compacta y bien comentada, por lo que es al menos una buena señal. Sin embargo, no creo que estemos calificados para juzgar la parte de seguridad.

¿Podría alguien con más antecedentes sobre esto leer el código y ver si hay algún problema?

Actualización de Bounty

Tengo algunas preguntas que espero ver respondidas (no dude en seleccionar la código aparte aún más):


Primero : la clase incluye dos 'implementaciones de la zona de usuario' de funciones criptográficas:

¿Son correctas esas dos implementaciones?


Segundo : algunas cosas "extrañas" que he visto:

  • El paso de 'extracción' de HKDF ha sido reemplazado por el uso de PBKDF2. ¿Es esta una idea aceptada para el uso previsto?
  • El número de rondas utilizadas para PBKDF2 se agrega (sin cifrar) a la salida de los datos cifrados y se usa sin / antes de ser autentificado por el hmac. ¿No es esto un riesgo?
  • PBKDF2 está limitado a un solo 'bloque' solo, ¿no es esto contrario a la forma en que PBKDF2 está diseñado para funcionar?


Tercer : algunas preguntas "menores":

  • ¿Es 2 ^ 12 (= 4096) un número mínimo aceptable de rondas para PBKDF2 cuando se usa de esta manera?
  • ¿Son 128 bits de sal para PBKDF2 realmente 'con margen de seguridad de sobra'?
  • La clave hmac tiene una longitud de 256 bits, ¿es esto suficiente en este caso?


Tal vez me esté preocupando demasiado por esto, pero preferiría no usar una biblioteca de terceros que tenga fallas.

    
pregunta Monika 02.12.2014 - 14:10
fuente

2 respuestas

8

No, esto no es seguro.

  • La verificación HMAC es vulnerable a los ataques de tiempo. Como el autor utiliza una comparación de cadena estándar, la verificación se detiene tan pronto como un carácter del HMAC proporcionado no coincide con el carácter correspondiente del HMAC esperado. De modo que cuanto más largo sea el prefijo común, más tardará la verificación. Al observar cuidadosamente las diferencias de tiempo, un atacante puede reconstruir el HMAC esperado y "forjar" datos arbitrarios. Este es un error conocido .
  • El parámetro de longitud de strlen() y substr() se refiere a caracteres en lugar de bytes en algunas configuraciones de PHP, que romperán las funciones críticas de la biblioteca. Por ejemplo, la popular extensión "mbstring" proporciona implementaciones de strlen() y substr() . En este caso, los bytes múltiples se pueden contar como un único carácter de múltiples bytes.
  • Se sabe que el cifrado junto con la compresión es problemático en ciertos escenarios (vea el ataque de CRIMEN y INCUMPLIMIENTO contra SSL / TLS). Sin embargo, la función de compresión está desactivada de forma predeterminada.
  • La configuración del cifrado es arcana. Por ejemplo, la longitud deseada de la salida PBKDF2 se especifica indirectamente a través de la constante PBKDF2_BLOCK_COUNT , que es el múltiplo mínimo de la salida de la función hash requerida para la longitud objetivo. Esto crea un gran riesgo de errores de los usuarios, especialmente cuando la biblioteca se comercializa como una alternativa fácil a Mcrypt.
  • El autor confunde el tamaño de bloque de AES con sus diferentes tamaños de clave. MCRYPT_RIJNDAEL_128 es no AES-128. Los números de las constantes MCRYPT_RIJNDAEL_* se refieren al tamaño de bloque del algoritmo de Rijndael, mientras que los números de las variantes de AES se refieren a diferentes longitudes de clave . AES es Rijndael con un tamaño de bloque de 128 bits y un tamaño de clave de 128 bits, 192 bits o 256 bits. Entonces, para obtener AES en PHP, usas MCRYPT_RIJNDAEL_128 y una cadena de clave con 16, 24 o 32 bytes. La biblioteca utiliza una clave de 32 bytes por defecto, lo que significa que emplea AES-256, no AES-128.
  • La derivación de la clave parece bastante extraña: tanto la clave de cifrado como la clave HMAC se basan en la misma salida de la función PBKDF2. La única razón por la que son diferentes es porque las cadenas literales "EncryptionKey" y "AuthenticationKey" se mezclan en la llamada HKDF. Esto no está necesariamente mal. De hecho, el RFC admite específicamente un parámetro de entrada adicional. Pero podría ser más seguro y más robusto generar suficiente material clave para ambas aplicaciones y luego dividirlo.

El problema principal, sin embargo, es que la biblioteca depende en gran medida de implementaciones locales cuando debería usar soluciones estándar. Por ejemplo, la combinación de cifrado y autenticación se debe hacer con AES-GCM. La extensión PHP OpenSSL también proporciona una implementación PBKDF2 completa.

    
respondido por el Fleche 05.12.2014 - 04:18
fuente
2

La clase Pixelfck / SymmetricEncryption parece afectar todo lo que buscaría en un sistema de abstracción mcrypt. Está utilizando claves derivadas usando lo que parece ser un algoritmo estándar (PBKDF2), emplea AES128 en modo CFB y usa un hash_hmac de SHA256.

Yo diría que es razonable esperar que esta clase proporcione un cifrado autenticado y no parezca tener ninguno de los errores comunes.

Lo único que veo que debes tener en cuenta es que utiliza MCRYPT_DEV_URANDOM como una fuente aleatoria, lo que podría llevar a un debilitamiento de la seguridad en un uso extremadamente alto en un sistema sin una fuente aleatoria de hardware, pero para la mayoría de las aplicaciones debería trabaja bien.

Lo usaría.

    
respondido por el DuneWalker 02.12.2014 - 20:20
fuente

Lea otras preguntas en las etiquetas