Android源码中的i2c模块学习

最近需要验证Android系统源码中一个i2c的漏洞修复问题,没涉及过底层驱动,从一脸懵比到实现验证,记录一下~

I2C(Inter-Intergrated Circuit)指的是 IC(Intergrated Circuit)之间的(Inter) 通信方式。关于介绍可以参考:https://www.cnblogs.com/bhlsheji/p/4286559.html

I2C驱动层次结构
I2C驱动层次结构具体介绍
I2C驱动源代码结构
I2C设备驱动一般结构

谷歌官方发布的一个关于linux内核中的i2c驱动的patch(CVE-2017-18551),patch链接见:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=89c6efa61f5709327ecfa24bff18e57a4e80c7fa                                                                            在我们的定制系统中,需要触发漏洞后验证合入的安全性和合理性。

首先,在kernel_imx/Documentation/i2c/下的dev-interface文件中找到了测试方法,根据文档整理出了测试程序,通过打开设备文件并指定设备地址后,进行自定义读写操作,从而走到i2c-core.c的i2c_smbus_write_i2c_block_data函数的I2C_SMBUS_I2C_BLOCK_DATA case来触发漏洞。

测试程序:打开和指定i2c设备地址

将测试程序编译成可执行文件,拷贝到系统中运行,结果却失败了。我们测试时当屏幕亮起的时候i2c模块就已经初始化完成并且触发,也就是说i2c的端口已经被系统占用。因为测试必须得先指定通信地址才能进行读写,由于通信地址已经被系统的i2c模块占用,于是执行中断了,只好放弃这种方式。

重新构思,通过构造特殊数据和调用,在系统运行中模拟触发场景。然后通过输出log证明合入的安全性和正确性。

有漏洞的读取块数据的函数

增加了一个不去进行数据长度限制的读取块数据的函数。在探测屏幕时调用该函数,传入33作为长度参数(超出块读取最大限制32)来构造特殊场景来触发patch,最后成功执行了patch的代码,系统正常运行。

最终执行到patch代码



*引用转载本文需注明出处

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。