Skip to content
API Documentation
BastionGuard™
bastionguard::rootguard::FileIdentityResolver Class Referencefinal

#include <FileIdentity.hpp>

Static Public Member Functions

static __u64 kernelDeviceNumber (dev_t encodedDevice)
static FileIdentity resolve (const std::filesystem::path &path, bool requireRegularFile, bool requireRootOwnedAndNotWritable)

Detailed Description

Definition at line 20 of file FileIdentity.hpp.

Member Function Documentation

◆ kernelDeviceNumber()

__u64 bastionguard::rootguard::FileIdentityResolver::kernelDeviceNumber ( dev_t encodedDevice)
staticnodiscard

Definition at line 13 of file FileIdentity.cpp.

14{
15 constexpr std::uint64_t minorBits = 20U;
16 constexpr std::uint64_t maxMajor = (1ULL << 12U) - 1ULL;
17 constexpr std::uint64_t maxMinor = (1ULL << minorBits) - 1ULL;
18
19 const auto deviceMajor = static_cast<std::uint64_t>(major(encodedDevice));
20 const auto deviceMinor = static_cast<std::uint64_t>(minor(encodedDevice));
21
22 if (deviceMajor > maxMajor || deviceMinor > maxMinor)
23 throw std::runtime_error("numero di device non rappresentabile nel formato kernel dev_t");
24
25 return static_cast<__u64>((deviceMajor << minorBits) | deviceMinor);
26}

Referenced by bastionguard::rootguard::RootGuardEngine::enrichActorExecutable(), bastionguard::rootguard::anonymous_namespace{RootGuardEngine.cpp}::identityMatches(), bastionguard::rootguard::RootGuardEngine::isTrustedApplicationEvent(), anonymous_namespace{ActionHelper.cpp}::logAction(), main(), anonymous_namespace{ActionHelper.cpp}::quarantineFile(), resolve(), anonymous_namespace{ActionHelper.cpp}::restoreFile(), and bastionguard::rootguard::RootGuardEngine::runIntegrityCheckIfDue().

◆ resolve()

FileIdentity bastionguard::rootguard::FileIdentityResolver::resolve ( const std::filesystem::path & path,
bool requireRegularFile,
bool requireRootOwnedAndNotWritable )
staticnodiscard

Definition at line 28 of file FileIdentity.cpp.

32{
33 struct stat linkStatus {};
34 if (::lstat(path.c_str(), &linkStatus) != 0)
35 throw std::runtime_error(path.string() + ": " + std::strerror(errno));
36
37 if (S_ISLNK(linkStatus.st_mode))
38 throw std::runtime_error(path.string() + ": i link simbolici non sono ammessi nelle policy");
39
40 struct stat status {};
41 if (::stat(path.c_str(), &status) != 0)
42 throw std::runtime_error(path.string() + ": " + std::strerror(errno));
43
44 if (requireRegularFile && !S_ISREG(status.st_mode))
45 throw std::runtime_error(path.string() + ": non è un file regolare");
46
47 if (!S_ISREG(status.st_mode) && !S_ISDIR(status.st_mode))
48 throw std::runtime_error(path.string() +
49 ": sono supportati soltanto file regolari e directory");
50
51 if (requireRootOwnedAndNotWritable) {
52 if (status.st_uid != 0)
53 throw std::runtime_error(path.string() + ": eseguibile trusted non appartenente a root");
54 if ((status.st_mode & (S_IWGRP | S_IWOTH)) != 0)
55 throw std::runtime_error(path.string() +
56 ": eseguibile trusted scrivibile da gruppo o altri");
57 }
58
59 FileIdentity identity;
60 /*
61 * stat(2) exposes the userspace-encoded dev_t, while inode->i_sb->s_dev
62 * in BPF uses the kernel-internal MKDEV(major, minor) layout. Store the
63 * latter so trusted/protected map lookups use exactly the same key.
64 */
65 identity.key.device = FileIdentityResolver::kernelDeviceNumber(status.st_dev);
66 identity.key.inode = static_cast<__u64>(status.st_ino);
67 identity.canonicalPath = std::filesystem::canonical(path);
68 identity.mode = static_cast<std::uint32_t>(status.st_mode & 07777U);
69 identity.uid = static_cast<std::uint32_t>(status.st_uid);
70 identity.gid = static_cast<std::uint32_t>(status.st_gid);
71 identity.regularFile = S_ISREG(status.st_mode);
72 identity.directory = S_ISDIR(status.st_mode);
73 return identity;
74}
static __u64 kernelDeviceNumber(dev_t encodedDevice)
#define S_IWOTH
#define S_IWGRP

References bastionguard::rootguard::FileIdentity::canonicalPath, rg_file_key::device, bastionguard::rootguard::FileIdentity::directory, bastionguard::rootguard::FileIdentity::gid, rg_file_key::inode, kernelDeviceNumber(), bastionguard::rootguard::FileIdentity::key, bastionguard::rootguard::FileIdentity::mode, bastionguard::rootguard::FileIdentity::regularFile, S_IWGRP, S_IWOTH, and bastionguard::rootguard::FileIdentity::uid.

Referenced by bastionguard::rootguard::RootGuardEngine::applyPolicy().


The documentation for this class was generated from the following files: