Merge pull request 'fib-priv-sep' (#2) from fib-priv-sep into main
Reviewed-on: #2
This commit is contained in:
commit
3765a571cc
1
examples/fib/.gitignore
vendored
Normal file
1
examples/fib/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
fib_priv_sep
|
10
examples/fib/Makefile
Normal file
10
examples/fib/Makefile
Normal file
@ -0,0 +1,10 @@
|
||||
C=clang -Wall
|
||||
|
||||
all: fib_priv_sep
|
||||
|
||||
clean:
|
||||
rm -f fib_priv_sep
|
||||
|
||||
fib_priv_sep: fib_priv_sep.c ../../lib/clone3.c ../../include/clone3.h
|
||||
${C} -I../../include -o fib_priv_sep fib_priv_sep.c ../../lib/clone3.c
|
||||
sudo setcap CAP_SYS_ADMIN+eip ./fib_priv_sep
|
76
examples/fib/fib_priv_sep.c
Normal file
76
examples/fib/fib_priv_sep.c
Normal file
@ -0,0 +1,76 @@
|
||||
// For privilege separation
|
||||
#include <clone3.h>
|
||||
|
||||
#include <linux/wait.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
// This program
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
uint64_t fib(uint64_t i) {
|
||||
uint64_t a = 0;
|
||||
uint64_t b = 1;
|
||||
|
||||
for (; i > 0; i--) {
|
||||
uint64_t old_b = b;
|
||||
b = b + a;
|
||||
a = old_b;
|
||||
}
|
||||
|
||||
return a;
|
||||
}
|
||||
|
||||
int real_main(int argc, char **argv);
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
int pid_fd;
|
||||
|
||||
struct clone_args cl_args = {
|
||||
.flags = CLONE_NEWIPC | CLONE_NEWNET | CLONE_NEWNS | CLONE_NEWPID |
|
||||
CLONE_NEWUSER | CLONE_NEWUTS | CLONE_PIDFD,
|
||||
.pidfd = (uint64_t)&pid_fd,
|
||||
.child_tid = (uint64_t)NULL,
|
||||
.parent_tid = (uint64_t)NULL,
|
||||
.exit_signal = SIGCHLD,
|
||||
.stack = (uint64_t)NULL,
|
||||
.stack_size = 0,
|
||||
.tls = (uint64_t)NULL,
|
||||
};
|
||||
|
||||
pid_t child = clone3(&cl_args);
|
||||
if (child < 0) {
|
||||
perror("clone3");
|
||||
exit(-1);
|
||||
} else if (child == 0) {
|
||||
int code = real_main(argc, argv);
|
||||
exit(code);
|
||||
} else {
|
||||
siginfo_t status;
|
||||
if (waitid(P_PIDFD, pid_fd, &status, WEXITED) == -1) {
|
||||
perror("waitid");
|
||||
return -1;
|
||||
}
|
||||
|
||||
exit(status.si_status);
|
||||
}
|
||||
}
|
||||
|
||||
int real_main(int argc, char **argv) {
|
||||
if (argc != 2) {
|
||||
fprintf(stderr, "expected 1 argument\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
uint64_t i = 0;
|
||||
if (sscanf(argv[1], "%lu", &i) != 1) {
|
||||
fprintf(stderr, "sscanf failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
uint64_t fib_result = fib(i);
|
||||
printf("fib(%lu) = %lu\n", i, fib_result);
|
||||
return 0;
|
||||
}
|
3
include/clone3.h
Normal file
3
include/clone3.h
Normal file
@ -0,0 +1,3 @@
|
||||
#include <linux/sched.h>
|
||||
|
||||
long clone3(struct clone_args *cl_args);
|
7
lib/clone3.c
Normal file
7
lib/clone3.c
Normal file
@ -0,0 +1,7 @@
|
||||
#include <clone3.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <unistd.h>
|
||||
|
||||
long clone3(struct clone_args *cl_args) {
|
||||
return syscall(SYS_clone3, cl_args, sizeof(struct clone_args));
|
||||
}
|
Reference in New Issue
Block a user