summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2021-05-07 13:08:25 -0400
committerNick Mathewson <nickm@torproject.org>2021-05-07 13:08:25 -0400
commit671b05edfc4c9d5fdc67b64a5723b74909ea8add (patch)
tree5f25700f566552f1b8d1e4d1dfc6fff37ea48482
parent03f1983c63c4e8571964882c442a04e867545168 (diff)
parentd85ef0d5e042b2f8693d6a104b8c97d58d0ed5f6 (diff)
downloadtor-671b05edfc4c9d5fdc67b64a5723b74909ea8add.tar.gz
tor-671b05edfc4c9d5fdc67b64a5723b74909ea8add.zip
Merge branch 'maint-0.4.5' into release-0.4.5
-rw-r--r--changes/ticket403826
-rw-r--r--src/lib/sandbox/sandbox.c22
2 files changed, 28 insertions, 0 deletions
diff --git a/changes/ticket40382 b/changes/ticket40382
new file mode 100644
index 0000000000..5ac1b771b9
--- /dev/null
+++ b/changes/ticket40382
@@ -0,0 +1,6 @@
+ o Minor features (compatibility, Linux seccomp sandbox):
+ - Add a workaround to enable the Linux sandbox to work correctly
+ on systems running Glibc 2.33. These versions have started
+ using the fstatat() system call, which previously our sandbox did not
+ allow.
+ Closes ticket 40382; see the ticket for a discussion of tradeoffs.
diff --git a/src/lib/sandbox/sandbox.c b/src/lib/sandbox/sandbox.c
index 168dfd943c..fc90dbe062 100644
--- a/src/lib/sandbox/sandbox.c
+++ b/src/lib/sandbox/sandbox.c
@@ -1608,6 +1608,28 @@ add_noparam_filter(scmp_filter_ctx ctx)
}
}
+ if (is_libc_at_least(2, 33)) {
+#ifdef __NR_newfstatat
+ // Libc 2.33 uses this syscall to implement both fstat() and stat().
+ //
+ // The trouble is that to implement fstat(fd, &st), it calls:
+ // newfstatat(fs, "", &st, AT_EMPTY_PATH)
+ // We can't detect this usage in particular, because "" is a pointer
+ // we don't control. And we can't just look for AT_EMPTY_PATH, since
+ // AT_EMPTY_PATH only has effect when the path string is empty.
+ //
+ // So our only solution seems to be allowing all fstatat calls, which
+ // means that an attacker can stat() anything on the filesystem. That's
+ // not a great solution, but I can't find a better one.
+ rc = seccomp_rule_add_0(ctx, SCMP_ACT_ALLOW, SCMP_SYS(newfstatat));
+ if (rc != 0) {
+ log_err(LD_BUG,"(Sandbox) failed to add newfstatat() syscall; "
+ "received libseccomp error %d", rc);
+ return rc;
+ }
+#endif
+ }
+
return 0;
}