1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 16:28:11 +00:00
serenity/Kernel/TTY/SlavePTY.h
Liav A d4b65f644e Kernel: Allow opening some device nodes sparingly for jailed processes
From now on, we don't allow jailed processes to open all device nodes in
/dev, but only allow jailed processes to open /dev/full, /dev/zero,
/dev/null, and various TTY and PTY devices (and not including virtual
consoles) so we basically restrict applications to what they can do when
they are in jail.
The motivation for this type of restriction is to ensure that even if a
remote code execution occurred, the damage that can be done is very
small.
We also don't restrict reading and writing on device nodes that were
already opened, because that limit seems not useful, especially in the
case where we do want to provide an OpenFileDescription to such device
but nothing further than that.
2022-12-09 23:09:00 -07:00

58 lines
1.6 KiB
C++

/*
* Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <Kernel/FileSystem/InodeIdentifier.h>
#include <Kernel/TTY/TTY.h>
namespace Kernel {
class MasterPTY;
class SlavePTY final : public TTY {
public:
virtual bool unref() const override;
virtual ~SlavePTY() override;
void on_master_write(UserOrKernelBuffer const&, size_t);
unsigned index() const { return m_index; }
time_t time_of_last_write() const { return m_time_of_last_write; }
virtual FileBlockerSet& blocker_set() override;
private:
// ^Device
virtual bool is_openable_by_jailed_processes() const override { return true; }
// ^TTY
virtual ErrorOr<NonnullOwnPtr<KString>> pseudo_name() const override;
virtual ErrorOr<size_t> on_tty_write(UserOrKernelBuffer const&, size_t) override;
virtual void echo(u8) override;
// ^CharacterDevice
virtual bool can_read(OpenFileDescription const&, u64) const override;
virtual ErrorOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
virtual bool can_write(OpenFileDescription const&, u64) const override;
virtual StringView class_name() const override { return "SlavePTY"sv; }
virtual ErrorOr<void> close() override;
friend class MasterPTY;
SlavePTY(MasterPTY&, unsigned index);
LockRefPtr<MasterPTY> m_master;
time_t m_time_of_last_write { 0 };
unsigned m_index { 0 };
mutable IntrusiveListNode<SlavePTY> m_list_node;
public:
using List = IntrusiveList<&SlavePTY::m_list_node>;
static SpinlockProtected<SlavePTY::List>& all_instances();
};
}