Skip to content

Commit 30ceda3

Browse files
committed
test: add test_d_path_sanitization integration test
A new test is added which builds and runs a small container with a Rust binary that deletes itself and accesses a monitored file. This will trigger an open event where the executable path retrieved by the `bpf_d_path` helper will add a " (deleted)" suffix, the test checks our code correctly strips this suffix.
1 parent 7fe725b commit 30ceda3

File tree

5 files changed

+112
-0
lines changed

5 files changed

+112
-0
lines changed

tests/containers/self-deleter/Cargo.lock

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[package]
2+
name = "self-deleter"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]
7+
8+
[workspace]
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
FROM rust:1.84-alpine AS builder
2+
3+
WORKDIR /app
4+
5+
COPY . .
6+
RUN cargo build --release
7+
8+
FROM alpine:3.23
9+
10+
COPY --from=builder /app/target/release/self-deleter /usr/local/bin
11+
12+
ENTRYPOINT ["self-deleter"]
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
use std::{
2+
fs::{remove_file, File},
3+
io::Write,
4+
};
5+
6+
fn main() {
7+
let exe_path = std::env::current_exe().expect("Failed to get executable path");
8+
println!("Removing executable: {}", exe_path.display());
9+
remove_file(exe_path).expect("Failed to remove executable");
10+
11+
let mut args = std::env::args();
12+
let path = args.nth(1).expect("File to modify not provided");
13+
14+
println!("Opening file: {path}");
15+
let mut f = File::create(path).expect("Failed to create test file");
16+
f.write_all(b"This is a test")
17+
.expect("Failed to write to test file");
18+
}

tests/test_misc.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import os
2+
3+
from conftest import dump_logs
4+
from event import Event, EventType, Process
5+
6+
import pytest
7+
8+
9+
@pytest.fixture
10+
def build_self_deleter(docker_client):
11+
image, _ = docker_client.images.build(
12+
path='containers/self-deleter',
13+
tag='self-deleter:latest',
14+
dockerfile='Containerfile'
15+
)
16+
return image
17+
18+
19+
@pytest.fixture
20+
def run_self_deleter(fact, monitored_dir, logs_dir, docker_client, build_self_deleter):
21+
image = build_self_deleter.tags[0]
22+
container = docker_client.containers.run(
23+
image,
24+
'/mounted/test.txt',
25+
detach=True,
26+
volumes={
27+
monitored_dir: {
28+
'bind': '/mounted',
29+
'mode': 'z',
30+
},
31+
},
32+
name='self-deleter',
33+
)
34+
35+
yield container
36+
37+
container_log = os.path.join(logs_dir, 'self-deleter.log')
38+
container.stop(timeout=1)
39+
dump_logs(container, container_log)
40+
container.remove()
41+
42+
43+
def test_d_path_sanitization(fact, monitored_dir, server, run_self_deleter, docker_client):
44+
"""
45+
Ensure the sanitization of paths obtained by calling the bpf_d_path
46+
helper don't include the " (deleted)" suffix when the file is
47+
removed.
48+
"""
49+
# File Under Test
50+
fut = '/mounted/test.txt'
51+
host_path = os.path.join(monitored_dir, 'test.txt')
52+
53+
container = run_self_deleter
54+
55+
process = Process(pid=None,
56+
uid=0,
57+
gid=0,
58+
exe_path='/usr/local/bin/self-deleter',
59+
args=f'self-deleter {fut}',
60+
name='self-deleter',
61+
container_id=container.id[:12],
62+
loginuid=pow(2, 32)-1)
63+
event = Event(process=process, event_type=EventType.OPEN,
64+
file=fut, host_path=host_path)
65+
print(f'Waiting for event: {event}')
66+
67+
server.wait_events([event])

0 commit comments

Comments
 (0)