Compare commits

..

11 Commits

Author SHA1 Message Date
f7720356f3 increase mmap size 2024-10-11 14:47:47 +02:00
dd6fb23a9e add mlockall to lock secret_mem 2024-09-25 14:00:59 +02:00
f243b7b95c disable coredumps for process 2024-09-25 13:46:05 +02:00
7e45cd719e disable speculative store bypass 2024-09-25 11:11:12 +02:00
5757ed1140 chore: remove .envrc 2024-08-28 10:01:02 +02:00
bfb77a8368 accept agent as prebuild lib 2024-08-27 16:00:43 +02:00
081cac7074 pass agent as input 2024-08-27 15:54:48 +02:00
32d799a5e8 update agent 2024-08-27 10:38:18 +02:00
13f852bd20 Make sure private_file does not get closed by rusts borrow checker 2024-08-26 12:42:36 +02:00
a8ab06df98 update agent 2024-08-23 13:21:20 +02:00
f50bd5ea91 update agent 2024-08-23 11:01:21 +02:00
4 changed files with 37 additions and 28 deletions

1
.envrc
View File

@@ -1 +0,0 @@
use nix

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
/target /target
result result
.direnv

View File

@@ -1,14 +1,7 @@
{ pkgs ? import <nixpkgs> { } }: { pkgs ? import <nixpkgs> { }
, agent
}:
with pkgs; with pkgs;
let
agent_src = fetchgit {
url = "https://gitea.rixxc.de/rixxc/x25519_agent.git";
rev = "36ae72a8d90d94b5b0d1fd01adf50a33edd80e80";
hash = "sha256-SxXZ/1CRi4J6Neq1uXIbue0bFa8WzdXPBnoXCjekOy8=";
};
agent = callPackage "${agent_src}/default.nix" { };
in
rustPlatform.buildRustPackage { rustPlatform.buildRustPackage {
name = "agent-harness"; name = "agent-harness";
src = nix-gitignore.gitignoreSource [ ] ./.; src = nix-gitignore.gitignoreSource [ ] ./.;
@@ -17,5 +10,5 @@ rustPlatform.buildRustPackage {
buildInputs = [ agent ]; buildInputs = [ agent ];
cargoSha256 = "sha256-ZgwQr1goz9yPws0P1eQwhHEv2WbcJeTCLEPYOUADOtE="; cargoHash = "sha256-ZgwQr1goz9yPws0P1eQwhHEv2WbcJeTCLEPYOUADOtE=";
} }

View File

@@ -1,18 +1,36 @@
use libc::{ use libc::{
c_char, c_int, c_void, mmap, perror, MAP_FAILED, MAP_PRIVATE, MAP_SHARED, PROT_READ, PROT_WRITE, c_int, c_void, mlockall, mmap, prctl, MAP_FAILED, MAP_SHARED, MCL_FUTURE, PROT_READ,
PROT_WRITE, PR_SET_DUMPABLE, PR_SET_SPECULATION_CTRL, PR_SPEC_FORCE_DISABLE,
PR_SPEC_STORE_BYPASS,
}; };
use std::fs::File; use std::fs::File;
use std::os::fd::AsRawFd; use std::os::fd::AsRawFd;
use std::{env, ptr}; use std::{env, ptr};
const SHARED_MEMORY_SIZE: usize = 1024; const SHARED_MEMORY_SIZE: usize = 1024 * 1024;
#[link(name = "agent")] #[link(name = "agent")]
extern "C" { extern "C" {
fn agent_start(shared_memory: *mut u8, sync_memory: *mut u8, private_mem: *mut u8); fn agent_start(shared_memory: *mut u8, sync_memory: *mut u8, private_mem_fd: u64);
} }
fn main() { fn main() {
unsafe {
assert!(
prctl(
PR_SET_SPECULATION_CTRL,
PR_SPEC_STORE_BYPASS,
PR_SPEC_FORCE_DISABLE,
0,
0,
) >= 0,
);
}
unsafe {
assert!(prctl(PR_SET_DUMPABLE, 0) == 0);
}
let args: Vec<String> = env::args().collect(); let args: Vec<String> = env::args().collect();
let shared_fd: c_int = args[0] let shared_fd: c_int = args[0]
@@ -21,7 +39,7 @@ fn main() {
let sync_fd: c_int = args[1] let sync_fd: c_int = args[1]
.parse() .parse()
.expect("Please provide a valid file descriptor as first argument"); .expect("Please provide a valid file descriptor as second argument");
let shared_memory = unsafe { let shared_memory = unsafe {
mmap( mmap(
@@ -53,19 +71,17 @@ fn main() {
.open(&args[2]) .open(&args[2])
.expect("Cannot open KEY_FILE"); .expect("Cannot open KEY_FILE");
let private_mem = unsafe { unsafe {
mmap( assert!(mlockall(MCL_FUTURE) == 0);
ptr::null_mut() as *mut c_void, }
32 * 100,
PROT_READ | PROT_WRITE,
MAP_SHARED,
private_file.as_raw_fd(),
0,
)
} as *mut u8;
assert_ne!(private_mem, MAP_FAILED as *mut u8);
unsafe { unsafe {
agent_start(shared_memory, sync_memory, private_mem); agent_start(
shared_memory,
sync_memory,
private_file.as_raw_fd().try_into().unwrap(),
);
} }
drop(private_file); // don't drop (and close) private file before here
} }