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版本 :
- 您可以通过
("$ unzip -p YourApp.apk | strings | grep "OpenSSL"")
确定哪些应用程序使用OpenSSL - 请将所有静态链接的OpenSSL版本更新为1.0.1h,1.0.0m或0.9.8za。 ( 由jww注意 :随着新版本的OpenSSL的发布,这个版本将会随着时间而改变)。
- 如果您使用捆绑OpenSSL的第三方库,请通知第三方并与他们合作解决此问题。
当你收到这条消息时,你应该更新你正在使用的NDK和IDE。 我见过一些NDK版本的报告,包括一个低级头文件。 我也怀疑你正在使用的IDE可能会提供一个低级的OpenSSL版本(我不使用Android上的IDE,所以我没有遇到它)。
如果您不是直接使用OpenSSL,则SDK将提供OpenSSL的易受攻击的版本。 在这种情况下,您应该更新您的SDK。 如果您需要在SDK中找到底层OpenSSL,请参阅如何检查哪个依赖性会导致OpenSSL漏洞 。
谷歌还提供更新您的安全提供商以防止SSL漏洞 ,但我怀疑它仍然会触发邮件,因为它似乎是一个基本的字符串搜索。
更新所有内容通常比较容易,而不是试图找出谁在提供OpenSSL的低级版本。 在花时间确定谁提供它之后,可操作的项目是相同的:更新SDK。 那么为什么浪费时间呢? 只是更新所有这些,并享受其他错误修复。
但是仍然存在一些问题:如果使用libcrypto
的密码学(例如( RAND_bytes
或EVP_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)。
-
提取它们并将
ffmpeg.jar
,javacpp.jar
,javacv.jar
和opencv.jar
到[yourproject]\libs
。 - 解压缩
ffmpeg-android-arm.jar
和opencv-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的评论
- 我应该使用AsyncTask还是IntentService?
- Android获取相机位图的方向? 并旋转-90度
- 如何显示Android棉花糖Google地图上的当前位置?
- 如何testingandroid引荐跟踪?
- DexException:无法将新的索引65536合并到非巨型指令中
- 当Realm在NotificationListenerService中更新时,RealmChangeListener不会被调用
- 如何将LatLng和半径转换为Android Google Maps API v2中的LatLngBounds?
- Android如何将int转换为string?
- SlidingTabLayout以适应屏幕