如何确定哪个依赖项导致 Google 播放 OpenSSL 警告?

How to determine which dependency causes Google Play OpenSSL warning?

我目前正在处理一个大型遗留项目并尝试修复 OpenSSL 漏洞问题,如 How to address OpenSSL vulnerabilities in your apps 所述。

问题是,有很多依赖项,有些是开源的(我更新了所有没有破坏兼容性的)添加为 Gradle 导入,有些是 custom/closed 提供的源代码我工作的公司的合作伙伴和承包商作为 JAR 附加到该项目。

有什么方法可以查明具有此漏洞的特定库吗?我使用了 Google Play and OpenSSL warning message 中提供的 bash 脚本,它指向一个本机依赖项(实际上是 .so 文件)。是否有任何选项可以从那里查明实际依赖性?

Is there any option to pinpoint actual dependency from there?

是的,但是您需要知道有问题的 OpenSSL 版本并且您需要 grep。 Windows find 不行。

首先,记下有问题的 OpenSSL 版本。为了争论,说它是由于 OpenSSL 1.0.1h.

接下来,收集您的依赖项及其顶级文件夹的列表。为了争论,说它的 $HOME/Desktop/aosp-app, $HOME/sdk-a/usr/local/sdk-b/opt/local/sdk-c .

最后,对于顶级目录:

grep -R '1.0.1h' "$HOME/Desktop/aosp-app"
grep -R '1.0.1h' "$HOME/sdk-a"
grep -R '1.0.1h' /usr/local/sdk-b
grep -R '1.0.1h' /opt/local/sdk-c

不需要 grep -iR,这是不区分大小写 (-i) 递归 (-R) 的搜索。您也不需要 grep -IR,这是一种递归 (-R) 搜索,它会跳过二进制文件 (-I).

所有这一切都有效,因为 OpenSSL 库将其版本作为字符串嵌入到数据部分。最终,您会找到罪魁祸首,它可能是作为共享对象预构建但包含 OpenSSL 作为静态库的 SDK。一个SDK似乎经常被识别,它使用了针对静态OpenSSL库构建的cURL。


如果您有 ,那么您可以执行以下快速测试:

find <dir> -name '*.jar' -exec grep -R '1.0.1h' {} \;

该命令将在目录 <dir> 及其子目录中查找。它将搜索扩展名为 *.jar 的文件。当它找到一个时,它会 运行 grep 在它上面寻找字符串。 find 会为它找到的每个 *.jar 执行此操作。