Security & Trust Model¶
In a nutshell
OVOS trusts everything running on the same device. The messagebus has no login, skills run as plain Python code with no sandbox, and some hardware plugins run as root. None of this is a flaw to patch. It is the design: a local assistant that trusts its own machine the way any other local service does. The boundary you must not cross is the network. HiveMind is the supported way to reach OVOS from another device. This page tells the trust-boundary story once. For the operational checklist (what to lock down, what to check), see Privacy & Security.
The trust boundary is the device, not the process¶
OVOS is built from several separate processes (ovos-core, ovos-audio, ovos-gui,
ovos-dinkum-listener, ovos-PHAL) that all talk to each other over one shared
messagebus. Inside a single device, none of these processes distrust each
other, and none of them distrust the skills and plugins running inside ovos-core. That is a
deliberate simplification: a local assistant does not need internal authentication any more
than a shell script needs to authenticate itself to the next shell script in a pipeline. The
trust boundary is the device as a whole, not any one process on it.
That simplification has three consequences worth naming plainly.
The bus has no authentication¶
flowchart TD
subgraph Device["Device (trusted, localhost)"]
Bus["messagebus\n127.0.0.1:8181\nno login, no encryption"]
Core[ovos-core / skills]
Audio[ovos-audio]
GUI[ovos-gui]
Listener[ovos-dinkum-listener]
PHAL[ovos-PHAL]
AdminPHAL["AdminPHAL\n(root, opt-in)"]
Core <--> Bus
Audio <--> Bus
GUI <--> Bus
Listener <--> Bus
PHAL <--> Bus
AdminPHAL <--> Bus
end
Satellite[HiveMind satellite] -- "authenticated, encrypted" --> HMCore[hivemind-core]
HMCore -. "only bridge to the bus" .-> Bus
Diagram: The flow starts at a HiveMind satellite and ends at the device messagebus, and hivemind-core branches as the only authenticated, encrypted bridge into the trusted device components.
The messagebus is a pure fan-out WebSocket broker. Any client that opens a
connection to it, by default 127.0.0.1:8181, can emit and receive every message on the bus,
with no login and no encryption. There is no per-client identity and no permission check.
A client that can reach the bus can trigger any skill, read everything crossing the bus, and drive any plugin that exposes subprocess or file access. This is documented in full on Bus Service: Security and Privacy & Security: the messagebus is a trust boundary, not a security boundary.
Because of this, keeping the bus bound to 127.0.0.1 (the shipped default) is not one hardening
tip among many. It is the thing that makes every other assumption below hold.
Skills are not sandboxed¶
There is no sandbox, permission model, or capability system for skills. Installing a skill
means running arbitrary Python code as the OVOS user, with the same filesystem and network
access as the rest of the assistant. This is exactly the same trust decision as
pip installing a package from PyPI or GitHub, because that is literally the installation
mechanism (see Skill Installer). A skill is not a plugin sandboxed
behind a permission prompt the way a phone app is. It is code that runs with the same rights
as OVOS itself.
The Skill Installer can even do this at runtime, over the bus
(ovos.skills.install), but only when skills.installer.allow_pip is explicitly turned on.
Combining allow_pip: true with a bus reachable by anyone untrusted is a remote-code-execution
chain: whoever can speak to the bus can ask OVOS to pip install and load code they control.
See Skill Installer: Configuration for the guard and why it
defaults off.
AdminPHAL runs as root¶
Most hardware access in OVOS goes through PHAL plugins running as the ordinary
OVOS user. A separate class, AdminPHAL plugins, exists for hardware that genuinely needs
elevated privilege: I²C, SPI, GPIO, system power management, thermal control. AdminPHAL
plugins are disabled unless explicitly turned on with "enabled": true in
PHAL.admin config, which stops an installed-but-unconfigured admin plugin from running by
accident.
Opt-in, but once enabled, bus access is root access
AdminPHAL is opt-in ("enabled": true), but once enabled, an AdminPHAL plugin receives
the same unauthenticated bus client as every other service, with no separate credential
check. A plugin like ovos-PHAL-plugin-system exposes reboot, shutdown and factory-reset
over the bus. If the bus is reachable, anyone who can emit bus messages can trigger those
actions with root privilege. This is a stronger consequence of the bus's lack of
authentication than "skills aren't sandboxed": it is root-equivalent remote control, not
just assistant control.
See PHAL: Security model for the full mechanism.
HiveMind is the sanctioned way out¶
Everything above holds because OVOS assumes the device it runs on is itself trusted, and that nothing untrusted can reach the bus. That assumption breaks the moment you want to reach the assistant from somewhere else: a phone, another room, a satellite device, a remote client. The supported way to do that is HiveMind, not widening the bus itself.
A HiveMind satellite (for example hivemind-mic-satellite) talks to hivemind-core over
HiveMind's own authenticated, encrypted protocol, not the raw messagebus. hivemind-core is
the only thing that needs to sit on a network boundary; the bus behind it stays local. This is
what makes it safe to run a satellite from a network you don't otherwise fully control, and
it is why binding the bus itself to 0.0.0.0, or port-forwarding it, is never the right way
to add remote access. See Composable Deployments for how a
satellite fits into a wider OVOS topology, and Remote Agents with HiveMind
for the protocol itself.
Where to go next¶
This page explains the shape of the trust boundary and why it exists. It intentionally does not repeat the operational hardening steps. For those, including the network surface of a default install, what gets written to disk, and a concrete checklist, see Privacy & Security.
For the operational checklist, ports, binds, and firewall rules, see Production Hardening: Network hardening.
Read next: Plugin Manager · Concepts Overview Related: Privacy & Security · PHAL · Skill Installer · Remote Agents with HiveMind