WIKI

10.5 网络端口开放威胁检测

(1)描述

Android应用通常使用PF_UNIXPF_INETPF_NETLINK等不同domainsocket来进行本地IPC或者远程网络通信,这些暴露的socket代表了潜在的本地或远程攻击面,历史上也出现过不少利用socket进行拒绝服务、root提权或者远程命令执行的案例。特别是PF_INET类型的网络socket,可以通过网络与Android应用通信,其原本用于linux环境下开放网络服务,由于缺乏对网络调用者身份或者本地调用者idpermission等细粒度的安全检查机制,在实现不当的情况下,可以突破Android的沙箱限制,以被攻击应用的权限执行命令,通常出现比较严重的漏洞。

(2)风险等级

(3)影响范围

所有

(4)检测方法

检测类型:静态分析+动态分析

0x01 静态检测方法

重点关注ServerSocket(TCP)DatagramSocket(UDP)等类。

 

检测是否调用以下函数,有则说明使用了TCPUDP进行通讯,开启了端口:

 

Ljava/net/DatagramSocket;-><init>(I)V

Ljava/net/DatagramPacket;-><init>([BILjava/net/InetAddress;I)V

Ljava/net/DatagramSocket;->receive(Ljava/net/DatagramPacket;)V

 

Ljava/net/ServerSocket;-><init>(I)V

Ljava/net/ServerSocket;->accept()Ljava/net/Socket;

 

0x02 动态监测方法

Step1:利用netstat寻找感兴趣的开发socket端口

例如:联想的乐助手app

adb shell netstat -a | grep -E “LISTEN|udp*”

Step2:将端口转换为十六进制,查看位于/proc/net目录下对应的socket套接字状态文件,在其中找到使用该socket的应用uid

例如上面的10005端口。

10005 = 0x2715

adb shell grep -i 2715 /proc/net/tcp6

其中5801A8C0是本地IPhex格式,逆序;2715是端口号;10049uid。在android中,uid大于10000的是应用程序创建的用户。
ps
的第一列是uid,大于10000uid会以u0_a开头,10049显示为u0_a49,最后一列就是进程名。

Step3:根据用户名找到应用

adb shell ps | grep u0_a49

(5)修复建议

直接传递命令字或者间接处理有敏感信息或操作时,避免使用socket实现,使用身份认证、鉴权、参数校验等安全要素。

(6)样例分析

http://www.wooyun.org/bugs/wooyun-2015-0145365

http://www.wooyun.org/bugs/wooyun-2015-0148406

(7)参考资料

l  http://wolfeye.baidu.com/blog/open-listen-port

l  http://blog.csdn.net/jltxgcy/article/details/50686858

l  https://www.bigniu.com/article/view/10

l  http://drops.wooyun.org/mobile/6973

l  http://www.droidsec.cn/%E5%86%8D%E8%B0%88app%E7%BD%91%E7%BB%9C%E7%AB%AF%E5%8F%A3%E5%BC%80%E6%94%BE%E9%97%AE%E9%A2%98/%AB%AF%E5%8F%A3%E7%9A%84%E5%AE%89%E5%85%A8%E9%A3%8E%E9%99%A9/

l  http://www.droidsec.cn/%E6%B5%85%E8%B0%88android%E5%BC%80%E6%94%BE%E7%BD%91%E7%BB%9C%E7

l  http://blog.chinaunix.net/uid-14132119-id-4353275.html