Google Play 和 OpenSSL 警告消息

Posted

技术标签:

【中文标题】Google Play 和 OpenSSL 警告消息【英文标题】:Google Play and OpenSSL warning message 【发布时间】:2014-08-04 08:23:55 【问题描述】:

我刚收到一封来自 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 导致此警告?

问候,

【问题讨论】:

我今天早上也收到了这封电子邮件。这意味着每个有一些登录过程的人都可能需要更新到最新的 sdk 吗?我也没有包含任何 Open SSL 库,但也许它是关于我用于密码哈希的 java.security 包,也许你也使用这样的东西? 我会更新我的库(也许 Twilio 或亚马逊的 AWS SDK for Android 会使用它)但在那之后,我不确定如何继续。我这边还有什么要更新的吗?据我所知,AWS 的服务器会自动更新和修复。但是客户端..? @Hyndrix - 你能导航到电子邮件,显示邮件标题,然后将邮件标题粘贴到问题中吗?谷歌还没有讨论这些发现(我刚刚查看了他们的安全博客googleonlinesecurity.blogspot.com),我想知道它是真的来自谷歌还是某人的恶作剧。 也收到了这个消息。但不知道我在哪里使用 OpenSSL。 会不会是开发者证书是使用旧的 openssl 版本创建的? 【参考方案1】:

我遇到了这个问题,我正在使用 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's评论

【讨论】:

【参考方案2】:

根据Android Security Discussions 邮件列表中 Eric Davis 对Security Alert: You are using a highly vulnerable version of OpenSSL 的回复:

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

当您收到此消息时,您应该更新您正在使用的 NDK 和 IDE。我已经看到一些关于 NDK 版本的报告,包括一个低级标头。我还怀疑您使用的 IDE 可能提供了低级 OpenSSL 版本(我没有在 Android 上使用 IDE,所以我没有遇到过)。

如果您没有直接使用 OpenSSL,则 SDK 提供了易受攻击的 OpenSSL 版本。在这种情况下,您应该更新您的 SDK。如果您需要在 SDK 中定位下层 OpenSSL,请参阅How to check which dependancy causes OpenSSL vulnerability。

Google 也提供了Updating Your Security Provider to Protect Against SSL Exploits,但我怀疑它仍然会触发该消息,因为它似乎是一个基本的字符串搜索。

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


但仍有待解决的问题:如果有人使用来自 libcrypto 的加密(例如(RAND_bytesEVP_encrypt)而不是来自 libssl 的 SSL/TLS 函数(例如,SSL_connect ),是否还会触发警告?即是谷歌扫描使用易受攻击的功能,还是谷歌通过strings扫描OpenSSL版本。

【讨论】:

你在这里给出的解决方案可以在linux上完成,你能告诉我如何在windows上做同样的事情吗?我在我的应用程序中使用 twillio,这就是抛出此消息的原因吗?我应该如何检查我的 android studio 项目是否有这个开放的 ssl? 在我的情况下,“..x86/librealm-jni.so”具有旧的 openSSL 版本。我该如何解决这个问题?【参考方案3】:

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

【讨论】:

【参考方案4】:

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

并用 cocos2dx 中当前的 curl 库替换它。

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

【讨论】:

【参考方案5】:

我编写了一个 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/*))
#*** 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/*))
    #*** 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

【讨论】:

嗨,我正在使用 Cordova 库,谷歌已经指出了我的 apk。此脚本找不到任何 OpenSSL。有什么办法测试吗? 我在我的 Mac 机器上运行上述脚本,但它给了我以下错误:testopenssl.sh: line 27: syntax error: unexpected end of file。我还可以在我的 Mac shell 上运行"$ unzip -p YourApp.apk | strings | grep "OpenSSL"。它给了我 OpenSSL 版本“0.9.8h May 2008”。但是现在下一步该怎么做?如何解决此问题或升级到最新的 OpenSSL 版本并将其部署到 Google Play? 脚本无法在 .apk 上找到 OpenSSL;但我仍然收到来自 google play 的警告。当我运行 grep 命令时,它没有给我 OpenSSL 版本。我得到以下结果 --> 未能播种 OpenSSL PRNG GmsCore_OpenSSL +com.android.org.conscrypt.OpenSSLSocketImpl 7org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl 关于我可能遗漏的任何想法? 尝试运行此脚本时出现此错误testopenssl.sh: line 1: rtf1ansiansicpg122cocoartf14204cocoasubrtf40: command not found testopenssl.sh: line 2: syntax error near unexpected token ' testopenssl.sh: 第 2 行:\fonttbl\f0\fnil\fcharset0 Menlo-Regular;' 我没有明确使用 OpenSSL 库,我在我的任何依赖项(在依赖项树中)。

以上是关于Google Play 和 OpenSSL 警告消息的主要内容,如果未能解决你的问题,请参考以下文章

未授予通话和短信权限,但仍收到来自 google play 的警告

尝试将 apk 上传到 google play 控制台时,我收到错误和警告消息

设备支持警告:Google play 2019

如何解决有关“使用短信或通话记录权限组”的Google Play警告

如何抑制“避免使用捆绑版的 Google Play 服务 SDK”警告?

警告 - 在 Google Play 控制台上公开的 AWS 凭证