5个版本
0.1.4 | 2023年11月27日 |
---|---|
0.1.3 | 2023年11月26日 |
0.1.2 | 2023年11月25日 |
0.1.1 | 2023年11月25日 |
0.1.0 | 2023年11月25日 |
174 in 操作系统
12KB
181 行
void-ship ⚫🚀
void-ship是一个简单的库,仅用于执行一项任务 - 移除进程访问vDSO的能力。
vDSO? vvar?
为了能够在不进行昂贵系统调用的前提下快速访问系统时钟,Linux提供了对用户空间进程的vDSO(虚拟动态共享对象)和vvar映射。这些内存区域允许进程访问准确且快速的时钟。
为什么需要移除访问权限?
准确的时钟是侧信道攻击的基本原语。通过移除vDSO,进程必须发出系统调用或以其他方式“伪造”一个时钟,以便获取准确的计时器。
应将此库与seccomp过滤器一起使用,以阻止访问clock_gettime
系统调用以及防止创建线程、分配内存或其他攻击者可能用来创建时钟的基本操作。考虑使用extrasafe这样的crate来帮助实现这一点。
注意:此库只能在Linux上运行。在其他所有平台上,它将简单地什么都不做,所有公共函数都返回Ok(())
。
警告!
手动取消映射vDSO和vvar映射是奇怪的,如果不小心,可能会导致事情破裂。此库旨在在非常特定的上下文中使用 - 一个具有极度限制性seccomp过滤器的进程,该进程几乎什么也不做,只执行纯函数。
用法
void-ship
提供两个主要功能
- remove_timer_mappings():移除vDSO和vvar映射。
- replace_timer_mappings():移除映射并在其位置设置保护页面。
示例
use void_ship::{remove_timer_mappings, replace_timer_mappings};
fn main() {
let should_replace = true;
if should_replace {
replace_timer_mappings().expect("Unable to replace timer mappings");
} else {
remove_timer_mappings().expect("Unable to remove timer mappings");
}
// Attempting to get the system time via vDSO will now segfault.
}
测试
如果您想验证库按预期工作,可以将test-clock
功能添加到crate中,该功能导出test_clock
函数。
请注意,此函数将执行以下操作之一
- 如果移除了vDSO,则段错误(您想要的)
- 如果未移除vDSO,则恐慌
- 如果据说已移除vDSO但
clock_gettime
系统调用仍然工作,则恐慌 - 在不受支持的平台上执行时恐慌
基本上,如果您没有明确测试此crate是否按预期工作,则永远不要调用此函数。
use void_ship::{replace_timer_mappings, test_clock};
fn main() {
replace_timer_mappings().expect("Unable to replace timer mappings");
test_clock(); // will panic or segfault!!!
}
依赖关系
~43KB