OS内的IPC攻击

confused deputy

man in the middle

CVE

CVE(Common Vulnerabilities and Exposures)的全称是公共漏洞和暴露,是公开披露的网络安全漏洞列表。

CVE漏洞信息由CVE组织机构的网站承载(CVE -CVE

在CVE中,每个漏洞按CVE-1999-0067、CVE-2014-10001、CVE-2014-100001这样的形式编号。每个漏洞都被分配一个称为CVE标识符的编号,编号格式为“CVE-年份-编号”,例如CVE-2019-0708代表远程桌面服务远程代码执行漏洞。

CVE的发布主体是CVE编号机构(CVE Numbering Authority,CNA),当前大约有100个CNA,由来自世界各地的IT供应商、安全公司和安全研究组织组成。任何机构或个人都可以向CNA提交漏洞报告,CNA对应的组织往往也会鼓励人们寻找漏洞,以增强产品的安全性。

  • EXP:全称 ' Exploit ',中文 ' 利用 ',指利用系统漏洞进行攻击的动作。
  • POC:全称 ' Proof of Concept ',中文 ' 概念验证 ' ,常指一段漏洞证明的代码。
  • Payload:中文 ' 有效载荷 ',指成功exploit之后,真正在目标系统执行的代码或指令。
  • Shellcode:简单翻译 ' shell代码 ',是Payload的一种,由于其建立正向/反向shell而得名。

CVE-2011-1823

NVD - CVE-2011-1823

CVE-2011-1823,是一种利用Android系统中的漏洞来获取Root权限的方法。

1. 漏洞信息

  • GingerBreak的原理主要涉及到两个漏洞:

(1)Zygote进程的UID映射错误漏洞:

在Android系统中,Zygote进程是所有应用程序进程的父进程,当一个应用程序启动时,Zygote进程会创建一个新的进程,并为其分配一个唯一的UID。然而,由于一个错误的UID映射,Zygote进程有时会将一个已经存在的UID分配给新创建的进程,这样就会导致新进程具有Root权限。

(2)vold进程中的setuid错误漏洞:

vold进程是负责处理存储设备的守护进程,它包括读写存储设备、挂载和卸载存储设备等功能。在vold进程的代码中,有一个setuid函数用于将当前进程的UID设置为指定的UID。然而,由于一处setuid函数的错误调用,vold进程在某些情况下会将自身的UID设置为Root权限,从而获取Root权限。

GingerBreak利用了这两个漏洞来获取Root权限。它首先通过一个特殊的应用程序,使得Zygote进程创建一个新的进程,并将Root权限的UID分配给该进程。然后,它利用vold进程的setuid错误漏洞,将自身的UID设置为Root权限。最后,GingerBreak会启动一个Shell,用户可以在其中执行Root命令。

  • CVE-2011-1823

CVE-2011-1823漏洞的核心在于Android系统中vold卷管理守护程序对来自PF_NETLINK套接字的消息的信任。攻击者可以利用这个信任关系,通过发送特定的消息来执行恶意代码并获得root权限。这种特权提升漏洞可以允许攻击者绕过正常的安全限制,执行危险的系统操作。

2.漏洞描述

漏洞影响版本: Android 3.0及之前的2.x版本,具体到2.3.4之前的版本。

漏洞描述: vold进程对从PF_NETLINK套接字接收到的消息过于信任,导致攻击者可以利用一个负数索引来绕过只检查最大值的有符号整数检测。这种设计缺陷使得攻击者能够通过精心构造的消息,向vold发送恶意命令并以root权限执行任意代码。

//未修复的handlePartitionAdded代码
void DirectVolume::handlePartitionAdded(const char *devpath, NetlinkEvent *evt) 
{
    int major = atoi(evt->findParam("MAJOR"));
    int minor = atoi(evt->findParam("MINOR"));
 
    int part_num;
 
    //从NETLINK消息中获取PARTN参数
    const char *tmp = evt->findParam("PARTN");
 
    if (tmp){
        part_num = atoi(tmp);
    } else {
        SLOGW("Kernel block uevent missing 'PARTN'");
        part_num = 1;
    }
 
    //检查动态增长的成员变量,但是并没有定义绝对的数组边界
    if (part_num > MAX_PARTITIONS){
       mDiskNumParts = part_num;
    }
 
    if (major != mDiskMajor){
        SLOGE("Partition '%s' has a different major than its disk!", devpath);
        return;
    }
	
	
    //将用户控制的值存在了用户控制的下标所对应的数组元素中,只检查了上界
    if (part_num >= MAX_PARTITIONS){
        SLOGE("Dv:partAdd: ignoring part_num = %d (max: %d)\n", part_num, MAX_PARTITIONS-1);
    } 
	
	//....
}

数组下标问题

part_num 变量被用作数组 mPartMinors 的下标,但并没有进行足够的边界检查。特别是,没有检查是否 part_num 是一个非负数,这导致了潜在的堆溢出或者越界访问问题。

3.漏洞利用(Exploit)

漏洞的利用方法通常包括以下步骤:

  1. 构造恶意消息: 攻击者通过发送经过精心构造的消息到vold进程的PF_NETLINK套接字来触发漏洞。
  2. 绕过检测: 利用负数索引绕过vold进程对有符号整数的检测。
  3. 执行恶意代码: 一旦漏洞被利用成功,攻击者可以在受影响的设备上以root权限执行任意代码。这可能包括安装恶意应用程序、窃取用户数据等危险行为。

攻击场景

攻击者可以通过发送恶意构造的 NETLINK 消息,将一个负数作为 PARTN 参数的值传入。由于 part_num 是一个整数,而不是无符号整数,这个负数将被解释为一个合法的下标,导致程序试图访问 mPartMinors 数组中负数下标对应的位置,这可能引发以下问题:

  • 堆溢出:如果 part_num 是一个非常大的负数,程序可能会尝试访问到 mPartMinors 数组之前的堆内存,这可能包含其他数据或者没有分配给程序的内存。
  • 程序崩溃:试图访问无效或未分配的内存区域可能导致程序崩溃或者异常终止,影响系统稳定性。

4.漏洞修复

//增加边界检测
if (part_num > MAX_PARTITIONS || part_num < 1) 
{
        SLOGE("Invalid 'PARTN' value");
        return;
}
if (part_num > mDiskNumParts) 
{
        mDiskNumParts = part_num;
}
 

5.总结
CVE-2011-1823是一个严重的Android安全漏洞,允许攻击者以root权限执行任意代码,通过利用vold进程对网络套接字消息的信任不足来实现攻击。及时更新和合理的权限控制是防止这类漏洞利用的有效措施。

CVE-2011-3918

Android 4.0.3 及更低版本中的 Zygote 进程接受来自具有任意 UID 的进程的分叉请求,这允许远程攻击者通过构建的应用程序造成拒绝服务(重启循环)。

Zygote进程角色:Zygote是Android系统中的一个关键进程,负责预加载常见的应用程序资源和类库,以便加速应用程序的启动速度。它通过复制自身来快速生成新的应用程序进程。

分叉请求的处理:在Android中,当一个应用程序被启动时,Zygote接收来自系统进程或已授权应用程序的请求,用于创建新的应用程序进程。这个过程通过分叉(forking)完成,即在Zygote进程的基础上复制一个新进程来运行应用程序。

权限控制:正常情况下,Zygote进程只应该接受来自具有特定权限或预定义UID的进程的请求。这种限制是为了确保系统的安全性和稳定性,防止未授权的应用程序干扰系统运行。

CVE-2011-3918的漏洞:CVE-2011-3918的漏洞允许攻击者创建一个应用程序,并将其UID设置为任意非系统预定义值。然后,该恶意应用程序可以模拟正常的应用程序启动过程,向Zygote发送伪造的分叉请求,请求系统生成新的进程。由于Zygote没有正确验证请求的来源是否具有必要的权限,因此可能会执行这些请求,从而导致上述安全问题的发生。

潜在后果:拒绝服务状态(DoS):攻击者可以利用这个漏洞导频繁生成新进程,可能导致系统资源枯竭或者设备陷入无限重启循环。

  • 11
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值