From 775344bcdc412431da5fa825b1012f0290fc8064 Mon Sep 17 00:00:00 2001 From: Andrey Artemiev Date: Tue, 12 Jul 2022 17:06:16 -0700 Subject: executor: added code to run Android with System account --- pkg/csource/csource.go | 6 +- pkg/csource/gen.go | 4 + pkg/csource/generated.go | 528 +++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 520 insertions(+), 18 deletions(-) (limited to 'pkg/csource') diff --git a/pkg/csource/csource.go b/pkg/csource/csource.go index 55e52347c..7d3b133bf 100644 --- a/pkg/csource/csource.go +++ b/pkg/csource/csource.go @@ -96,7 +96,11 @@ func (ctx *context) generateSource() ([]byte, error) { sandboxFunc := "loop();" if ctx.opts.Sandbox != "" { - sandboxFunc = "do_sandbox_" + ctx.opts.Sandbox + "();" + arguments := "();" + if ctx.opts.Sandbox == "android" { + arguments = "(0);" + } + sandboxFunc = "do_sandbox_" + ctx.opts.Sandbox + arguments } replacements := map[string]string{ "PROCS": fmt.Sprint(ctx.opts.Procs), diff --git a/pkg/csource/gen.go b/pkg/csource/gen.go index dea64bb39..120db74f5 100644 --- a/pkg/csource/gen.go +++ b/pkg/csource/gen.go @@ -51,6 +51,10 @@ func main() { "arm_app_policy.h", "x86_64_app_policy.h", "x86_app_policy.h", + "arm64_system_policy.h", + "arm_system_policy.h", + "x86_64_system_policy.h", + "x86_system_policy.h", } data = replaceIncludes(androidFilenames, "../../executor/android/", data) for _, remove := range []string{ diff --git a/pkg/csource/generated.go b/pkg/csource/generated.go index 59c8e89ee..3963dc707 100644 --- a/pkg/csource/generated.go +++ b/pkg/csource/generated.go @@ -8721,6 +8721,61 @@ BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), static const struct sock_filter* primary_app_filter = arm64_app_filter; static const size_t primary_app_filter_size = arm64_app_filter_size; + +const struct sock_filter arm64_system_filter[] = { +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 46), +BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 98, 44, 0), +BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 29, 43, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 226, 21, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 101, 11, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 43, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 30, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 19, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 18, 38, 37), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 29, 37, 36), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 42, 36, 35), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 99, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 59, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 33, 32), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 98, 32, 31), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 100, 31, 30), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 203, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 198, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 105, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 104, 27, 26), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 180, 26, 25), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 202, 25, 24), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 220, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 217, 23, 22), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 224, 22, 21), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 424, 11, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 266, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 260, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 240, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 234, 17, 16), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 244, 16, 15), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 262, 15, 14), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 291, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 274, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 272, 12, 11), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 288, 11, 10), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 292, 10, 9), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 438, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 436, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 434, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 425, 6, 5), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 435, 5, 4), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 437, 4, 3), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 440, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 439, 2, 1), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 441, 1, 0), +BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), +}; + +#define arm64_system_filter_size (sizeof(arm64_system_filter) / sizeof(struct sock_filter)) + +static const struct sock_filter* system_filter = arm64_system_filter; +static const size_t system_filter_size = arm64_system_filter_size; #define kFilterMaxSize (arm64_app_filter_size + 3 + 1 + 4 + 2) #elif GOARCH_arm @@ -8880,6 +8935,157 @@ BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), static const struct sock_filter* primary_app_filter = arm_app_filter; static const size_t primary_app_filter_size = arm_app_filter_size; + +const struct sock_filter arm_system_filter[] = { +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 142), +BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 240, 140, 0), +BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 54, 139, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 197, 69, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 91, 35, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 51, 17, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 36, 9, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 19, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 11, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 3, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 2, 132, 131), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 7, 131, 130), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 13, 130, 129), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 26, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 22, 128, 127), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 27, 127, 126), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 43, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 41, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 38, 124, 123), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 42, 123, 122), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 45, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 44, 121, 120), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 46, 120, 119), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 74, 9, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 64, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 60, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 57, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 53, 115, 114), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 114, 113), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 62, 113, 112), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 66, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 65, 111, 110), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 68, 110, 109), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 85, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 77, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 76, 107, 106), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 80, 106, 105), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 88, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 86, 104, 103), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 89, 103, 102), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 131, 17, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 116, 9, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 103, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 96, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 94, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 93, 97, 96), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 95, 96, 95), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 98, 95, 94), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 114, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 107, 93, 92), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 115, 92, 91), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 124, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 118, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 117, 89, 88), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 123, 88, 87), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 128, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 126, 86, 85), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 130, 85, 84), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 150, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 138, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 136, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 134, 81, 80), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 137, 80, 79), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 143, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 141, 78, 77), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 149, 77, 76), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 183, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 172, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 164, 74, 73), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 182, 73, 72), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 190, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 188, 71, 70), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 196, 70, 69), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 345, 35, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 270, 17, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 224, 9, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 217, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 213, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 199, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 198, 63, 62), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 212, 62, 61), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 215, 61, 60), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 219, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 218, 59, 58), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 222, 58, 57), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 251, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 241, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 240, 55, 54), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 249, 54, 53), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 256, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 252, 52, 51), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 269, 51, 50), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 317, 9, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 290, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 286, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 280, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 271, 46, 45), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 285, 45, 44), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 289, 44, 43), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 292, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 291, 42, 41), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 298, 41, 40), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 327, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 322, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 319, 38, 37), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 326, 37, 36), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 340, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 339, 35, 34), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 344, 34, 33), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 417, 17, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 372, 9, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 352, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 350, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 348, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 347, 28, 27), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 349, 27, 26), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 351, 26, 25), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 369, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 367, 24, 23), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 370, 23, 22), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 397, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 380, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 378, 20, 19), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 394, 19, 18), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 403, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 398, 17, 16), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 415, 16, 15), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 438, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 434, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 420, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 418, 12, 11), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 425, 11, 10), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 436, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 435, 9, 8), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 437, 8, 7), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 983042, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 440, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 439, 5, 4), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 441, 4, 3), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 983045, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 983043, 2, 1), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 983046, 1, 0), +BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), +}; + +#define arm_system_filter_size (sizeof(arm_system_filter) / sizeof(struct sock_filter)) + +static const struct sock_filter* system_filter = arm_system_filter; +static const size_t system_filter_size = arm_system_filter_size; #define kFilterMaxSize (arm_app_filter_size + 3 + 1 + 4 + 2) #elif GOARCH_amd64 @@ -9007,6 +9213,115 @@ BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), static const struct sock_filter* primary_app_filter = x86_64_app_filter; static const size_t primary_app_filter_size = x86_64_app_filter_size; + +const sock_filter x86_64_system_filter[] = { +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 100), +BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 202, 98, 0), +BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 16, 97, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 203, 49, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 93, 25, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 44, 13, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 32, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 17, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 8, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 6, 91, 90), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 16, 90, 89), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 24, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 21, 88, 87), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 29, 87, 86), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 38, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 35, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 33, 84, 83), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 37, 83, 82), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 43, 82, 81), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 79, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 72, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 57, 78, 77), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 64, 77, 76), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 78, 76, 75), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 91, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 89, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 82, 73, 72), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 90, 72, 71), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 92, 71, 70), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 155, 11, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 135, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 112, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 95, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 94, 66, 65), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 111, 65, 64), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 132, 64, 63), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 140, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 137, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 136, 61, 60), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 139, 60, 59), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 153, 59, 58), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 175, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 169, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 157, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 156, 55, 54), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 167, 54, 53), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 172, 53, 52), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 186, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 179, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 177, 50, 49), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 180, 49, 48), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 201, 48, 47), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 283, 23, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 251, 11, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 221, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 217, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 206, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 205, 42, 41), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 211, 41, 40), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 220, 40, 39), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 247, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 233, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 232, 37, 36), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 235, 36, 35), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 248, 35, 34), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 262, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 257, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 254, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 253, 31, 30), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 256, 30, 29), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 261, 29, 28), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 280, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 275, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 274, 26, 25), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 279, 25, 24), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 282, 24, 23), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 332, 11, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 305, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 302, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 285, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 284, 19, 18), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 300, 18, 17), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 303, 17, 16), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 321, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 314, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 312, 14, 13), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 320, 13, 12), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 329, 12, 11), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 436, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 434, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 424, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 333, 8, 7), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 425, 7, 6), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 435, 6, 5), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 440, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 438, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 437, 3, 2), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 439, 2, 1), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 441, 1, 0), +BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), +}; + +#define x86_64_system_filter_size (sizeof(x86_64_system_filter) / sizeof(struct sock_filter)) + +static const struct sock_filter* system_filter = x86_64_system_filter; +static const size_t system_filter_size = x86_64_system_filter_size; #define kFilterMaxSize (x86_64_app_filter_size + 3 + 1 + 4 + 2) #elif GOARCH_386 @@ -9160,6 +9475,151 @@ BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), static const struct sock_filter* primary_app_filter = x86_app_filter; static const size_t primary_app_filter_size = x86_app_filter_size; + +const struct sock_filter x86_system_filter[] = { +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 0, 0, 136), +BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 240, 134, 0), +BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 54, 133, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 190, 67, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 88, 33, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 51, 17, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 36, 9, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 19, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 11, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 3, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 2, 126, 125), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 7, 125, 124), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 13, 124, 123), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 26, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 22, 122, 121), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 27, 121, 120), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 43, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 41, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 38, 118, 117), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 42, 117, 116), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 45, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 44, 115, 114), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 46, 114, 113), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 66, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 60, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 57, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 53, 110, 109), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 58, 109, 108), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 64, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 62, 107, 106), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 65, 106, 105), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 77, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 74, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 68, 103, 102), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 76, 102, 101), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 85, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 80, 100, 99), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 86, 99, 98), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 128, 17, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 114, 9, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 96, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 94, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 91, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 89, 93, 92), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 93, 92, 91), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 95, 91, 90), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 102, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 98, 89, 88), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 107, 88, 87), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 118, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 116, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 115, 85, 84), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 117, 84, 83), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 124, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 123, 82, 81), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 126, 81, 80), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 143, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 136, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 131, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 130, 77, 76), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 134, 76, 75), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 138, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 137, 74, 73), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 141, 73, 72), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 172, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 150, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 149, 70, 69), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 164, 69, 68), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 183, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 182, 67, 66), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 188, 66, 65), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 318, 33, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 255, 17, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 224, 9, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 213, 5, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 199, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 197, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 196, 59, 58), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 198, 58, 57), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 212, 57, 56), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 218, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 215, 55, 54), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 222, 54, 53), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 245, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 241, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 240, 51, 50), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 244, 50, 49), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 252, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 250, 48, 47), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 253, 47, 46), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 292, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 272, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 258, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 256, 43, 42), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 271, 42, 41), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 284, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 273, 40, 39), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 285, 39, 38), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 300, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 295, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 294, 36, 35), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 299, 35, 34), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 313, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 312, 33, 32), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 317, 32, 31), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 383, 15, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 343, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 324, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 322, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 321, 27, 26), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 323, 26, 25), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 340, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 337, 24, 23), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 341, 23, 22), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 351, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 346, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 345, 20, 19), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 349, 19, 18), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 374, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 359, 17, 16), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 380, 16, 15), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 434, 7, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 417, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 403, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 384, 12, 11), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 415, 11, 10), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 420, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 418, 9, 8), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 425, 8, 7), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 438, 3, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 436, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 435, 5, 4), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 437, 4, 3), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 440, 1, 0), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 439, 2, 1), +BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 441, 1, 0), +BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), +}; + +#define x86_system_filter_size (sizeof(x86_system_filter) / sizeof(struct sock_filter)) + +static const struct sock_filter* system_filter = x86_system_filter; +static const size_t system_filter_size = x86_system_filter_size; #define kFilterMaxSize (x86_app_filter_size + 3 + 1 + 4 + 2) #else @@ -9210,22 +9670,33 @@ static void install_filter(const Filter* f) if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog) < 0) failmsg("could not set seccomp filter", "size=%zu", f->count); } -static void set_app_seccomp_filter() +static void set_seccomp_filter(const struct sock_filter* filter, size_t size) { - const struct sock_filter* p = primary_app_filter; - size_t p_size = primary_app_filter_size; - Filter f; f.count = 0; ValidateArchitecture(&f); ExamineSyscall(&f); - for (size_t i = 0; i < p_size; ++i) - push_back(&f, p[i]); + for (size_t i = 0; i < size; ++i) + push_back(&f, filter[i]); Disallow(&f); install_filter(&f); } +enum { + SCFS_RestrictedApp, + SCFS_SystemAccount +}; + +static void set_app_seccomp_filter(int account) +{ + if (account == SCFS_SystemAccount) { + set_seccomp_filter(system_filter, system_filter_size); + } else { + set_seccomp_filter(primary_app_filter, primary_app_filter_size); + } +} + #if GOARCH_amd64 || GOARCH_386 inline int mkdir(const char* path, mode_t mode) @@ -9258,6 +9729,9 @@ inline int symlink(const char* old_path, const char* new_path) #define UNTRUSTED_APP_UID (AID_APP + 999) #define UNTRUSTED_APP_GID (AID_APP + 999) +#define SYSTEM_UID 1000 +#define SYSTEM_GID 1000 + const char* const SELINUX_CONTEXT_UNTRUSTED_APP = "u:r:untrusted_app:s0:c512,c768"; const char* const SELINUX_LABEL_APP_DATA_FILE = "u:object_r:app_data_file:s0:c512,c768"; const char* const SELINUX_CONTEXT_FILE = "/proc/thread-self/attr/current"; @@ -9265,6 +9739,9 @@ const char* const SELINUX_XATTR_NAME = "security.selinux"; const gid_t UNTRUSTED_APP_GROUPS[] = {UNTRUSTED_APP_GID, AID_NET_BT_ADMIN, AID_NET_BT, AID_INET, AID_EVERYBODY}; const size_t UNTRUSTED_APP_NUM_GROUPS = sizeof(UNTRUSTED_APP_GROUPS) / sizeof(UNTRUSTED_APP_GROUPS[0]); + +const gid_t SYSTEM_GROUPS[] = {SYSTEM_GID, AID_NET_BT_ADMIN, AID_NET_BT, AID_INET, AID_EVERYBODY}; +const size_t SYSTEM_NUM_GROUPS = sizeof(SYSTEM_GROUPS) / sizeof(SYSTEM_GROUPS[0]); static void getcon(char* context, size_t context_size) { int fd = open(SELINUX_CONTEXT_FILE, O_RDONLY); @@ -9311,7 +9788,8 @@ static void setfilecon(const char* path, const char* context) } #define SYZ_HAVE_SANDBOX_ANDROID 1 -static int do_sandbox_android(void) + +static int do_sandbox_android(int sandbox_arg) { setup_common(); #if SYZ_EXECUTOR || SYZ_VHCI_INJECTION @@ -9327,29 +9805,45 @@ static int do_sandbox_android(void) initialize_devlink_pci(); #endif #if SYZ_EXECUTOR || SYZ_NET_INJECTION - initialize_tun(); + if (sandbox_arg != 1) { + initialize_tun(); + } #endif #if SYZ_EXECUTOR || SYZ_NET_DEVICES initialize_netdevices(); #endif + uid_t uid = UNTRUSTED_APP_UID; + size_t num_groups = UNTRUSTED_APP_NUM_GROUPS; + const gid_t* groups = UNTRUSTED_APP_GROUPS; + gid_t gid = UNTRUSTED_APP_GID; + if (sandbox_arg == 1) { + uid = SYSTEM_UID; + num_groups = SYSTEM_NUM_GROUPS; + groups = SYSTEM_GROUPS; + gid = SYSTEM_GID; - if (chown(".", UNTRUSTED_APP_UID, UNTRUSTED_APP_UID) != 0) - fail("do_sandbox_android: chmod failed"); + debug("fuzzing under SYSTEM account\n"); + } + if (chown(".", uid, uid) != 0) + failmsg("do_sandbox_android: chmod failed", "sandbox_arg=%d", sandbox_arg); - if (setgroups(UNTRUSTED_APP_NUM_GROUPS, UNTRUSTED_APP_GROUPS) != 0) - fail("do_sandbox_android: setgroups failed"); + if (setgroups(num_groups, groups) != 0) + failmsg("do_sandbox_android: setgroups failed", "sandbox_arg=%d", sandbox_arg); - if (setresgid(UNTRUSTED_APP_GID, UNTRUSTED_APP_GID, UNTRUSTED_APP_GID) != 0) - fail("do_sandbox_android: setresgid failed"); + if (setresgid(gid, gid, gid) != 0) + failmsg("do_sandbox_android: setresgid failed", "sandbox_arg=%d", sandbox_arg); setup_binderfs(); #if GOARCH_arm || GOARCH_arm64 || GOARCH_386 || GOARCH_amd64 - set_app_seccomp_filter(); + int account = SCFS_RestrictedApp; + if (sandbox_arg == 1) + account = SCFS_SystemAccount; + set_app_seccomp_filter(account); #endif - if (setresuid(UNTRUSTED_APP_UID, UNTRUSTED_APP_UID, UNTRUSTED_APP_UID) != 0) - fail("do_sandbox_android: setresuid failed"); + if (setresuid(uid, uid, uid) != 0) + failmsg("do_sandbox_android: setresuid failed", "sandbox_arg=%d", sandbox_arg); prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0); setfilecon(".", SELINUX_LABEL_APP_DATA_FILE); -- cgit mrf-deployment