Android网络防火墙实现初探
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网络防火墙实现初探相关推荐
- 网络防火墙 之 初探Iptables
在开篇前先放几张网络OSI参考模型图 Netfileter/iptables 是nuix/linux 系统自带的基于包过滤的防火墙工具,完成封包过滤.封包重定向和网络地址转换(NAT)等功能. ip ...
- Android智能手机网络防火墙开发的经验心得
首届 Google 暑期大学生博客分享大赛--2010 Andriod 篇 Android 智能手机网络防火墙开发的经验心得 这篇博客主要讲述我实现一款Android手机上网防火墙的一个经验心得分享. ...
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...
- android 各种服务介绍,Android 网络服务介绍
1. 介绍 Android网络服务主要包括如下四个部分 -ConnectivityService: 提供数据连接管理服务,包括移动数据.WIFI.以太网等-NetworkPolicyManagerSe ...
- Android网络开发技术实战详解
<Android网络开发技术实战详解> 基本信息 作者: 朱桂英 丛书名: Android移动开发技术丛书 出版社:电子工业出版社 ISBN:9787121173493 上架时间:2012 ...
- Android开源防火墙软件droidwall
给大家推荐一个开源的防火墙项目,感兴趣的朋友可以研究一下. DroidWall是Android操作系统上一款强大的网络防火墙,软件原理是利用linux中iptables,根据创建iptables规则, ...
- Android网络编程系列 一 Socket抽象层
在<Android网络编程>系列文章中,前面已经将Java的通信底层大致的描述了,在我们了解了TCP/IP通信族架构及其原理,接下来我们就开始来了解基于tcp/ip协议层的Socket抽象 ...
- Android网络连接异常处理方案
Android网络连接异常处理方案 参考文章: (1)Android网络连接异常处理方案 (2)https://www.cnblogs.com/yangcong/p/3523021.html 备忘一下 ...
- Android网络之数据解析----SAX方式解析XML数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
最新文章
- Django设计模型1.2
- 经典角点检测算法实现
- 3.4 usermod命令 3.5 用户密码管理 3.6 mkpasswd命令
- 批量导入sql文件。
- 转:华为副总裁一封信:透露年薪千万的工作感悟,太震撼了!
- git 常用命令备查
- 20172329 2017-2018-2 《程序设计与数据结构》实验一报告
- linux非权限安装bioperl,bioperl的安装
- 结构体structure
- 测试面试题集-Python三局两胜小游戏
- json与字面量定义对象的区别,请不要混淆,与字符串转换
- 【问题10】使用Redis SETNX 命令实现分布式锁
- 4173: 数学 欧拉函数 思路题
- Unity VR成像原理
- 前端练习:day02
- HPnbsp;Jetdirectnbsp;打印服务器配置
- 华为收入超过阿里腾讯总和!等等,先把鸿蒙说清楚!
- cas66-71-7|1,10-菲啰啉有机配体/ 1,10-Phen/邻菲啰啉/邻二氮杂菲
- python机器学习快速入门
- 后台管理系统——登录功能
热门文章
- FEKO网格模型的导出和导入
- Unity技能CD的冷却效果实现
- java程序祝福新年快乐,各类程序的新年祝福会是什么样的?
- 阅读《惰者集》《用数学的语言看世界》感悟
- Cisco Secure Firewall 3100 Series, Firepower Threat Defense (FTD) Software 7.2.0 ASA Software 9.18
- 【JiyaChieng】(零)Jiya和Chieng的故事
- JavaScript运算符详解说明
- 微软官方32位版Windows Server 2008下载
- 深度学习训练营第6周好莱坞明星人脸识别
- Java web对试卷进行单选多选答题进行打分_中考地理:简答题丢分严重,25个标准答题模板,记熟掌握拿满分!...