Reference · Decisions
0040: Security defaults on Linux
Firewall on, no remote login, updates found without asking, and app permissions that say how they are enforced.
Status: accepted (recorded in v0.12 for what the Linux system already does; written from the code during the docs-truth pass). Supersedes 0015 (the same promise, written for the old base). Builds on 0016 (Arch base), 0020 (libwol services), 0033 (identity handshake) and 0034 (root-staged installs).
On this page
Context
ADR 0015 promised a desktop that is safe without settings: nothing listening, updates found without asking, and privacy switches that say how far they reach. Its mechanisms (a packet filter, a base updater, encrypted home datasets) belonged to the base ADR 0016 replaced. The promise stands; this record states how the Linux system keeps it. Details and file lists: docs/modules/security.md.
Decision
- On from the first boot, each item reported from the running system by
wol security [--json](wol_core::security::status,crates/core/src/security.rs):- Firewall: nftables,
/etc/wolos/nftables.conf(desktop/overlay/etc/wolos/nftables.conf),nftables.serviceenabled. Inbound and forwarded traffic is dropped except replies, loopback, ping, DHCP, IPv6 neighbour discovery and mDNS; outbound is allowed.wol firewall on|off|statuschanges it through wol-admind. - No remote login:
sshd.servicestays disabled until Sharing turns it on. - The log stays local: journald only; Privacy & Security reports a network syslog daemon (
security::NETWORK_LOGGERS) as a problem. - Kernel hardening:
files/usr/lib/sysctl.d/90-wolos.conf, one reason per line;security::HARDENINGis the list Settings checks against/proc/sys.
- Firewall: nftables,
- Updates:
wolos-update-check.timerlooks (hourly timer, at most one check per 20 h) and writes findings only;wolos-update-download.timerdownloads once a day and installs nothing. Installing is asked for in Software Update, and a new release goes into the other btrfs root slot, so the running slot is the restore point (ADR 0016, docs/modules/security.md, Updates). - App permissions say how they are enforced (
security::Enforcement, one line of why per permission insecurity::PERMISSIONS):- Compositor: screen copy, cursor position and input capture are refused by static compositor rules (
security::hypr_permissions,/usr/share/wolos/hypr/permissions.conf, first match wins). Only the system's own tools copy the screen directly (security::SCREENCOPY_SYSTEM); apps share the screen through the portal, which asks each time which screen or window. Screen capture is therefore never a grant in the consent file (consent::refusal). Compositor plugins load only fromsecurity::PLUGIN_DIR. - System: wold refuses a libwol service call (notifications, package changes and the other grants in
consent::CAPABILITIES) unless/etc/wolos/consent.json(consent::FILE) holds the grant; it reads the file on every call (crates/api/src/portal.rs), so a change in Settings applies at once. The caller's identity comes from the kernel after the hello of ADR 0033; system package changes run in wold only after the person allowed them on screen (ADR 0034). - Advisory: camera, microphone, location, files outside home, virtual keyboards, clipboard history and the window list. A grant is recorded and shown to helpers that ask; an app that ignores it is not stopped, and Settings says so.
- X11 apps share one trust domain per account: Xwayland admits only the signed-in account.
- Compositor: screen copy, cursor position and input capture are refused by static compositor rules (
- Encrypted homes: a systemd-homed LUKS home per account (
wol_core::home_crypt), opened by wol-login with the password it has just checked. Off by default until proven on a real install. Whole-disk encryption unlocks with the security chip, then the account's password, then the recovery key.
Consequences
no per-app sandbox yet: apps run as the account, so the advisory permissions stay advisory until a device-level mechanism exists (a per-app broker for the camera and microphone, or a sandbox around the app). Root daemons stay small: fixed argv lists, the allow-listed AdminAction set, peer identity from the kernel, each parsing only its own wire format. The firewall at boot, the compositor prompts and encrypted homes still need a check on real hardware (docs/modules/security.md, Needs hardware). Settings and wol security read the live system, so a drift between this record and the image shows up there first.
Related
- SecurityFirewall, hardening, daily update checks, a first-use malware check and disk encryption.
- The wol commandEvery wol command, what it does, and which ones helpers may call.
- 0016: Arch Linux base, in snapshotsWhy WolOS is built on the base distribution's packages pinned to a dated snapshot.
- 0021: wopkgOne package tool for every source, with a stable library behind it.
- wopkg: one tool for every sourcepacman repositories, Flatpak, AppImages, recipes and community packages behind one command.
From the developer documentation, wonderlandos/wolos docs/adr/0040-security-defaults-on-linux.md.