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

随着智能手机越来越普及,以及3G网络的快速发展,越来越多的用户使用手机上网冲浪。于此同时,各类恶意软件也通过网络来盗取用户手机上的的隐私,甚至控制用户的手机。因此智能手机上的防火墙应运而生。

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

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

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

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

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

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

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

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

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

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

3)    Linux内核层:iptables

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

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

c.   这个方案的优点是,不需要进程注入,所以实现起来相对简单。同时能够将3G网络和Wifi网络分别禁用,用户体验将更加好。此外由于iptables的功能远不止这些,基于iptables可以实现功能更加强大的防火墙。Iptable虽然好,但是也是有缺点的,运行iptables需要root权限。基于iptables的Android防火墙目前有许多,这里有一个开源的项目http://code.google.com/p/droidwall/

有兴趣的朋友,可以研究一下。目前主流安全软件的联网拦截功能,如360手机卫士,手机毒霸等都是使用这一方案。

3.  总结

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

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

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

3)    如果用户希望不杀死进程就实现上网权限的开关,并且要求可以分别禁用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); //获得当前的拦截状态

Android网络防火墙实现初探相关推荐

  1. 网络防火墙 之 初探Iptables

    在开篇前先放几张网络OSI参考模型图 Netfileter/iptables  是nuix/linux 系统自带的基于包过滤的防火墙工具,完成封包过滤.封包重定向和网络地址转换(NAT)等功能. ip ...

  2. Android智能手机网络防火墙开发的经验心得

    首届 Google 暑期大学生博客分享大赛--2010 Andriod 篇 Android 智能手机网络防火墙开发的经验心得 这篇博客主要讲述我实现一款Android手机上网防火墙的一个经验心得分享. ...

  3. 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  4. android 各种服务介绍,Android 网络服务介绍

    1. 介绍 Android网络服务主要包括如下四个部分 -ConnectivityService: 提供数据连接管理服务,包括移动数据.WIFI.以太网等-NetworkPolicyManagerSe ...

  5. Android网络开发技术实战详解

    <Android网络开发技术实战详解> 基本信息 作者: 朱桂英 丛书名: Android移动开发技术丛书 出版社:电子工业出版社 ISBN:9787121173493 上架时间:2012 ...

  6. Android开源防火墙软件droidwall

    给大家推荐一个开源的防火墙项目,感兴趣的朋友可以研究一下. DroidWall是Android操作系统上一款强大的网络防火墙,软件原理是利用linux中iptables,根据创建iptables规则, ...

  7. Android网络编程系列 一 Socket抽象层

    在<Android网络编程>系列文章中,前面已经将Java的通信底层大致的描述了,在我们了解了TCP/IP通信族架构及其原理,接下来我们就开始来了解基于tcp/ip协议层的Socket抽象 ...

  8. Android网络连接异常处理方案

    Android网络连接异常处理方案 参考文章: (1)Android网络连接异常处理方案 (2)https://www.cnblogs.com/yangcong/p/3523021.html 备忘一下 ...

  9. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

最新文章

  1. Django设计模型1.2
  2. 经典角点检测算法实现
  3. 3.4 usermod命令 3.5 用户密码管理 3.6 mkpasswd命令
  4. 批量导入sql文件。
  5. 转:华为副总裁一封信:透露年薪千万的工作感悟,太震撼了!
  6. git 常用命令备查
  7. 20172329 2017-2018-2 《程序设计与数据结构》实验一报告
  8. linux非权限安装bioperl,bioperl的安装
  9. 结构体structure
  10. 测试面试题集-Python三局两胜小游戏
  11. json与字面量定义对象的区别,请不要混淆,与字符串转换
  12. 【问题10】使用Redis SETNX 命令实现分布式锁
  13. 4173: 数学 欧拉函数 思路题
  14. Unity VR成像原理
  15. 前端练习:day02
  16. HPnbsp;Jetdirectnbsp;打印服务器配置
  17. 华为收入超过阿里腾讯总和!等等,先把鸿蒙说清楚!
  18. cas66-71-7|1,10-菲啰啉有机配体/ 1,10-Phen/邻菲啰啉/邻二氮杂菲
  19. python机器学习快速入门
  20. 后台管理系统——登录功能

热门文章

  1. FEKO网格模型的导出和导入
  2. Unity技能CD的冷却效果实现
  3. java程序祝福新年快乐,各类程序的新年祝福会是什么样的?
  4. 阅读《惰者集》《用数学的语言看世界》感悟
  5. Cisco Secure Firewall 3100 Series, Firepower Threat Defense (FTD) Software 7.2.0 ASA Software 9.18
  6. 【JiyaChieng】(零)Jiya和Chieng的故事
  7. JavaScript运算符详解说明
  8. 微软官方32位版Windows Server 2008下载
  9. 深度学习训练营第6周好莱坞明星人脸识别
  10. Java web对试卷进行单选多选答题进行打分_中考地理:简答题丢分严重,25个标准答题模板,记熟掌握拿满分!...