Android系统中实现网络防火墙的方法

防火墙顾名思义就是作为内部网与外部网之间的一种访问控制设备, 常常安装在内部网和外部网交界点上。而网络防火墙是一个位于计算机与它所连接的网络之间的软件。所有网络通信在计算机里流入流出都要经过防火墙。而防火墙对流经它的网络通信进行扫描,这样能够过滤掉一些攻击,以免其在目标计算机上被执行。重要的是防火墙还可以关闭不使用的端口,而且它还能禁止特定端口的流出通信,封锁特洛伊木 马,也可以禁止来自特殊站点的访问,从而防止来自不明入侵者的所有通信。

《Android系统中实现网络防火墙的方法》

智能手机网络防火墙的现状

时下,随着科技迅速发展,智能手机也越来越普及,以及3G网络的快速发展,连4G都出来服务了,也越来越多的移动用户使用移动智能手机快速上网。于此同时,各类恶意软件也通过网络来盗取用户手机上的的隐私,甚至以此来控制用户的手机。因此,智能手机上的防火墙也就应运而生了。

手机与PC端上的环境不同, Android手机上的网络环境相对于PC端没有那么复杂。因此,现行主流的Android防火墙解决方案都是对手机里的应用设置网络访问权限,而不会像PC上的防火墙那样提供强大的网络监视、数据包 过滤、端口监控等功能。

Android网络防火墙的几种实现方式

a) Android应用层:敏感函数hook

i. 绝大多数Android应用都是调用Android Framework来实现网络通讯。比如:webView.loadUrl(),HttpClient.execute(),DefaultHttpClient.execute()等。只需穷举这些类的函数,并将它们都Hook住,这样就可实现拦截上网的功能了。

ii. 当然,如果想要Hook这些函数入口,有两种方式:1. 首先需要获得root权限,然后通过进程注入,将Client代码注入到应用进程,在进程上网时,应用进程将会发起IPC请求到Server进程,由Server进程来决定是否允许其访问网络。2. 通过修改应用本身来加入Hook代码,从而避免了root手机,这样相对比较安全。

iii. 使用函数hook这种方案的优点是:简单、快速、可实现网络热开关(无需杀死进程)。但缺点是也是有的,它不能拦截所有的网络访问入口。例如:某应用如果没有调用Android的库,而是自己实现了一个访问网络的库,或者甚至用native代码来实现,那么这时候这个方案将拦截不到任何的上网请求。

b) Android框架层:android.permission.INTERNET权限

i. 在Android系统中,任何想访问网络的应用都必须申请android.permission.INTERNET权限。当Zygote在fork()一个AndroidManifest.xml中带有这个权限的应用时,这个会将当前应用加到inet组中。而凡是一个进程的gid组中有inet,那么这个应用就有权限上网。

ii. 因此有两种方式禁止应用上网:1. 修改应用的AndroidManifest.xml,使其没有android.permission.INTERNET权限。2. 获得root权限,然后注入zygote进程,使其在fork()之后,不要将inet设到应用的gid组中。

iii. 这个方案相对于第 一个方案来说,它可以彻底的屏蔽一个应用上网。实现起来也没想象中那么复杂,但是gid组一旦设定后,应用进程将再也无权限修改。因此被禁止掉上网权限的进程,若想要再次获得上网权限,则必须被杀死,然后重新由zygote进程fork()生成。

c) Linux内核层:iptables

i. 在Linux内核中,NetworkFilter在TCP/IP的协议栈中加了相应的Hook。我们通过这些Hook可以对网络数据包可以进行过滤,丢弃,修改等。但直接使用起来相对麻烦。可Linux给我们提供了一个非常强大的工具:iptables,它是用来简化这一过程。Iptables,是一个Linux命令,通过这个命令,可以对整个系统发出去的包,接收到的包,以及转发的包进行拦截,修改,拒绝等操作。具体起使用方法,这里不再一一展开了,有兴趣可以查找资料学习。

ii. Iptable不仅可以按照uid来禁用应用上网,还可以分别禁用某个uid的3G上网和WiFi上网。这给用户带来的极大的方便。

iii. 使用这个方案的优点是,在这不需要进程注入,所以实现起来会相对简单。而且能够同时禁用3G网络和Wifi网络,如此一来用户的体验也更加好。此外,iptables的功能还有很多,基于iptables可以实现功能更加强大的防火墙。但是Iptable虽然好,可也是有缺点的,运行iptables需要root权限。目前基于iptables的Android防火墙有很多。主流安全软件的联网拦截功能,如360手机卫士,手机du霸等都是使用这一方案。

总结

上文主要通过三个层面来控制一个应用的上网。具体使用哪一种,这需要看用户的需求,以及手机的系统环境而定。

a) 如果不能获得root权限,基本思路就是定制修改apk,可以考虑加入hook代码,或者是压根在AndroidManifest.xml里将android.permission.INTERNET权限去除。

b) 如果能获得root权限,可以考虑注入zygote,使之fork()之后不加入inet组,还可以注入应用进程加上敏感函数的hook。此外还可以使用iptables命令。

c) 用户如果希望不杀死进程也能实现上网权限的开关,并且要求可以分别禁用3G网络和Wifi网络的话,那么非iptables不可了。

其实比较下来,还是基于iptables的方案相对较好。它似乎只有一个缺点就是需要root权限。但大家也知道一旦手机被root以后,安全性反而将大大降低。那么我们可否找到一种手机既不被root,又能使用iptables的方案呢?

这个其实是有的。只是这无法通过第三方的应用来实现这个目标,这个是必须有手机厂商对Android系统进行定制化修改,添加一个具有root权限的service来负责iptables命令的操作。其他进程只有向这个service提出请求,才能间接调用iptables。当然app应用要和这个service沟通,必须遵循一定的协议和获得相应的授 权才行,否则又会变的不安全了。

上述方案,我们已经实现了,并且实现效果还不错。我们在init.rc里添加了一个service,并且授予这个service root权限。这个service起来之后,会等待client端请求。对于这个client端,我们对外提供了一套SDK,应用程序只需调用这套SDK API就可以和这个root service进行通信了,然后就可以间接执行iptables命令。

以下是我们的SDK API接口。Uid指应用的uid。type是针对的网络类型,可以是3G网络或者是Wifi网络。Blocked表示禁用还是启用网络。

public static final int MOBILE_NETWORK = 1;

public static final int WIFI_NETWORK = 2;

public void setApplicationPolicy(int uid, int type, boolean blocked); //设置拦截状态

public boolean getApplicationPolicy(int uid, int type); //获得当前的拦截状态

通过上文,我们可以知道不管是PC端的安全还是手机端的安全都是必须要考虑的,而现在我们在智能手机上安装各式各种应用APP,很少有人考虑过那些手机应用的安全性,那么上文所讲到的个人信息或者隐私安全也是非藏重要的,总结上文,主要是介绍了智能手机网络防火墙的现状、Android网络防火墙的几种实现方式中的三个方式,分别是Android应用层:敏感函数hook、Android框架层:android.permission.INTERNET权限和Linux内核层:iptables,详细的介绍看回原文。

原文来自厚学网:https://www.houxue.com/news/387794.html

    原文作者:南京英孚青少儿英语
    原文地址: https://www.jianshu.com/p/e9e0877c03d6
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞