Skip to content

Commit a5d3ba9

Browse files
authored
Merge pull request #47 from MaxHearnden/syscalls-for-wrap
Add syscalls needed for a simple sandbox
2 parents 29ea887 + 6f8fda3 commit a5d3ba9

File tree

12 files changed

+374
-2
lines changed

12 files changed

+374
-2
lines changed

aarch64/aarch64_defs.M1

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ DEFINE SUB_X0_X0_X1 000001cb
117117
DEFINE SUB_X0_8 002000d1
118118
DEFINE SUB_X0_16 004000d1
119119
DEFINE SUB_X0_24 006000d1
120+
DEFINE SUB_X0_32 008000d1
121+
DEFINE SUB_X0_40 00A000d1
120122
DEFINE MSUB_X0_X0_X2_X1 0084029b
121123

122124
DEFINE MUL_X0_X1_X0 207c009b
@@ -160,4 +162,9 @@ DEFINE SET_X8_TO_SYS_WAIT4 882080d2
160162
DEFINE SET_X8_TO_SYS_WRITE 080880d2
161163
DEFINE SET_X8_TO_SYS_UNLINK 488080d2
162164
DEFINE SET_X8_TO_SYS_UMASK c81480d2
165+
DEFINE SET_X8_TO_SYS_UNSHARE 280c80d2
166+
DEFINE SET_X8_TO_SYS_GETEUID e81580d2
167+
DEFINE SET_X8_TO_SYS_GETEGID 081680d2
168+
DEFINE SET_X8_TO_SYS_CHROOT 680680d2
169+
DEFINE SET_X8_TO_SYS_MOUNT 080580d2
163170
DEFINE SYSCALL 010000d4

aarch64/linux/unistd.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,4 +197,51 @@ int uname(struct utsname* unameData)
197197
"SYSCALL");
198198
}
199199

200+
int unshare(int flags) {
201+
asm (
202+
"SET_X0_FROM_BP" "SUB_X0_8" "DEREF_X0"
203+
"SET_X8_TO_SYS_UNSHARE"
204+
"SYSCALL"
205+
);
206+
}
207+
208+
int geteuid() {
209+
asm (
210+
"SET_X8_TO_SYS_GETEUID"
211+
"SYSCALL"
212+
);
213+
}
214+
215+
int getegid() {
216+
asm (
217+
"SET_X8_TO_SYS_GETEGID"
218+
"SYSCALL"
219+
);
220+
}
221+
222+
int chroot(char const *path) {
223+
asm (
224+
"SET_X0_FROM_BP" "SUB_X0_8" "DEREF_X0"
225+
"SET_X8_TO_SYS_CHROOT"
226+
"SYSCALL"
227+
);
228+
}
229+
230+
int mount(char const *source, char const *target, char const *filesystemtype,
231+
ulong mountflags, void const *data) {
232+
asm (
233+
"SET_X0_FROM_BP" "SUB_X0_40" "DEREF_X0"
234+
"SET_X4_FROM_X0"
235+
"SET_X0_FROM_BP" "SUB_X0_32" "DEREF_X0"
236+
"SET_X3_FROM_X0"
237+
"SET_X0_FROM_BP" "SUB_X0_24" "DEREF_X0"
238+
"SET_X2_FROM_X0"
239+
"SET_X0_FROM_BP" "SUB_X0_16" "DEREF_X0"
240+
"SET_X1_FROM_X0"
241+
"SET_X0_FROM_BP" "SUB_X0_8" "DEREF_X0"
242+
"SET_X8_TO_SYS_MOUNT"
243+
"SYSCALL"
244+
);
245+
}
246+
200247
#endif

amd64/amd64_defs.M1

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ DEFINE lea_rdx,[rsp+DWORD] 488D9424
4141
DEFINE lea_rdx,[rbp+DWORD] 488D95
4242
DEFINE lea_rsi,[rsp+DWORD] 488DB424
4343
DEFINE lea_r8,[rbp+DWORD] 4C8D85
44+
DEFINE lea_r8,[rsp+DWORD] 4C8D8424
4445
DEFINE lea_r9,[rbp+DWORD] 4C8D8D
46+
DEFINE lea_r10,[rsp+DWORD] 4C8D9424
4547
DEFINE mov_rax, 48C7C0
4648
DEFINE mov_rbx, 48C7C3
4749
DEFINE mov_rdi, 48C7C7
@@ -81,6 +83,7 @@ DEFINE mov_rbp,[rip+DWORD] 488B2D
8183
DEFINE mov_rsp,[rip+DWORD] 488B25
8284
DEFINE mov_r8,[r8] 4D8B00
8385
DEFINE mov_r9,[r9] 4D8B09
86+
DEFINE mov_r10,[r10] 4D8B12
8487
DEFINE movzx_rax,al 480FB6C0
8588
DEFINE movsxd_rax,eax 4863C0
8689
DEFINE movsx_rax,BYTE_PTR_[rax] 480FBE00

amd64/linux/unistd.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,4 +199,57 @@ int uname(struct utsname* unameData)
199199
"mov_rax, %63"
200200
"syscall");
201201
}
202+
203+
int unshare(int flags) {
204+
asm (
205+
"lea_rdi,[rsp+DWORD] %8"
206+
"mov_rdi,[rdi]"
207+
"mov_rax, %272"
208+
"syscall"
209+
);
210+
}
211+
212+
int geteuid() {
213+
asm (
214+
"mov_rax, %107"
215+
"syscall"
216+
);
217+
}
218+
219+
int getegid() {
220+
asm (
221+
"mov_rax, %108"
222+
"syscall"
223+
);
224+
}
225+
226+
int mount(
227+
char *source, char *target, char *filesystemtype,
228+
ulong mountflags, void *data
229+
) {
230+
asm (
231+
"lea_rdi,[rsp+DWORD] %40"
232+
"mov_rdi,[rdi]"
233+
"lea_rsi,[rsp+DWORD] %32"
234+
"mov_rsi,[rsi]"
235+
"lea_rdx,[rsp+DWORD] %24"
236+
"mov_rdx,[rdx]"
237+
"lea_r10,[rsp+DWORD] %16"
238+
"mov_r10,[r10]"
239+
"lea_r8,[rsp+DWORD] %8"
240+
"mov_r8,[r8]"
241+
"mov_rax, %165"
242+
"syscall"
243+
);
244+
}
245+
246+
int chroot(char *path) {
247+
asm (
248+
"lea_rdi,[rsp+DWORD] %8"
249+
"mov_rdi,[rdi]"
250+
"mov_rax, %161"
251+
"syscall"
252+
);
253+
}
254+
202255
#endif

armv7l/linux/unistd.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,4 +191,52 @@ int uname(struct utsname* unameData)
191191
"!0 R0 LOAD32 R0 MEMORY"
192192
"SYSCALL_ALWAYS");
193193
}
194+
195+
int unshare(int flags) {
196+
asm("!4 R0 SUB R12 ARITH_ALWAYS"
197+
"!0 R0 LOAD32 R0 MEMORY"
198+
"!337 R7 LOADI8_ALWAYS"
199+
"SYSCALL_ALWAYS");
200+
}
201+
202+
int geteuid() {
203+
asm(
204+
"!201 R7 LOADI8_ALWAYS"
205+
"SYSCALL_ALWAYS"
206+
);
207+
}
208+
209+
int getegid() {
210+
asm (
211+
"!202 R7 LOADI8_ALWAYS"
212+
"SYSCALL_ALWAYS"
213+
);
214+
}
215+
216+
int chroot(char const *path) {
217+
asm (
218+
"!4 R0 SUB R12 ARITH_ALWAYS"
219+
"!61 R7 LOADI8_ALWAYS"
220+
"SYSCALL_ALWAYS"
221+
);
222+
}
223+
224+
int mount(char const *source, char const *target, char const *filesystemtype,
225+
ulong mountflags, void const *data) {
226+
asm (
227+
"!4 R0 SUB R12 ARITH_ALWAYS"
228+
"!0 R0 LOAD32 R0 MEMORY"
229+
"!8 R1 SUB R12 ARITH_ALWAYS"
230+
"!0 R1 LOAD32 R1 MEMORY"
231+
"!12 R2 SUB R12 ARITH_ALWAYS"
232+
"!0 R2 LOAD32 R2 MEMORY"
233+
"!16 R3 SUB R12 ARITH_ALWAYS"
234+
"!0 R3 LOAD32 R3 MEMORY"
235+
"!20 R4 SUB R12 ARITH_ALWAYS"
236+
"!0 R4 LOAD32 R4 MEMORY"
237+
"!31 R7 LOADI8_ALWAYS"
238+
"SYSCALL_ALWAYS"
239+
);
240+
}
241+
194242
#endif

riscv32/linux/unistd.c

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,4 +235,49 @@ int uname(struct utsname* unameData)
235235
"ecall");
236236
}
237237

238+
int unshare(int flags) {
239+
asm (
240+
"rd_a0 rs1_fp !-4 lw"
241+
"rd_a7 !97 addi"
242+
"ecall"
243+
);
244+
}
245+
246+
int geteuid() {
247+
asm (
248+
"rd_a7 !175 addi"
249+
"ecall"
250+
);
251+
}
252+
253+
int getegid() {
254+
asm (
255+
"rd_a7 !177 addi"
256+
"ecall"
257+
);
258+
}
259+
260+
int mount (
261+
char *source, char *target, char *filesystemtype,
262+
ulong mountflags, void *data
263+
) {
264+
asm (
265+
"rd_a0 rs1_fp !-4 lw"
266+
"rd_a1 rs1_fp !-8 lw"
267+
"rd_a2 rs1_fp !-12 lw"
268+
"rd_a3 rs1_fp !-16 lw"
269+
"rd_a4 rs1_fp !-20 lw"
270+
"rd_a7 !40 addi"
271+
"ecall"
272+
);
273+
}
274+
275+
int chroot(char *path) {
276+
asm (
277+
"rd_a0 rs1_fp !-4 lw"
278+
"rd_a7 !51 addi"
279+
"ecall"
280+
);
281+
}
282+
238283
#endif

riscv64/linux/unistd.c

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,4 +179,49 @@ int uname(struct utsname* unameData)
179179
"ecall");
180180
}
181181

182+
int unshare(int flags) {
183+
asm (
184+
"rd_a0 rs1_fp !-8 ld"
185+
"rd_a7 !97 addi"
186+
"ecall"
187+
);
188+
}
189+
190+
int geteuid() {
191+
asm (
192+
"rd_a7 !175 addi"
193+
"ecall"
194+
);
195+
}
196+
197+
int getegid() {
198+
asm (
199+
"rd_a7 !177 addi"
200+
"ecall"
201+
);
202+
}
203+
204+
int mount (
205+
char *source, char *target, char *filesystemtype,
206+
ulong mountflags, void *data
207+
) {
208+
asm (
209+
"rd_a0 rs1_fp !-8 ld"
210+
"rd_a1 rs1_fp !-16 ld"
211+
"rd_a2 rs1_fp !-24 ld"
212+
"rd_a3 rs1_fp !-32 ld"
213+
"rd_a4 rs1_fp !-40 ld"
214+
"rd_a7 !40 addi"
215+
"ecall"
216+
);
217+
}
218+
219+
int chroot(char *path) {
220+
asm (
221+
"rd_a0 rs1_fp !-8 ld"
222+
"rd_a7 !51 addi"
223+
"ecall"
224+
);
225+
}
226+
182227
#endif

uefi/uefi.c

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ char** _argv;
5959
char** _envp;
6060

6161
char* _cwd;
62+
char* _root;
6263

6364
struct efi_simple_text_output_protocol
6465
{
@@ -491,8 +492,12 @@ char* _relative_path_to_absolute(char* narrow_string)
491492
char* absolute_path = calloc(__PATH_MAX, 1);
492493
if(narrow_string[0] != '/' && narrow_string[0] != '\\')
493494
{
494-
strcpy(absolute_path, _cwd);
495+
strcat(absolute_path, _cwd);
495496
}
497+
else
498+
{
499+
strcat(absolute_path, _root);
500+
}
496501
strcat(absolute_path, narrow_string);
497502

498503
return absolute_path;
@@ -704,6 +709,7 @@ char* strchr(char const* str, int ch);
704709
void _setup_current_working_directory(char** envp)
705710
{
706711
_cwd = calloc(__PATH_MAX, 1);
712+
_root = calloc(__PATH_MAX, 1);
707713

708714
unsigned i = 0;
709715
unsigned j;
@@ -719,7 +725,26 @@ void _setup_current_working_directory(char** envp)
719725
j += 1;
720726
}
721727
envp[i][j] = 0;
722-
if(strcmp(envp[i], "cwd") == 0)
728+
if(strcmp(envp[i], "root") == 0)
729+
{
730+
value = envp[i] + j + 1;
731+
match = strchr(value, ':'); /* strip uefi device, e.g. fs0: */
732+
if(match != NULL)
733+
{
734+
value = match + 1;
735+
}
736+
strcpy(_root, value);
737+
k = 0;
738+
while(_root[k] != '\0')
739+
{
740+
if(_root[k] == '\\')
741+
{
742+
_root[k] = '/';
743+
}
744+
k += 1;
745+
}
746+
}
747+
else if(strcmp(envp[i], "cwd") == 0)
723748
{
724749
value = envp[i] + j + 1;
725750
match = strchr(value, ':'); /* strip uefi device, e.g. fs0: */

0 commit comments

Comments
 (0)