如何保护Android应用程序免受网络流量捕获

时间:2015-04-01 15:05:53

标签: android proxy fiddler network-traffic

我的应用正在制作一些http请求,我不希望其他人看到这些请求的内容。目前,我可以使用Fiddler轻松检查我的应用程序正在做什么。现在,为了跟踪手机上的网络流量,我不得不更改我的Wi-Fi设置并使用代理服务器连接到Internet。即我的电脑。是否可以以编程方式检查手机是否正在使用代理?如果知道手机正在使用代理,我会禁止用户使用该应用程序显示一些错误对话框。有没有办法解决这个问题?我见过的应用程序可以在正常的Wi-Fi设置上运行,但在使用代理时没有,因此我假设有一个解决方案。顺便说一句,我正在使用改造库来提出请求。

3 个答案:

答案 0 :(得分:3)

将您的流量转移到使用HTTPS将帮助保护它免受像Fiddler这样的网络窥探。

但是,Fiddler可以在用户的​​帮助下解密HTTPS流量,这意味着您不仅可以使用HTTPS,还需要实施证书固定,客户端代码验证服务器是否提供了一个特定的证书(而不是拦截)证书Fiddler生成)。

然而,即便这样也无法解决问题,因为用户可以简单地越狱他们的设备并禁用证书固定代码。

您应该退后一步,重新考虑一下您正在尝试防范的威胁,然后再适当地更新您的问题。

答案 1 :(得分:0)

 public static boolean isNetworkConnected(final Context context) {
        boolean cks = false;
        final Activity activity = (Activity) context;
        ConnectivityManager connMgr = (ConnectivityManager) 
             context.getSystemService(Context.CONNECTIVITY_SERVICE);
        boolean isvpnConn = false;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            for (Network network : connMgr.getAllNetworks()) {
                NetworkInfo networkInfo = connMgr.getNetworkInfo(network);
                if (networkInfo.getType() == ConnectivityManager.TYPE_VPN) {
                    isvpnConn |= networkInfo.isConnected();
                           AlertDialog.Builder alert = new 
                             AlertDialog.Builder(getActivity());
                                  alert.setMessage("Sonthing want wrong!! Please 
                        disconnect VPN and try again.")
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                          dialog.dismiss();
                            activity.finish();
                            activity.finishAffinity();
                    }
                }).setNegativeButton("Cancel", null);

        AlertDialog alert1 = alert.create();
        alert1.show();
                    cks = false;
                } else {
                    cks = true;
                }
            }
        }
        return connMgr.getActiveNetworkInfo() != null && connMgr.getActiveNetworkInfo().isConnected();
    }

答案 2 :(得分:0)

以编程方式检查代理

<块引用>

是否可以通过编程方式检查手机是否使用代理?

是的。查看对 this Stackoverflow anser 的回复。

<块引用>

如果知道手机正在使用代理,我会通过显示一些错误对话框来禁止用户使用该应用。

在客户端运行的任何代码都可以在运行时由攻击者在他控制的设备上使用检测框架进行操作,例如 Frida

<块引用>

将您自己的脚本注入黑盒进程。挂钩任何函数,监视加密 API 或跟踪私有应用程序代码,无需源代码。编辑,点击保存,立即查看结果。无需编译步骤或程序重新启动。

可能的解决方案

<块引用>

我的应用正在发出一些 http 请求,我不希望其他人看到这些请求的内容。

你在这里遇到了一个艰难的挑战。让我们看看您的一些选择...

证书固定

存在多种实现证书锁定的技术,但自 Android API 24 起,它通过网络安全配置文件得到本地支持。我写了文章 Securing HTTPS with Certificate Pinning 来展示如何做到这一点:

<块引用>

为了演示如何使用证书锁定来保护您的移动应用和 API 服务器之间的 https 流量,我们将使用我在上一篇文章中使用的相同 Currency Converter Demo 移动应用。

在本文中,我们将了解什么是证书锁定、何时使用它、如何在 Android 应用中实现它以及它如何防止中间人攻击。

绕过证书固定

存在多种方法,例如使用检测框架或重新打包移动应用。

请记住,可以绕过证书锁定并不意味着您不应在移动应用中使用它,相反,强烈建议您这样做。

使用检测框架

不幸的是,Frida 也可用于绕过证书锁定,我写了文章 How to Bypass Certificate Pinning with Frida on an Android App 向您展示如何做到这一点:

<块引用>

今天我将展示如何使用 Frida 检测框架在运行时连接到移动应用程序并检测代码,以便即使在移动应用程序实施了证书锁定的情况下也能成功执行 MitM 攻击。

<块引用>

绕过证书锁定并不太难,只是有点费力,它允许攻击者详细了解移动应用程序如何与其 API 通信,然后使用相同的知识来自动化攻击或围绕它构建其他服务。< /p>

使用重新打包的移动应用

另一种广泛使用的技术是在没有证书固定代码或禁用证书的情况下重新打包移动应用程序。我写的文章 Bypassing Certificate Pinning 显示了如何删除网络安全配置文件并重新打包移动应用程序:

<块引用>

在本文中,您将学习如何重新打包移动应用以使其信任自定义 ssl 证书。这将允许我们绕过证书锁定。

一个可能更好的解决方案

<块引用>

有什么办法可以解决这个问题吗?

因此,您已经看到证书锁定是可行的方法,但是一旦可以绕过它,您就需要一种方法来检测此绕过以防止此类攻击。

我建议您阅读this answer我针对如何保护移动应用程序的 API REST?提出的问题,尤其是强化和屏蔽移动应用程序部分em>、保护 API 服务器一个可能的更好的解决方案

你想走得更远吗?

在回答安全问题时,我总是喜欢引用 OWASP 基金会的优秀作品。

对于移动应用

OWASP Mobile Security Project - Top 10 risks

<块引用>

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

OWASP - Mobile Security Testing Guide

<块引用>

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