18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci#include <stdio.h> 38c2ecf20Sopenharmony_ci#include <stdlib.h> 48c2ecf20Sopenharmony_ci#include <unistd.h> 58c2ecf20Sopenharmony_ci#include <linux/filter.h> 68c2ecf20Sopenharmony_ci#include <linux/seccomp.h> 78c2ecf20Sopenharmony_ci#include <sys/prctl.h> 88c2ecf20Sopenharmony_ci#include <bpf/bpf.h> 98c2ecf20Sopenharmony_ci#include <bpf/libbpf.h> 108c2ecf20Sopenharmony_ci#include <sys/resource.h> 118c2ecf20Sopenharmony_ci#include "trace_helpers.h" 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#ifdef __mips__ 148c2ecf20Sopenharmony_ci#define MAX_ENTRIES 6000 /* MIPS n64 syscalls start at 5000 */ 158c2ecf20Sopenharmony_ci#else 168c2ecf20Sopenharmony_ci#define MAX_ENTRIES 1024 178c2ecf20Sopenharmony_ci#endif 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci/* install fake seccomp program to enable seccomp code path inside the kernel, 208c2ecf20Sopenharmony_ci * so that our kprobe attached to seccomp_phase1() can be triggered 218c2ecf20Sopenharmony_ci */ 228c2ecf20Sopenharmony_cistatic void install_accept_all_seccomp(void) 238c2ecf20Sopenharmony_ci{ 248c2ecf20Sopenharmony_ci struct sock_filter filter[] = { 258c2ecf20Sopenharmony_ci BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW), 268c2ecf20Sopenharmony_ci }; 278c2ecf20Sopenharmony_ci struct sock_fprog prog = { 288c2ecf20Sopenharmony_ci .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 298c2ecf20Sopenharmony_ci .filter = filter, 308c2ecf20Sopenharmony_ci }; 318c2ecf20Sopenharmony_ci if (prctl(PR_SET_SECCOMP, 2, &prog)) 328c2ecf20Sopenharmony_ci perror("prctl"); 338c2ecf20Sopenharmony_ci} 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ciint main(int ac, char **argv) 368c2ecf20Sopenharmony_ci{ 378c2ecf20Sopenharmony_ci struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; 388c2ecf20Sopenharmony_ci struct bpf_link *link = NULL; 398c2ecf20Sopenharmony_ci struct bpf_program *prog; 408c2ecf20Sopenharmony_ci struct bpf_object *obj; 418c2ecf20Sopenharmony_ci int key, fd, progs_fd; 428c2ecf20Sopenharmony_ci const char *section; 438c2ecf20Sopenharmony_ci char filename[256]; 448c2ecf20Sopenharmony_ci FILE *f; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci setrlimit(RLIMIT_MEMLOCK, &r); 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); 498c2ecf20Sopenharmony_ci obj = bpf_object__open_file(filename, NULL); 508c2ecf20Sopenharmony_ci if (libbpf_get_error(obj)) { 518c2ecf20Sopenharmony_ci fprintf(stderr, "ERROR: opening BPF object file failed\n"); 528c2ecf20Sopenharmony_ci return 0; 538c2ecf20Sopenharmony_ci } 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci prog = bpf_object__find_program_by_name(obj, "bpf_prog1"); 568c2ecf20Sopenharmony_ci if (!prog) { 578c2ecf20Sopenharmony_ci printf("finding a prog in obj file failed\n"); 588c2ecf20Sopenharmony_ci goto cleanup; 598c2ecf20Sopenharmony_ci } 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci /* load BPF program */ 628c2ecf20Sopenharmony_ci if (bpf_object__load(obj)) { 638c2ecf20Sopenharmony_ci fprintf(stderr, "ERROR: loading BPF object file failed\n"); 648c2ecf20Sopenharmony_ci goto cleanup; 658c2ecf20Sopenharmony_ci } 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci link = bpf_program__attach(prog); 688c2ecf20Sopenharmony_ci if (libbpf_get_error(link)) { 698c2ecf20Sopenharmony_ci fprintf(stderr, "ERROR: bpf_program__attach failed\n"); 708c2ecf20Sopenharmony_ci link = NULL; 718c2ecf20Sopenharmony_ci goto cleanup; 728c2ecf20Sopenharmony_ci } 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci progs_fd = bpf_object__find_map_fd_by_name(obj, "progs"); 758c2ecf20Sopenharmony_ci if (progs_fd < 0) { 768c2ecf20Sopenharmony_ci fprintf(stderr, "ERROR: finding a map in obj file failed\n"); 778c2ecf20Sopenharmony_ci goto cleanup; 788c2ecf20Sopenharmony_ci } 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci bpf_object__for_each_program(prog, obj) { 818c2ecf20Sopenharmony_ci section = bpf_program__section_name(prog); 828c2ecf20Sopenharmony_ci /* register only syscalls to PROG_ARRAY */ 838c2ecf20Sopenharmony_ci if (sscanf(section, "kprobe/%d", &key) != 1) 848c2ecf20Sopenharmony_ci continue; 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci fd = bpf_program__fd(prog); 878c2ecf20Sopenharmony_ci bpf_map_update_elem(progs_fd, &key, &fd, BPF_ANY); 888c2ecf20Sopenharmony_ci } 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci install_accept_all_seccomp(); 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci f = popen("dd if=/dev/zero of=/dev/null count=5", "r"); 938c2ecf20Sopenharmony_ci (void) f; 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci read_trace_pipe(); 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_cicleanup: 988c2ecf20Sopenharmony_ci bpf_link__destroy(link); 998c2ecf20Sopenharmony_ci bpf_object__close(obj); 1008c2ecf20Sopenharmony_ci return 0; 1018c2ecf20Sopenharmony_ci} 102