龙芯开源社区

 找回密码
 注册新用户(newuser)
楼主: 任若兮

loongson3A写保护及可执行位

[复制链接]
 楼主| 发表于 2015-12-30 14:26:59 | 显示全部楼层
opensrc 发表于 2015-12-29 18:28
这是一个很有趣的问题。根据我现在的理解,对kseg0的只读只能间接实现。kseg0是不通过映射访问的地址,但 ...

谢谢!我觉得对于不经过TLB映射的,尽管能在程序里指定其映射到某一物理页上,但在访问时应该还是没有经过TLB转换的。或者说是把kseg0区域某一页对应的物理地址再重新通过TLB映射到其他mapped区域,不过这样可行吗?不是应该低端物理地址是直接与kseg0、kseg1对应的,允许再重新映射到其他地方吗?这样的话内核该怎么管理这段内存呢?不过还是可以试一试……
 楼主| 发表于 2015-12-30 14:28:34 | 显示全部楼层
华中科大一学生 发表于 2015-12-30 10:22
敢问你研究的是什么内核?

版本是2.6.36,在cpu-features.h里定义的是kernel_uses_smartmips_rixi为0……
 楼主| 发表于 2015-12-30 14:30:42 | 显示全部楼层
opensrc 发表于 2015-12-30 12:44
华少,一个请求。龙芯文档里还有像 RI/XI 这样应该有但是却没有的东东吗?如果可能的话,你可以写一个简 ...

强烈支持!!!
发表于 2015-12-30 14:47:18 | 显示全部楼层
任若兮 发表于 2015-12-30 14:28
版本是2.6.36,在cpu-features.h里定义的是kernel_uses_smartmips_rixi为0……

你的研究姿势不对哦,请用3.10版本,http://dev.lemote.com/files/uplo ... x-3.10-1714.tar.bz2
 楼主| 发表于 2015-12-30 16:18:15 | 显示全部楼层
华中科大一学生 发表于 2015-12-30 14:47
你的研究姿势不对哦,请用3.10版本,http://dev.lemote.com/files/upload/lm/kernel/testing/linux-3.10- ...

主要是我目前研究的是老师项目的一个平台,他们用的就是这个版本的内核……
发表于 2015-12-30 18:08:33 | 显示全部楼层
任若兮 发表于 2015-12-30 16:18
主要是我目前研究的是老师项目的一个平台,他们用的就是这个版本的内核……

这样的话我只能说爱莫能助了,学校啊,真的要学会与时俱进,不能闭门造车。
发表于 2015-12-31 01:03:09 | 显示全部楼层
本帖最后由 opensrc 于 2015-12-31 01:04 编辑
任若兮 发表于 2015-12-30 14:26
谢谢!我觉得对于不经过TLB映射的,尽管能在程序里指定其映射到某一物理页上,但在访问时应该还是没有经过TLB转换的 ...
所谓是否需要TLB映射,是虚拟地址段的特性,和物理地址无关的。你可以通过TLB把别的一个区域映射到你的kseg0对应的物理地址上,那么通过这个映射来访问这个地址就是映射并通过缓存的。也可以实现你所需要的只读特性。

使用你给出的地址的程序并不知道具体物理地址:内核就是这样欺骗用户程序的,
 楼主| 发表于 2016-1-4 09:30:29 | 显示全部楼层
opensrc 发表于 2015-12-31 01:03
所谓是否需要TLB映射,是虚拟地址段的特性,和物理地址无关的。你可以通过TLB把别的一个区域映射到你的kseg ...

恩恩,那不经TLB映射的内核代码是怎么保证只读的?难道就没有这方面的攻击吗?或者说若是可以经过TLB映射改变内核代码映射的物理地址的属性,那么攻击者是否可以将内核代码对应的物理地址重映射到其他的地方,实现恶意篡改什么的?
发表于 2016-1-4 10:57:46 | 显示全部楼层
任若兮 发表于 2016-1-4 09:30
恩恩,那不经TLB映射的内核代码是怎么保证只读的?难道就没有这方面的攻击吗?或者说若是可以经过TLB映射 ...

如果你都能改内核代码了,谁都挡不住你,你说是不是?你所研究的攻防肯定不是在这个层次,对吧?
 楼主| 发表于 2016-1-11 09:09:00 | 显示全部楼层
任若兮 发表于 2015-12-29 16:00
谢谢啊!RI/XI确实是TLB的属性位,只是我目前研究的内核好像不支持这两位,所以之前都没有注意到。4G的虚 ...

我在内核里增加了一个系统调用,其根据进程mm_struct结构及虚拟地址addr,调用pgd_offset、pud_offset、pmd_offset及pte_offset函数,找到虚拟地址addr对应的页表项,然后调用pte_wrprotect函数及set_pte函数,设置对应页表项的dirty位和write位都为0,改为不可写,再flush_tlb_page刷新页表项对应的TLB。再写了一个用户程序,其调用malloc申请一段4K空间,全部写1,之后调用上面的系统调用,再延时一段时间,重新向那段空间全部写10,没有发生任何异常。用ejtag查看,其4K对应地址空间全部变为10,该pte项的dirty位和write位也都变为了1 。请问一下这中间是还有什么没有设置好吗?调了好久,一直没有找到原因……

本版积分规则

小黑屋|手机版|Archiver|Lemote Inc.  

GMT+8, 2019-3-20 06:42 , Processed in 0.195982 second(s), 14 queries .

快速回复 返回顶部 返回列表