最近需要验证Android系统源码中一个i2c的漏洞修复问题,没涉及过底层驱动,从一脸懵比到实现验证,记录一下~
I2C(Inter-Intergrated Circuit)指的是 IC(Intergrated Circuit)之间的(Inter) 通信方式。关于介绍可以参考:https://www.cnblogs.com/bhlsheji/p/4286559.html
谷歌官方发布的一个关于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模块占用,于是执行中断了,只好放弃这种方式。
重新构思,通过构造特殊数据和调用,在系统运行中模拟触发场景。然后通过输出log证明合入的安全性和正确性。
增加了一个不去进行数据长度限制的读取块数据的函数。在探测屏幕时调用该函数,传入33作为长度参数(超出块读取最大限制32)来构造特殊场景来触发patch,最后成功执行了patch的代码,系统正常运行。
*引用转载本文需注明出处