谷歌应用商店和OpenSSL警告信息

27
我刚收到了一封来自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从而导致该警告?

我将更新我的库(也许Twilio或Amazon的AWS SDK适用于Android),但在那之后,我不太确定该如何继续。 我需要更新其他内容吗?据我所知,由AWS提供的服务器会自动更新和修复。但客户端呢? - Armando
1
开发者证书是否是使用旧版openssl创建的? - Delcasda
对我来说,它似乎与Google IMA相关。我针对SampleVideoPlayer APK生成的APK运行了提供的命令,并显示了 GmsCore_OpenSSL。还是我收到了误发的电子邮件? - Sufian
@Hyndrix 你好!我也遇到了同样的问题,你有解决方法吗? - Aamirkhan
@Aamirkhan 我在Google Groups上创建了一个线程,但我仍然没有收到来自Google的答复。 - Sufian
显示剩余3条评论
5个回答

21

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

在我测试的几个APK上都有效。 OpenSSL版本字符串是通过版本号和日期进行特定提取的。如果谷歌标记了APK并且此操作找不到它,请放松egrep命令中OpenSSL正则表达式并将其改为“OpenSSL”,然后看看结果如何。

将以下内容放入文件中,例如testopenssl.sh

用法:./testopenssl.sh APK_文件

#!/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

1
嗨,我正在使用 Cordova 库,谷歌已经指向了我的 APK。这个脚本找不到 OpenSSL。有没有任何方法来测试它? - Emre Aktürk
我在我的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? - YuDroid
脚本无法在.apk中找到OpenSSL;但我仍然收到来自Google Play的警告。当我运行grep命令时,它没有给我OpenSSL版本。我得到了以下结果-->无法种子OpenSSL PRNG GmsCore_OpenSSL + com.android.org.conscrypt.OpenSSLSocketImpl 7org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl。有什么想法我可能错过了什么? - user1743524
当尝试运行此脚本时,我收到以下错误:testopenssl.sh: line 1: {rtf1ansiansicpg122cocoartf14204cocoasubrtf40: command not found testopenssl.sh: line 2: syntax error near unexpected token }' testopenssl.sh: line 2: {\fonttbl\f0\fnil\fcharset0 Menlo-Regular;}'。我没有显式地使用 OpenSSL 库,并且在我的依赖项(依赖树中)中找不到此库。 - Stepan Sanda
rm: ssl_work_dir/realestate: 拒绝访问 rm: ssl_work_dir/base/res: 拒绝访问 rm: ssl_work_dir/base: 拒绝访问 rm: ssl_work_dir: 拒绝访问 - Maveňツ

8
根据Eric Davis在Android安全讨论邮件列表中对安全警报:您正在使用高度易受攻击的OpenSSL版本的回复:
  1. 您可以通过("$ unzip -p YourApp.apk | strings | grep "OpenSSL"")确定哪些应用程序正在使用OpenSSL。
  2. 请将所有静态链接版本的OpenSSL更新为1.0.1h、1.0.0m或0.9.8za。(jww注:随着新版本的发布,此版本将随之更改)。
  3. 如果您正在使用捆绑了OpenSSL的第三方库,请通知第三方并与其合作解决此问题。

当您收到此消息时,应同时更新您正在使用的NDK和IDE。我看到有报道称某些版本的NDK包括一个下级标题。我还怀疑您正在使用的IDE可能会提供一个下级OpenSSL版本(我不使用Android上的IDE,所以我没有遇到过它)。

如果您没有直接使用OpenSSL,则SDK提供了易受攻击的OpenSSL版本。在这种情况下,您应该更新您的SDK。如果您需要在SDK中找到下级OpenSSL,则请参见如何检查哪个依赖项导致OpenSSL漏洞

Google还提供了更新安全提供程序以防止SSL攻击,但我怀疑它仍然会触发消息,因为它似乎是一个基本的字符串搜索。

通常情况下,更新所有内容比尝试弄清谁提供了下一级版本的OpenSSL更容易。在花费时间确定提供者之后,您的可操作项相同:更新SDK。那么为什么要浪费时间呢?只需更新所有内容并享受其他错误修复即可。


然而,仍然存在一些未解决的问题:如果使用libcrypto的加密(例如RAND_bytesEVP_encrypt),而不是libssl的SSL/TLS函数(例如SSL_connect),是否仍会触发警告?也就是说,Google是否正在扫描使用易受攻击的函数,还是通过strings扫描OpenSSL版本。


1
你在这里提供的解决方案可以在Linux上完成,能否告诉我如何在Windows上做同样的事情?我在我的应用程序中使用了Twillio,所以这是导致此消息弹出的原因吗?我应该如何检查我的Android Studio项目是否有OpenSSL? - UserName_Untold
在我的情况下,“..x86/librealm-jni.so”有旧的openSSL版本。我该怎么办? - M. Usman Khan

2

我也遇到了这个问题,因为我使用的Facebook SDK版本不是最新的。所以如果你也在使用它,请尝试使用更新的Facebook SDK v3.21.1版本,那么这个警告就会消失。


1

0

我遇到了这个问题,我正在使用ffmpeg库和.so文件,我通过以下步骤解决了问题: 首先,我使用的是Android Studio。因此,如果您使用的是Eclipse,请尝试找到自己的方法。

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

https://github.com/bytedeco/javacvhttps://github.com/bytedeco/javacpp下载javacv-1.2-bin.zip和javacpp-1.2.3-bin.zip文件,然后解压它们并将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文件,然后清理并重建项目。

参考- kieukhuongthinh的 评论


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接