From 7cca341139008604bfdb4a7517f93f8843ee67c4 Mon Sep 17 00:00:00 2001 From: Sami Farin Date: Thu, 7 Jan 2021 12:38:34 +0100 Subject: [PATCH] add FFMPEG_DROP_PRIVS (for use with kmsgrab / CAP_SYS_ADMIN) --- fftools/ffmpeg.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 56ef8853cf..53fdafd0be 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -23,6 +23,10 @@ * multimedia converter based on the FFmpeg libraries */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + #include "config.h" #include #include @@ -32,6 +36,8 @@ #include #include #include +#include +#include #if HAVE_IO_H #include @@ -4923,6 +4929,91 @@ int main(int argc, char **argv) av_log_set_flags(AV_LOG_SKIP_REPEATED); parse_loglevel(argc, argv, options); + if (getenv("FFMPEG_DROP_PRIVS")) { + scmp_filter_ctx sctx; + + fprintf(stderr, "FFMPEG_DROP_PRIVS: Unshare..."); + unshare(CLONE_NEWNET); + unshare(CLONE_NEWIPC); + unshare(CLONE_NEWUTS); + fprintf(stderr, " OK.\n"); + sctx = seccomp_init(SCMP_ACT_ALLOW); + if (sctx) { + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(keyctl), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(add_key), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(request_key), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(lookup_dcookie), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(perf_event_open), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(ptrace), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(rtas), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(sys_debug_setcontext), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(adjtimex), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(clock_adjtime), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(clock_adjtime64), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(clock_settime), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(clock_settime64), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(settimeofday), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(pkey_alloc), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(pkey_free), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(pkey_mprotect), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(acct), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(bpf), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(capset), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(fanotify_init), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(fanotify_mark), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(nfsservctl), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(open_by_handle_at), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(quotactl), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(setdomainname), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(setfsuid), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(setfsuid32), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(setgroups), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(setgroups32), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(sethostname), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(setresuid), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(setresuid32), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(setreuid), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(setreuid32), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(setuid), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(setuid32), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(vhangup), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(setns), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(ioperm), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(iopl), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(pciconfig_iobase), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(pciconfig_read), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(pciconfig_write), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(kexec_file_load), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(kexec_load), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(reboot), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(swapon), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(swapoff), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(unshare), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(umount), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(umount2), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(move_mount), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(mount), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(fsmount), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(chroot), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(fsconfig), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(fsopen), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(fspick), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(open_tree), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(pivot_root), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(delete_module), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(finit_module), 0); + seccomp_rule_add(sctx, SCMP_ACT_KILL, SCMP_SYS(init_module), 0); + + fprintf(stderr, "Adding seccomp rules... "); + if (seccomp_load(sctx) == 0) { + fprintf(stderr, "OK.\n"); + } else { + fprintf(stderr, "FAIL.\n"); + } + seccomp_release(sctx); + } + } + if(argc>1 && !strcmp(argv[1], "-d")){ run_as_daemon=1; av_log_set_callback(log_callback_null); -- 2.30.0.rc2.525.gd9acf30d75