Mensaje de advertencia de Google Play y OpenSSL

Acabo de recibir un correo electrónico de Google Play que dice:

Hola,

Una o más de sus aplicaciones está ejecutando una versión obsoleta de OpenSSL, que tiene múltiples vulnerabilidades de seguridad. Debe actualizar OpenSSL lo antes posible. Para obtener más información acerca de la vulnerabilidad de seguridad más reciente en OpenSSL, consulte http://www.openssl.org/news/secadv_20140605.txt .

Tenga en cuenta que, aunque no está claro si estos problemas específicos afectan su aplicación, las aplicaciones con vulnerabilidades que exponen a los usuarios al riesgo de compromiso pueden considerarse “productos peligrosos” y están sujetas a la eliminación de Google Play.

Saludos,

Equipo de Google Play

© 2014 Google Inc. 1600 Amphitheatre Parkway Mountain View, CA 94043

Preferencias de correo electrónico: recibió este aviso de servicio de correo electrónico obligatorio para informarle sobre cambios importantes en su cuenta de Google Play.

No he incluido explícitamente OpenSSL en ninguna de mis aplicaciones. Las aplicaciones que usan Android NDK están usando NDK 9d (la última). Las únicas bibliotecas nativas externas que uso son ffmpeg y OpenCV y algunas bibliotecas publicitarias que no tienen código nativo incluido.

¿En qué otro lugar se podría incluir OpenSSL causando esta advertencia?

Saludos,

Escribí una secuencia de comandos bash que mostrará las versiones de OpenSSL de todo lo estáticamente vinculado en su aplicación y si se incluyen los métodos de latido TLS.

Esto funcionó en un puñado de APK que arrojé. La cadena de la versión OpenSSL se extrae específicamente con un número de versión y fecha. Si Google señala el APK y no puede encontrarlo, relaje la expresión regular de OpenSSL en el comando egrep para simplemente “OpenSSL” y vea a dónde lo lleva.

Coloque lo siguiente en un archivo, por ejemplo, testopenssl.sh

uso: ./testopenssl.sh APK_File

#!/bin/bash sslworkdir="ssl_work_dir" if [ ! -d $sslworkdir ]; then mkdir $sslworkdir fi unzip -q "$1" -d $sslworkdir #Set delimiter to ignore spaces IFS=$'\r\n' #Create an array of OpenSSL version strings opensslarr=($(egrep --binary-files=text -o -R -e "OpenSSL\s\d+\.\d+\.\d+\w+\s\d+\s\w+\s\d+" $sslworkdir/*)) #Stackoverflow syntax highlight fix closing 'block comment' */ if [ ${#opensslarr[@]} -gt 0 ]; then echo "Found OpenSSL versions" printf "%s\n" "${opensslarr[@]}" heartbeatarr=($(grep -R -E "(tls1_process_heartbeat|dtls1_process_heartbeat|dtls1_heartbeat|tls1_hearbeat)" $sslworkdir/*)) #Stackoverflow syntax highlight fix closing 'block comment' */ if [ ${#heartbeatarr[@]} -gt 0 ]; then echo "Files that contains heartbeat methods:" printf "%s\n" "${heartbeatarr[@]}" else echo "No libraries contain heartbeat methods" fi else echo "Did not find OpenSSL" fi rm -rf $sslworkdir 

De acuerdo con Eric Davis en la lista de correo de Discusiones de Seguridad de Android en respuesta a Alerta de Seguridad: Usted está usando una versión altamente vulnerable de OpenSSL :

  1. Puede determinar qué aplicaciones utilizan OpenSSL a través de ("$ unzip -p YourApp.apk | strings | grep "OpenSSL"")
  2. Actualice todas las versiones de OpenSSL enlazadas estáticamente a 1.0.1h, 1.0.0m o 0.9.8za. ( Nota por jww : esta versión cambiará con el tiempo a medida que se lanzan nuevas versiones de OpenSSL).
  3. Si está utilizando una biblioteca de terceros que agrupa OpenSSL, notifique a la tercera parte y trabaje con ellos para solucionar este problema.

Cuando reciba este mensaje, debe actualizar tanto el NDK como el IDE que está utilizando. He visto informes de algunas versiones del NDK, incluido un encabezado de nivel inferior. También sospecho que el IDE que está utilizando podría proporcionar una versión de OpenSSL de nivel inferior (no uso los IDE en Android, así que no lo he encontrado).

Si no está utilizando directamente OpenSSL, los SDK proporcionan la versión vulnerable de OpenSSL. En este caso, debe actualizar sus SDK. Si necesita ubicar el nivel más bajo de OpenSSL entre los SDK, entonces vea Cómo verificar qué dependencia causa la vulnerabilidad de OpenSSL .

Google también proporciona la actualización de su proveedor de seguridad para proteger contra los exploits SSL , pero sospecho que aún activará el mensaje porque parece ser una búsqueda de cadenas básica.

A menudo es más fácil actualizar todo en lugar de tratar de descubrir quién proporciona la versión de nivel inferior de OpenSSL. Después de pasar el tiempo para determinar quién lo está proporcionando, su elemento procesable es el mismo: actualice el SDK. Entonces, ¿por qué perder el tiempo en eso? simplemente actualícelos y disfruta de las otras correcciones de errores también.


Sin embargo, todavía hay preguntas abiertas: si uno usa la criptografía de libcrypto (por ejemplo ( RAND_bytes o EVP_encrypt ) y no las funciones de SSL / TLS de libssl (por ejemplo, SSL_connect ), ¿seguirá SSL_connect la advertencia? El escaneo de Google para el uso de funciones vulnerables, o el escaneo de Google para la versión de OpenSSL a través de strings .

También tengo este problema porque la versión del SDK de Facebook que estoy usando no se actualiza. Por lo tanto, si también lo está utilizando, intente utilizar la versión actualizada del SDK v3.21.1 de Facebook, y esa advertencia está resuelta.

Si está utilizando cocos2dx, entonces necesita actualizar la biblioteca Curl. Descargue la biblioteca actualizada de curl desde aquí http://cocostudio.download.appget.cn/Cocos2D-X/curl.zip

y reemplácelo con la biblioteca de curl actual presente en cocos2dx.

Para mayor seguridad, actualice también su versión mac openssl, para esto siga este enlace http://javigon.com/2014/04/09/update-openssl-in-osx/

Tuve este problema, estoy usando archivos ffmpeg lib y .so, resolví el problema por los siguientes pasos: Primero, uso Android Studio. Entonces, si está usando Eclipse, trate de encontrar su propio camino.

La causa del problema es el archivo libavformat.so que está utilizando OpenSSL 1.0.2d. Necesitamos actualizarlo. Pero, solo actualizar libavformat.so causará lockings, por lo que debemos actualizar todas las lib relacionadas (javacv y javacpp).

  • Descargue javacv-1.2-bin.zip y javacpp-1.2.3-bin.zip desde https://github.com/bytedeco/javacv y https://github.com/bytedeco/javacpp

  • Extraiga y copie ffmpeg.jar , javacpp.jar , javacv.jar y opencv.jar en [yourproject]\libs .

  • Extraiga ffmpeg-android-arm.jar y opencv-android-arm.jar (encuéntrelos después de extraer javacv-1.2-bin.zip ), obtendrá una nueva versión de los archivos .so.
  • Reemplace los archivos antiguos en [yourproject]\src\main\jniLibs\armeabi-v7a con la nueva versión (casi todos los archivos .so serán reemplazados, no todos)
  • Algunas veces, también necesita copiar el javacpp-presets-1.2.pom a [yourproject]\libs . Puedes buscarlo en Google.
  • Modifica el módulo build.gradle de tu proyecto

     apply plugin: 'com.android.library' android { compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig { minSdkVersion 14 targetSdkVersion 23 } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } packagingOptions { exclude 'META-INF/services/javax.annotation.processing.Processor' pickFirst 'META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.properties' pickFirst 'META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.xml' pickFirst 'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.properties' pickFirst 'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.xml' pickFirst 'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.xml' pickFirst 'META-INF/maven/org.bytedeco.javacpp-presets/1.2/javacpp-presets-1.2.pom.xml' pickFirst 'META-INF/maven/org.bytedeco.javacpp-presets/org.bytedeco.javacpp-presets-1.2.pom.xml' } } configurations { all*.exclude group: 'org.bytedeco', module: 'javacpp-presets' } repositories { mavenCentral() } dependencies { compile 'com.android.support:support-v4:23.2.1' compile files('libs/opencv.jar') //1.2 compile files('libs/javacv.jar') //1.2 compile files('libs/javacpp.jar') //1.2.3 compile files('libs/ffmpeg.jar') //1.2 } 
  • Limpiar proyecto y reconstruir

Referencia : comentario de kieukhuongthinh