blob: e3054c224b4740ac626fa32f4b2d07828e80cf09 [file] [log] [blame] [edit]
// Copyright 2021 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// MountEntry objects represent entries in the list of mounts obtained from
// /proc/<pid>/mounts.
#ifndef SECANOMALYD_MOUNT_ENTRY_H_
#define SECANOMALYD_MOUNT_ENTRY_H_
#include <map>
#include <string>
#include <string_view>
#include <vector>
#include <base/files/file_path.h>
#include "secanomalyd/system_context.h"
namespace secanomalyd {
using ContextChecker = base::RepeatingCallback<bool(const SystemContext&)>;
// For every known mount there is a callback that ensures mounts are only
// ignored in the right context (e.g. only ignored if non-persistent).
const std::map<base::FilePath, ContextChecker> kKnownMounts{
// /run/arc/shared_mounts/data and /home/root/<hash>/android-data/data only
// exist for less than a second during the setup phase of ARC++ (only
// applicable in container-based systems).
{base::FilePath("/run/arc/shared_mounts/data"),
base::BindRepeating([](const SystemContext& context) {
return (context.IsUserLoggedIn() &&
!context.IsMountPersistent(
base::FilePath("/run/arc/shared_mounts/data")));
})},
{base::FilePath("/home/root/<hash>/android-data/data"),
base::BindRepeating([](const SystemContext& context) {
return (context.IsUserLoggedIn() &&
!context.IsMountPersistent(
base::FilePath("/home/root/<hash>/android-data/data")));
})},
};
class MountEntry;
using MountEntryMap = std::map<base::FilePath, MountEntry>;
class MountEntry {
public:
MountEntry() = default;
explicit MountEntry(std::string_view mount_str);
// Copying the private fields is fine.
MountEntry(const MountEntry& other) = default;
MountEntry& operator=(const MountEntry& other) = default;
// TODO(jorgelo): Implement move constructor so that we can use emplace().
bool IsWX() const;
bool IsUsbDriveOrArchive() const;
bool IsDestInUsrLocal() const;
bool IsNamespaceBindMount() const;
// IsKnownMount() allows us to avoid polluting our reports with W+X mounts
// that we know are not high-risk. Each mount that we allow is covered by
// a bug tracking its fix.
bool IsKnownMount(const SystemContext& context) const;
const base::FilePath& src() const { return src_; }
const base::FilePath& dest() const { return dest_; }
const std::string& type() const { return type_; }
// This will return a string of the form "<src> <dest> <type> <opt1>,...".
std::string FullDescription() const;
private:
base::FilePath src_;
base::FilePath dest_;
std::string type_;
std::vector<std::string> opts_;
};
} // namespace secanomalyd
#endif // SECANOMALYD_MOUNT_ENTRY_H_