#side-channel #linux #time #security #vdso #linux-process #system-time

void-ship

一个用于移除对vDSO和vvar访问的crate

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 操作系统

MIT许可证

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提供两个主要功能

  1. remove_timer_mappings():移除vDSO和vvar映射。
  2. 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函数。

请注意,此函数将执行以下操作之一

  1. 如果移除了vDSO,则段错误(您想要的)
  2. 如果未移除vDSO,则恐慌
  3. 如果据说已移除vDSO但clock_gettime系统调用仍然工作,则恐慌
  4. 在不受支持的平台上执行时恐慌

基本上,如果您没有明确测试此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