linux备忘-必须使用copy_from_user的原因

4 篇文章 1 订阅
3 篇文章 0 订阅

关于为什么要使用copy_from_user/copy_to_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功能,为何还要重复造轮子?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值