Anonymous
Поведение seccomp и chdir [закрыто]
Сообщение
Anonymous » 04 янв 2025, 03:03
Я изучал, как использовать seccomp, и написал что-то для его тестирования. Я объединил его части, чтобы предоставить небольшой образец.
Код: Выделить всё
#define SECCOMP_RET_KILL 0x00000000U
#define SECCOMP_RET_TRAP 0x00030000U
#define SECCOMP_RET_ERRNO 0x00050000U
#define SECCOMP_RET_LOGALLOW 0x7ffc0000U
#define SECCOMP_RET_TRACE 0x7ff00000U
#define SECCOMP_RET_ALLOW 0x7fff0000U
#define SECCOMP_RET_KILLPROCESS 0x80000000U
int main(int argc, char **argv) {
std::vector filter;
// filter arch, arch.audit_arch() returns code for x86_64
filter.push_back({ .code = BPF_LD + BPF_W + BPF_ABS, .jt = 0, .jf = 0, .k = offsetof(seccomp_data, arch) });
filter.push_back({ .code = BPF_JMP + BPF_JEQ + BPF_K, .jt = 1, .jf = 0, .k = AUDIT_ARCH_X86_64 });
filter.push_back({ .code = BPF_RET + BPF_K, .jt = 0, .jf = 0, .k = SECCOMP_RET_KILL });
uint32_t call1 = __NR_rmdir;
uint32_t call2 = __NR_chdir;
uint32_t call3 = __NR_mkdir;
filter.push_back({ .code = BPF_LD | BPF_W | BPF_ABS, .jt = 0, .jf = 0, .k = offsetof(seccomp_data, nr) });
filter.push_back({
.code = BPF_JMP | BPF_JEQ | BPF_K,
.jt = 3, .jf = 0,
.k = call1
});
filter.push_back({
.code = BPF_JMP | BPF_JEQ | BPF_K,
.jt = 2, .jf = 0,
.k = call2
});
filter.push_back({
.code = BPF_JMP | BPF_JEQ | BPF_K,
.jt = 1, .jf = 0,
.k = call3
});
uint32_t deny = SECCOMP_RET_KILL;
uint32_t allow = SECCOMP_RET_ALLOW;
filter.push_back({ .code = BPF_RET | BPF_K, .jt = 0, .jf = 0, .k = allow });
filter.push_back({ .code = BPF_RET | BPF_K, .jt = 0, .jf = 0, .k = deny });
sock_fprog prog = { .len = (short unsigned int)filter.size(), .filter = filter.data() };
if ( ::prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
std::cerr
Подробнее здесь: [url]https://stackoverflow.com/questions/79322513/seccomp-and-chdir-behavior[/url]
1735949013
Anonymous
Я изучал, как использовать seccomp, и написал что-то для его тестирования. Я объединил его части, чтобы предоставить небольшой образец. [code]#define SECCOMP_RET_KILL 0x00000000U #define SECCOMP_RET_TRAP 0x00030000U #define SECCOMP_RET_ERRNO 0x00050000U #define SECCOMP_RET_LOGALLOW 0x7ffc0000U #define SECCOMP_RET_TRACE 0x7ff00000U #define SECCOMP_RET_ALLOW 0x7fff0000U #define SECCOMP_RET_KILLPROCESS 0x80000000U int main(int argc, char **argv) { std::vector filter; // filter arch, arch.audit_arch() returns code for x86_64 filter.push_back({ .code = BPF_LD + BPF_W + BPF_ABS, .jt = 0, .jf = 0, .k = offsetof(seccomp_data, arch) }); filter.push_back({ .code = BPF_JMP + BPF_JEQ + BPF_K, .jt = 1, .jf = 0, .k = AUDIT_ARCH_X86_64 }); filter.push_back({ .code = BPF_RET + BPF_K, .jt = 0, .jf = 0, .k = SECCOMP_RET_KILL }); uint32_t call1 = __NR_rmdir; uint32_t call2 = __NR_chdir; uint32_t call3 = __NR_mkdir; filter.push_back({ .code = BPF_LD | BPF_W | BPF_ABS, .jt = 0, .jf = 0, .k = offsetof(seccomp_data, nr) }); filter.push_back({ .code = BPF_JMP | BPF_JEQ | BPF_K, .jt = 3, .jf = 0, .k = call1 }); filter.push_back({ .code = BPF_JMP | BPF_JEQ | BPF_K, .jt = 2, .jf = 0, .k = call2 }); filter.push_back({ .code = BPF_JMP | BPF_JEQ | BPF_K, .jt = 1, .jf = 0, .k = call3 }); uint32_t deny = SECCOMP_RET_KILL; uint32_t allow = SECCOMP_RET_ALLOW; filter.push_back({ .code = BPF_RET | BPF_K, .jt = 0, .jf = 0, .k = allow }); filter.push_back({ .code = BPF_RET | BPF_K, .jt = 0, .jf = 0, .k = deny }); sock_fprog prog = { .len = (short unsigned int)filter.size(), .filter = filter.data() }; if ( ::prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { std::cerr Подробнее здесь: [url]https://stackoverflow.com/questions/79322513/seccomp-and-chdir-behavior[/url]