Skip to main content

HostProbe

Struct HostProbe 

Source
pub struct HostProbe { /* private fields */ }
Expand description

The host facts the tier decision is made from, taken together as one reading.

A staged session takes exactly one of these and every consumer of that session reads it — the containment-floor refusal, the ScopeReport written to the trace, the /tmp mapping, the E-CAP-005 check at staging and at launch, and the tier [ShellEnforcement::resolve] installs. Two readings of a host that changed between them would let the trace describe a session that never ran under what it claims.

Implementations§

Source§

impl HostProbe

Source

pub fn probe() -> HostProbe

Reads the host as it is right now: on Linux a real Landlock ruleset restriction attempt (RulesetStatus::FullyEnforced → Some(true), PartiallyEnforced/NotEnforced or any construction error → Some(false), no Landlock ABI → None) plus crate::namespace_probe’s three attempts: the session’s network namespace, a command’s private mount namespace inside it, and the composed root’s nested namespace and pivot. Off Linux it probes nothing and claims nothing.

Taken once per staged session, not once per process. That is affordable because both halves do their work in a forked child and leave the calling process exactly as they found it — linux_enforce::probe_landlock_full_access forks so the runtime is never placed into a Landlock domain by a capability check, and the namespace probe forks because unshare(CLONE_NEWUSER) is irreversible for the task that calls it. Neither is idempotency-sensitive, so a reading costs no more than the syscalls it makes: four fork/waitpid pairs and three small /proc reads.

The window this leaves open is one session wide. Between runtime::stage_session and the last subprocess that session spawns the host is not re-read; a change inside that window is caught by the mechanism installation itself failing closed, not by a second probe. A process that stages repeatedly — mur eval, which stages once per dataset case — judges each session against the host as it was when that session was staged.

Source

pub fn namespaces(&self) -> &NamespaceReading

What the namespace probe attempted, and the readings it took with the attempts.

Source

pub fn egress_namespace_failure(&self) -> Option<EgressNamespaceFailure>

The E-CAP-005 failure this reading’s network attempt is, or None when it created the namespace (and always off Linux).

Source

pub fn sealed_shortfall(&self) -> Option<SealedShortfall>

Why this reading cannot back sealed, or None when nothing keeps it below. None exactly when Self::tier is KernelSealed.

Source

pub fn userns_grant(&self) -> Option<UsernsGrant>

Where this host’s permission to create an unprivileged user namespace comes from, or None off Linux, where the question has no answer rather than a negative one.

Source

pub fn landlock_kernel_abi(&self) -> Option<u8>

The kernel’s Landlock ABI version, or None when the kernel has no Landlock (off Linux always). The ABI the session’s ruleset is built at is [ruleset_landlock_abi] of this.

Source

pub fn probes_taken() -> u64

How many probes this process has taken, counting from zero at startup and never decreasing.

The observability hook the freshness tests assert against — that staging twice advances it by two, and that one stage_session advances it by one — and nothing else reads it. No runtime decision depends on the count.

Trait Implementations§

Source§

impl Clone for HostProbe

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for HostProbe

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more