Skip to content

Commit b455679

Browse files
muirdmmeta-codesync[bot]
authored andcommitted
privhelper: fall back to insecure mode on old Linux kernels
Summary: Disable privhelper hardening automatically on Linux kernels older than 5.8. The hardened mount flow relies on newer mount APIs and `faccessat2`, so hosts below that kernel level need the legacy path-based behavior. Reviewed By: MichaelCuevas Differential Revision: D108362769 fbshipit-source-id: 6945d84b8e2c9f075d8b2c4c88cc066752c87844
1 parent d2f6465 commit b455679

1 file changed

Lines changed: 53 additions & 0 deletions

File tree

eden/fs/privhelper/PrivHelperRollback.cpp

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
#include "eden/fs/privhelper/PrivHelperRollback.h"
99

1010
#ifndef _WIN32
11+
#include <cstdio>
12+
#ifdef __linux__
13+
#include <sys/utsname.h>
14+
#endif
1115
#include <folly/String.h>
1216
#include <folly/logging/xlog.h>
1317
#include <sys/stat.h>
@@ -27,6 +31,10 @@ bool disablePrivHelperHardening() {
2731
namespace {
2832

2933
constexpr const char* kEdenSystemConfigDir{"/etc/eden"};
34+
#ifdef __linux__
35+
constexpr unsigned kMinPrivHelperHardeningKernelMajor{5};
36+
constexpr unsigned kMinPrivHelperHardeningKernelMinor{8};
37+
#endif
3038

3139
bool isRootControlledPath(const char* path, mode_t fileType) {
3240
struct stat st{};
@@ -54,9 +62,54 @@ bool isRootControlledPath(const char* path, mode_t fileType) {
5462
return true;
5563
}
5664

65+
#ifdef __linux__
66+
bool isLinuxKernelTooOldForPrivHelperHardening() {
67+
struct utsname name{};
68+
if (uname(&name) != 0) {
69+
XLOGF(
70+
WARNING,
71+
"Cannot inspect Linux kernel version for privhelper hardening: {}",
72+
folly::errnoStr(errno));
73+
return false;
74+
}
75+
76+
unsigned major{0};
77+
unsigned minor{0};
78+
if (sscanf(name.release, "%u.%u", &major, &minor) != 2) {
79+
XLOGF(
80+
WARNING,
81+
"Cannot parse Linux kernel version `{}` for privhelper hardening",
82+
name.release);
83+
return false;
84+
}
85+
86+
if (major > kMinPrivHelperHardeningKernelMajor ||
87+
(major == kMinPrivHelperHardeningKernelMajor &&
88+
minor >= kMinPrivHelperHardeningKernelMinor)) {
89+
return false;
90+
}
91+
92+
XLOGF(
93+
WARNING,
94+
"Disabling privhelper hardening because Linux kernel {} is older than {}.{}",
95+
name.release,
96+
kMinPrivHelperHardeningKernelMajor,
97+
kMinPrivHelperHardeningKernelMinor);
98+
return true;
99+
}
100+
#endif
101+
57102
} // namespace
58103

59104
bool disablePrivHelperHardening() {
105+
#ifdef __linux__
106+
// The hardened mount flow uses Linux syscalls through faccessat2, which was
107+
// added in 5.8. Older kernels must use the legacy path-based flow.
108+
if (isLinuxKernelTooOldForPrivHelperHardening()) {
109+
return true;
110+
}
111+
#endif
112+
60113
// This is an emergency host-local rollback knob, so only root-controlled
61114
// filesystem state may disable the fd-based target checks.
62115
return isRootControlledPath(kEdenSystemConfigDir, S_IFDIR) &&

0 commit comments

Comments
 (0)