在函数
qcedev_vbuf_ablk_cipher_max_xfer里,我们发现它没有再使用指针
creq->in_place_op,也没有对地址creq->vbuf.dst[i].vaddr做验证,我们还可以看到该函数最后是使用
__copy_to_user而不是copy_to_user从变量k_align_dst复制数据到地址creq->vbuf.dst[i].vaddr
由于**
copy_to_user** 本质上只是memcpy,且** copy_to_user** 的目标地址是creq->vbuf.dst[dst_i].vaddr,这个地址用户态控制可以,这样漏洞就被坐实了,我们得到了一个内核任意地址写漏洞。
再看一下漏洞触发的位置,源地址是
k_align_dst,这是一个局部变量,下面看这个地址的内容能否控制。
在函数
qcedev_vbuf_ablk_cipher_max_xfer的行1160可以看到,变量
k_align_dst的值是从用户状态地址拷贝过来的,可以被控制,但是,还没有完成
行1195调用函数
submit_req,该函数的作用是提交一个缓冲区给高通加解密引擎进行加解密,buffer的设置由函数
sg_set_buf完成,通过行1186可以看到,标记
k_align_dst就是被传进去的缓冲区,经过这个操作后,标记
k_align_dst的值会被改变,即我们通过__copy_to_user传入给定creq->vbuf.dst[dst_i].vaddr 的值是被加密或者解密过一次的值。
咨询:
@PipiShrimp