繁体   English   中英

最佳实践 to SSL Pinning in Flutter,每次都取证书? 或将其存储在资产中?

[英]Best practice to SSL Pinning in Flutter, fetch the certificate every time? or storing it in assets?

我深入阅读了 SSL Pinning 以及如何在 Flutter 中实现它,我有两个问题:

  1. 将(.pem)证书文件存储在资产中是否安全? 如果没有,存放在哪里?
  2. 在应用程序加载时访问服务器并从那里获取证书而不是将其存储在应用程序中是否安全且更好?

我目前正在将证书文件存储在资产中,并使用GlobalConfiguration().getValue()方法从app_settings.json获取它的路径。

  1. 这就是它通常的工作方式 AFAIK
  2. 在这种情况下,第一个 API 调用没有受到 MITM 攻击的保护,并且 SSL 固定目的被破坏

我们在我们的应用程序中实现 SSL 固定时使用了这个插件(我们的客户使用 Dio)。

要实现此插件,您需要找到服务器证书的相应指纹:

  1. 单击 url 地址行上的“锁定”图标
  2. “连接是安全的”
  3. “证书有效”
  4. 一般的
  5. 在 Fignerprints 部分查找 SHA-256 指纹

然后你需要将这个指纹写入你应用程序中的一个常量列表中,以供插件使用。

检查应该针对您发送的每个请求进行,因为这是 SSL 固定的主要安全目的 - 检查是否有人在服务器和客户端之间修改请求。 根据使用 Dio,您可以使用 InterceptorWrapper 来执行检查。 检查器将如下所示:

class SslPinningInterceptor extends InterceptorsWrapper {
  @override
  Future<void> onRequest(
    RequestOptions options,
    RequestInterceptorHandler handler,
  ) async {
    try {
      // if the fingerprints do not match the plugin will throw a PlatformException 
      // SslPinningPlugin.check

      // you can perform handler.next here because the exception hasn't been thrown
    } on PlatformException catch (_) {
      // you can perform handler.reject because check hasn't passed
    }
  }

    @override
    void onResponse(Response response, ResponseInterceptorHandler handler) {
      // handler.next
    }

    @override
    void onError(DioError err, ErrorInterceptorHandler handler) {
      // handler.next
    }
}

你的问题

将(.pem)证书文件存储在资产中是否安全? 如果没有,存放在哪里?

应用程序中没有任何地方可以安全地存储它,因为它很容易通过 static 二进制分析提取。 攻击者将使用其中一种开源工具对二进制文件进行反编译,例如MobSF - Mobile Security Framework

Mobile Security Framework 是一种自动化的一体式移动应用程序 (Android/iOS/Windows) 渗透测试框架,能够执行 static 分析、动态分析、恶意软件分析和 web API 测试。

在关于移动API安全的系列文章中,我展示了如何使用MobSF提取API密钥,但是提取pem证书的原理是一样的。 要了解如何使用 MobSF 反编译您的应用程序,请查看文章如何使用 Static 二进制分析从移动应用程序中提取 API 密钥

可用于逆向工程的开源工具范围很广,我们真的不能在本文中触及这个主题的表面,而是我们将重点介绍使用移动安全框架 (MobSF)来演示如何逆向工程我们的移动应用程序的 APK。 MobSF 是一组开源工具,可在有吸引力的仪表板中展示其结果,但可以单独使用 MobSF 和其他地方使用的相同工具来获得相同的结果。

在本文中,我们将使用Android Hide Secrets研究存储库,这是一个虚拟移动应用程序,使用多种不同的技术隐藏了 API 密钥。

豆腐(首次使用的信任)

在应用程序加载时访问服务器并从那里获取证书而不是将其存储在应用程序中是否安全且更好?

不建议信任第一次使用,因为您信任在您的移动应用程序发出的第一个 API 请求中检索证书,从而使攻击者更容易通过 MitM 攻击这个第一个请求绕过您的固定并提供它自己的证书。

可能的解决方案

我真的不建议您将证书存储在您的移动应用程序中,我也不建议使用 PEM 证书来执行锁定,因为它操作复杂且很容易被盗,相反我建议您使用公钥锁定,您固定到叶证书、中间证书或根证书的 hash 的位置,因此您只需要在使用不同的私钥更新固定证书时更改应用程序上的固定。 另一个好处是你的 PEM 证书不再被攻击者获取,用于固定它的公钥 hash 也不是秘密,毕竟它是公钥的 hash。

使用 PEM 证书

现在,如果您坚持使用 PEM 证书的根目录,那么您需要一种机制来仅在移动应用程序未在受感染的设备(root、越狱)中运行时将 PEM 证书传递给移动应用程序,而不是在模拟器上运行,没有附加调试器,没有受到 MitM 攻击,没有在运行时被 Frida 或类似工具检测,并且移动应用程序本身与您上传到官方商店的应用程序完全相同,而不是重新打包/克隆的应用程序。 换句话说,您需要在从服务器返回 PEM 证书之前证明设备和应用程序的完整性,如您在2中所建议的那样:

  1. 在应用程序加载时访问服务器并从那里获取证书而不是将其存储在应用程序中是否安全且更好?

这个问题的答案中阅读有关此方法的更多信息如何在没有人窃取令牌的情况下从我的移动应用程序使用 API ,您将在其中保护 PEM 证书,正如我建议的那样,通过使用运行时秘密保护来保护 API 令牌。

公钥固定

您是否考虑过通过证书的公钥(不是私钥,如 pem 文件)执行证书锁定? Android 和 iOS 通过配置支持这个

Android 文档

通常,应用程序信任所有预安装的 CA。 如果这些 CA 中的任何一个颁发了欺诈性证书,则该应用程序将面临来自中间攻击者的风险。 一些应用程序选择通过限制他们信任的 CA 集或通过证书固定来限制他们接受的证书集。

证书固定是通过公钥的 hash(X.509 证书的 SubjectPublicKeyInfo)提供一组证书来完成的。 仅当证书链包含至少一个固定公钥时,证书链才有效。

iOS 文档

如果您的应用程序通过网络发送或接收数据,保护个人信息的隐私和完整性并保护其免受数据泄露和攻击至关重要。 您应该使用传输层安全 (TLS) 协议来保护传输中的内容并对接收数据的服务器进行身份验证。

当您通过 TLS 连接时,服务器会提供证书或证书链来建立其身份。 您可以通过将服务器证书的公钥身份固定在您的应用中来进一步限制您的应用信任的服务器证书集。 以下是如何开始。

例如,要生成 Android 和 iOS 的配置,您可以使用移动证书固定生成器在线工具:

Android 应用示例

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">approov.io</domain>
        <pin-set expiration="2023-07-21">
            <pin digest="SHA-256">INBbf7pLOYb+mX9IcJDaUPxo6DSqKObPtdy+uT92ccQ=</pin>
        </pin-set>
    </domain-config>
</network-security-config>

iOS 应用示例

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSPinnedDomains</key>
    <dict>
        <key>approov.io</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSPinnedLeafIdentities</key>
            <array>
                <dict>
                    <key>SPKI-SHA256-BASE64</key>
                    <string>INBbf7pLOYb+mX9IcJDaUPxo6DSqKObPtdy+uT92ccQ=</string>
                </dict>
            </array>
        </dict>
    </dict>
</dict>

您可以在使用证书固定保护 HTTPS文章中更详细地查看它是如何为 Android 完成的:

为了演示如何使用证书固定来保护您的移动应用程序与 API 服务器之间的 https 流量,我们将使用我在上一篇文章中使用的相同 货币转换器演示移动应用程序。

在本文中,我们将了解什么是证书固定、何时使用它、如何在 Android 应用程序中实施它以及它如何防止 MitM 攻击。

您想加倍努力 Go 吗?

在对安全问题的任何回应中,我总是喜欢引用 OWASP 基金会的出色工作。

对于 APIS

OWASP API 安全 Top 10

OWASP API 安全项目旨在通过强调不安全 API 的潜在风险并说明如何减轻这些风险来为软件开发人员和安全评估人员提供价值。 为了促进实现这一目标,OWASP API 安全项目将创建和维护一份 API 前 10 大安全风险文档,以及创建或评估 API 时最佳实践的文档门户。

对于移动应用程序

OWASP 移动安全项目 - 十大风险

OWASP 移动安全项目是一个集中资源,旨在为开发人员和安全团队提供构建和维护安全移动应用程序所需的资源。 通过该项目,我们的目标是对移动安全风险进行分类并提供开发控制以减少其影响或被利用的可能性。

OWASP - 移动安全测试指南

移动安全测试指南 (MSTG) 是移动应用程序安全开发、测试和逆向工程的综合手册。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM