linux备忘-必须使用copy_from_user的原因
作者:互联网
关于为什么要使用copy_from_user的一些原因
首先必须明确一点,不使用copy_from_user而是用memcopy在一些情况下是完全可以的(比如关闭了CONFIG_ARM64_SW_TTBR0_PAN 内核配置后)。
之所以要使用copy_from_user有以下2个原因
安全性
memcpy函数只是一个内存搬运,而copy_from_user有做access_ok判断(内核地址安全访问,具体看内核该函数定义)。
两相比较,显而易见的是memcpy并不安全。用户在对接口进行攻击时完全可以传入一个内核指针到接口中直接把系统搞死。比较著名的一个案例是waitid 案例(百度源码以及修复),就是没有使用access_ok判断,导致传去一个pid 为0的指针进去,直接把程序提升成为root 进程。
兼容性
在arm64架构中有PSTATE状态位,当开启内核配置CONFIG_ARM64_SW_TTBR0_PAN后,会完全隔离开内核空间以及用户空间,这时候使用memcpy就会出现错误而无法拷贝。但使用copy_from_user则没有这个问题,因为copy_from_user实现中有进行状态的设置,导致可以跨越空间拷贝。
后记
问: 既然如此,那我在使用memcpy的时候进行 access_ok判断以及切换PSTATE状态可以吗?
答:可以。但既然如此,你已经是自己实现了copy_from_user功能,为何还要重复造轮子?
标签:使用,备忘,access,内核,linux,copy,memcpy,user 来源: https://blog.csdn.net/qq_30027083/article/details/120650075