/* Copyright (c) 2017 Facebook * * This program is free software; you can redistribute it and/or * modify it under the terms of version 2 of the GNU General Public * License as published by the Free Software Foundation. */ #include <linux/bpf.h> #include <linux/version.h> #include "bpf_helpers.h" SEC("cgroup/dev") int bpf_prog1(struct bpf_cgroup_dev_ctx *ctx) { short type = ctx->access_type & 0xFFFF; #ifdef DEBUG short access = ctx->access_type >> 16; char fmt[] = " %d:%d \n"; switch (type) { case BPF_DEVCG_DEV_BLOCK: fmt[0] = 'b'; break; case BPF_DEVCG_DEV_CHAR: fmt[0] = 'c'; break; default: fmt[0] = '?'; break; } if (access & BPF_DEVCG_ACC_READ) fmt[8] = 'r'; if (access & BPF_DEVCG_ACC_WRITE) fmt[9] = 'w'; if (access & BPF_DEVCG_ACC_MKNOD) fmt[10] = 'm'; bpf_trace_printk(fmt, sizeof(fmt), ctx->major, ctx->minor); #endif /* Allow access to /dev/zero and /dev/random. * Forbid everything else. */ if (ctx->major != 1 || type != BPF_DEVCG_DEV_CHAR) return 0; switch (ctx->minor) { case 5: /* 1:5 /dev/zero */ case 9: /* 1:9 /dev/urandom */ return 1; } return 0; } char _license[] SEC("license") = "GPL"; __u32 _version SEC("version") = LINUX_VERSION_CODE;