跟踪页面 table 对 Linux 进程的访问
Trace page table access of a Linux process
我写信询问是否可以跟踪一个普通Linux用户的页面table访问(根据每个页面table访问的"index")应用。基本上,我所做的是重现这篇研究文章中提到的利用(https://www.ieee-security.org/TC/SP2015/papers-archived/6949a640.pdf)。特别是,数据页面访问需要被记录以用于程序秘密的使用和推断。
我了解Linux系统,64位x86架构,页面table大小为4K。我已经使用 pin
(https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool) 来记录所有虚拟内存访问的地址跟踪。那么我可以简单地计算每个数据页table访问的"index",用下面的翻译规则吗?
index = address >> 15
自 4KB = 2 ^ 15
。这是正确的吗?预先感谢您提出任何建议或意见。
此外,我想我想指出的一件事是,从概念上讲,我不需要每个数据页的 "precise" 标识符 table ID,而只需要一个数字 ("index")区分不同数据页的访问。与他们的攻击相比,这将提供概念上相同数量的信息。
好的,所以你真的不需要 "index",只需要一些唯一的标识符来区分进程虚拟地址中的不同页面。
这种情况下,就address >> PAGE_SHIFT
就行了。在具有 4KB 页面的 x86 中 PAGE_SHIFT
is 12
,因此您可以:
page_id = address >> 12
然后如果 address1
和 address2
对应于同一页,则两个地址的 page_id
将相同。
或者,要获得相同的结果,您可以执行 address & PAGE_MASK
,其中 PAGE_MASK
只是 0xfffffffffffff000
(即 ~((1UL << PAGE_SHIFT) - 1)
)。
我写信询问是否可以跟踪一个普通Linux用户的页面table访问(根据每个页面table访问的"index")应用。基本上,我所做的是重现这篇研究文章中提到的利用(https://www.ieee-security.org/TC/SP2015/papers-archived/6949a640.pdf)。特别是,数据页面访问需要被记录以用于程序秘密的使用和推断。
我了解Linux系统,64位x86架构,页面table大小为4K。我已经使用 pin
(https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool) 来记录所有虚拟内存访问的地址跟踪。那么我可以简单地计算每个数据页table访问的"index",用下面的翻译规则吗?
index = address >> 15
自 4KB = 2 ^ 15
。这是正确的吗?预先感谢您提出任何建议或意见。
此外,我想我想指出的一件事是,从概念上讲,我不需要每个数据页的 "precise" 标识符 table ID,而只需要一个数字 ("index")区分不同数据页的访问。与他们的攻击相比,这将提供概念上相同数量的信息。
好的,所以你真的不需要 "index",只需要一些唯一的标识符来区分进程虚拟地址中的不同页面。
这种情况下,就address >> PAGE_SHIFT
就行了。在具有 4KB 页面的 x86 中 PAGE_SHIFT
is 12
,因此您可以:
page_id = address >> 12
然后如果 address1
和 address2
对应于同一页,则两个地址的 page_id
将相同。
或者,要获得相同的结果,您可以执行 address & PAGE_MASK
,其中 PAGE_MASK
只是 0xfffffffffffff000
(即 ~((1UL << PAGE_SHIFT) - 1)
)。