aboutsummaryrefslogtreecommitdiff
path: root/src/common/sandbox.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2014-04-16 14:54:39 -0400
committerNick Mathewson <nickm@torproject.org>2014-04-16 22:03:09 -0400
commite6785ee16dce675aa770616bcdbd128d5dfb1132 (patch)
tree3f5c1b6d827946b36c1aaff010265e9dec432d4f /src/common/sandbox.c
parent156eefca454e10440d1070f7500e1708589fc64b (diff)
downloadtor-e6785ee16dce675aa770616bcdbd128d5dfb1132.tar
tor-e6785ee16dce675aa770616bcdbd128d5dfb1132.tar.gz
Get Libevent's PRNG functioning under the linux sandbox
Libevent uses an arc4random implementation (I know, I know) to generate DNS transaction IDs and capitalization. But it liked to initialize it either with opening /dev/urandom (which won't work under the sandbox if it doesn't use the right pointer), or with sysctl({CTL_KERN,KERN_RANDOM,RANDOM_UUIC}). To make _that_ work, we were permitting sysctl unconditionally. That's not such a great idea. Instead, we try to initialize the libevent PRNG _before_ installing the sandbox, and make sysctl always fail with EPERM under the sandbox.
Diffstat (limited to 'src/common/sandbox.c')
-rw-r--r--src/common/sandbox.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/common/sandbox.c b/src/common/sandbox.c
index 2a1ddd13d..40f200309 100644
--- a/src/common/sandbox.c
+++ b/src/common/sandbox.c
@@ -124,7 +124,6 @@ static int filter_nopar_gen[] = {
SCMP_SYS(read),
SCMP_SYS(rt_sigreturn),
SCMP_SYS(set_robust_list),
- SCMP_SYS(_sysctl),
#ifdef __NR_sigreturn
SCMP_SYS(sigreturn),
#endif
@@ -373,6 +372,23 @@ sb_open(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
return 0;
}
+static int
+sb__sysctl(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
+{
+ int rc;
+ (void) filter;
+ (void) ctx;
+
+ rc = seccomp_rule_add_0(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(_sysctl));
+ if (rc != 0) {
+ log_err(LD_BUG,"(Sandbox) failed to add _sysctl syscall, "
+ "received libseccomp error %d", rc);
+ return rc;
+ }
+
+ return 0;
+}
+
/**
* Function responsible for setting up the rename syscall for
* the seccomp filter sandbox.
@@ -850,6 +866,7 @@ static sandbox_filter_func_t filter_func[] = {
#endif
sb_open,
sb_openat,
+ sb__sysctl,
sb_rename,
#ifdef __NR_fcntl64
sb_fcntl64,