Google Play和OpenSSL警告消息

我刚刚收到一封来自Google Play的电子邮件,内容如下:

你好,

一个或多个应用程序运行的是过时的OpenSSL版本,它存在多个安全漏洞。 您应该尽快更新OpenSSL。 有关OpenSSL中最新安全漏洞的更多信息,请参阅http://www.openssl.org/news/secadv_20140605.txt 。

请注意,尽管这些特定问题是否会影响您的应用程序尚不清楚,但是存在漏洞的应用程序可能会使用户面临危险,可能会被视为“危险产品”,可能会从Google Play中删除。

问候,

Google Play团队

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

电子邮件偏好设置:您已收到这封重要的电子邮件服务通知,以便您了解有关Google Play帐户的重大变化。

我没有在我的任何应用程序中明确包含OpenSSL。 使用Android NDK的应用程序使用NDK 9d(最新版本)。 我使用的唯一外部本地库是ffmpeg和OpenCV以及一些没有包含本地代码的广告库。

哪里可以包含OpenSSL引起这个警告?

问候,

我写了一个bash脚本,它将显示在您的应用中静态链接的任何东西的OpenSSL版本,以及是否包含TLS心跳方法。

这在我投掷的少数APK上工作。 OpenSSL版本字符串正在被特定的版本号和日期提取。 如果Google标记APK并且无法找到它,请在egrep命令中放松OpenSSL正则表达式以“OpenSSL”,然后查看可以获得您的位置。

把下面的文件放在一个文件中,比如testopenssl.sh

用法:./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 

据安全性讨论邮件列表中的Eric Davis回应安全警告:您使用的是一个非常脆弱的OpenSSL版本 :

  1. 您可以通过("$ unzip -p YourApp.apk | strings | grep "OpenSSL"")确定哪些应用程序使用OpenSSL
  2. 请将所有静态链接的OpenSSL版本更新为1.0.1h,1.0.0m或0.9.8za。 ( 由jww注意 :随着新版本的OpenSSL的发布,这个版本将会随着时间而改变)。
  3. 如果您使用捆绑OpenSSL的第三方库,请通知第三方并与他们合作解决此问题。

当你收到这条消息时,你应该更新你正在使用的NDK和IDE。 我见过一些NDK版本的报告,包括一个低级头文件。 我也怀疑你正在使用的IDE可能会提供一个低级的OpenSSL版本(我不使用Android上的IDE,所以我没有遇到它)。

如果您不是直接使用OpenSSL,则SDK将提供OpenSSL的易受攻击的版本。 在这种情况下,您应该更新您的SDK。 如果您需要在SDK中找到底层OpenSSL,请参阅如何检查哪个依赖性会导致OpenSSL漏洞 。

谷歌还提供更新您的安全提供商以防止SSL漏洞 ,但我怀疑它仍然会触发邮件,因为它似乎是一个基本的字符串搜索。

更新所有内容通常比较容易,而不是试图找出谁在提供OpenSSL的低级版本。 在花时间确定谁提供它之后,可操作的项目是相同的:更新SDK。 那么为什么浪费时间呢? 只是更新所有这些,并享受其他错误修复。


但是仍然存在一些问题:如果使用libcrypto的密码学(例如( RAND_bytesEVP_encrypt )而不使用EVP_encrypt的SSL / TLS功能(例如SSL_connect ),它是否仍会触发警告? Google扫描使用易受攻击的功能,或者是Google通过strings扫描OpenSSL版本。

我也有这个问题,因为我使用的Facebook的SDK版本没有更新。 所以,如果你也使用它,只是尝试使用Facebook的SDK v3.21.1的更新版本,并解决警告。

如果你使用的是cocos2dx,那么你需要更新curl库。 请从这里下载更新的卷曲库http://cocostudio.download.appget.cn/Cocos2D-X/curl.zip

并用目前在cocos2dx中存在的curl库来替换它。

为了安全起见,请更新您的mac openssl版本,对于此链接http://javigon.com/2014/04/09/update-openssl-in-osx/

我有这个问题,我正在使用ffmpeg lib和.so文件,我通过以下步骤解决问题:首先,我使用Android Studio。 所以,如果你使用Eclipse,试着找到你自己的方式。

问题的原因是使用OpenSSL 1.0.2d的libavformat.so文件。 我们需要更新它。 但是,更新libavformat.so会导致崩溃,所以我们需要更新所有相关的lib(javacv和javacpp)。

  • https://github.com/bytedeco/javacv和https://github.com/bytedeco/javacpp下载javacv-1.2-bin.zip和javacpp-1.2.3-bin.zip

  • 提取它们并将ffmpeg.jarjavacpp.jarjavacv.jaropencv.jar[yourproject]\libs

  • 解压缩ffmpeg-android-arm.jaropencv-android-arm.jar (解压javacv-1.2-bin.zip后找到它们),就会收集到新版本的.so文件。
  • 用新版本替换[yourproject]\src\main\jniLibs\armeabi-v7a的旧文件(几乎将.so文件替换,而不是全部替换)
  • 有时,您也需要将javacpp-presets-1.2.pom文件复制到[yourproject]\libs 。 您可以在Google上搜索。
  • 修改您的项目的模块build.gradle

     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 } 
  • 清理项目并重建。

参考 – kieukhuongthinh的评论