Wren Linux

wren-linux / docs / what-wren-adds.md (as plain text)

What Wren Linux adds to Debian

Debian 13 is a careful system already, and Wren Linux is built on it, not around it. This page lists what Wren Linux changes or adds for security and privacy, what Debian does there by itself, and how to check each one on your own computer. It says what's different, not how safe you are: for that, read what Wren Linux protects against, and what it doesn't.

Debian's side was measured on Debian 13 (kernel 6.12): a plain install's settings, its kernel's build options, and its live "standard" image's package list. A row isn't a promise that a setting stops an attack. Most of them make one harder, and many are small on their own.

What Debian already gives you

Wren Linux relies on these, and doesn't take credit for them:

In the base install

Everyone who installs Wren Linux gets these. The script named in each row does it, and its --remove undoes it.

Updates and what you run

Debian 13 by itselfWren LinuxScriptCheck
Automatic updates are a choice, and not on the live imageOn, every dayparts/unattended-upgrades.shsystemctl status apt-daily.timer
A daily update that can't reach any server still counts as done, and says nothingThe bar says so at once, if you're onlineparts/unattended-upgrades.shcat /run/wren-updates/state
Nothing lists programs still running old, unfixed librariesThey're listed after every apt runparts/needrestart.shsudo needrestart
Updates to scripts come from wherever you got themupdate.sh takes only what Wren Linux's key signed, checked with the pin you already haveupdate.shgrep WREN_SIGNING_FPR ~/wren/pins.sh
Anything you download by hand is on youPrograms the extras download from outside Debian are checked against a signing key pinned in pins.shlib/appimage.shless ~/wren/pins.sh
A program running as you can set itself to start at every login, unnoticedChanges to what starts at your login show in the bar until you accept themparts/startup-watch.shwren-watch

Network

Debian 13 by itselfWren LinuxScriptCheck
No firewall set upNothing comes in unless you allow itparts/ufw.shsudo ufw status
Answers pings from anyone on the networkPings go unansweredparts/sysctl-hardening.shsysctl net.ipv4.icmp_echo_ignore_all
DNS goes to the network's server, unencryptedUnbound checks answers with DNSSEC, and asks a resolver you pick, over TLS. It fails closed, with a switch for sign-in pagesparts/secure-dns.shcat /etc/resolv.conf
dhcpcd and dhclient send this computer's name to each networkThey don'tparts/dhcp-no-name.shgrep 'no name sent' /etc/dhcpcd.conf
Wi-Fi uses the card's real hardware address, with NetworkManager's defaultsA made-up address at each connection, no name sent, temporary IPv6 addressesparts/random-mac.ship link
The live image installs avahi, which announces this computer's name on every network, and hw-probeTaken out, with printing unless you printparts/no-live-extras.shsystemctl status avahi-daemon
Has no sandbox users like theseDNS from its sandbox users goes only to the resolver this computer uses, so a hacked sandbox can't reach what else listens on port 53 nearby. It can still send data outparts/sandbox-dns.shsudo nft list ruleset | grep -A3 resolvers
NetworkManager connects a new USB network device by itselfIt asks first, for the drivers phones useparts/tether.shcat /etc/NetworkManager/conf.d/90-wren-tether.conf

The kernel

SettingDebian 13Wren LinuxWhat it's for
kernel.kptr_restrict02Hides kernel addresses, which exploits use
kernel.yama.ptrace_scope01A program can only trace its own children
kernel.kexec_load_disabled01No swapping in another kernel while running
kernel.sysrq4380Turns the magic keys off: from the keyboard, they could end a locked desktop
kernel.io_uring_disabled02Off: where many recent kernel exploits came from
dev.tty.ldisc_autoload10Users can't load terminal line disciplines
fs.protected_fifos12Stricter about pipes in shared folders
net.ipv4.conf.default.accept_redirects10The network can't re-route you by message
net.ipv6.conf.all.accept_redirects10The same, for IPv6
net.ipv4.conf.all.secure_redirects10The same, even from your router
net.ipv4.conf.all.send_redirects10This computer isn't a router
net.ipv4.tcp_rfc133701A small fix for a rare TCP attack

Check one with sysctl kernel.kptr_restrict. All of them, with a few more where Debian already agrees: parts/sysctl-hardening.sh and data/sysctl-hardening.conf.

At bootDebian 13Wren Linux (parts/boot-hardening.sh)
init_on_free=1OffMemory is cleared when freed too, at a few percent of speed
slab_nomergeMerging onKernel memory kinds are kept apart
page_alloc.shuffle=1Built in, offMemory layout is harder to predict
debugfs=offOnA large part of the kernel's surface is gone
intel_iommu=onOff unless the firmware asksDevices reach only the memory their driver gave them
iommu.strict=1Lazy...and lose it as soon as the driver is done
Programs of other users (parts/hidepid.sh)Debian 13Wren Linux
What ps and /proc show a userEvery program, with its command lineIts own only (hidepid=invisible); root, systemd-logind and polkit see all

Check with cat /proc/cmdline, after a reboot. Its line also repeats three Debian already defaults to.

Rare network protocols and old filesystems (dccp, sctp, rds, tipc, cramfs, jffs2, hfs and more), and FireWire, which can read memory directly, can't be loaded: parts/module-blacklist.sh. Check with cat /etc/modprobe.d/60-wren-blacklist.conf.

At the computer

Debian 13 by itselfWren LinuxScriptCheck
sudo remembers your password for 15 minutesFor 1 minute, in that terminal onlyparts/sudo-timeout.shsudo -l
New users' home folders are private, but new files can be read by others, so a folder opened to a sandbox would show themNew files are private (umask 077), and everything directly in your home is closed to othersparts/home-private.shumask
A screen lock is up to your desktop, and a bare install has noneLocks when idle, and before suspendparts/swayidle.sh, parts/swaylock.shtimer lock
USB sticks are mounted as root if you sudo mount themMounted as you, with nosuid,nodev,noexecparts/usb.shusb
Shutting down takes a command, or a desktop's menuA power menu on a key combination: shutting down is the safe state for a laptop you're leavingparts/power-menu.shSuper+Shift+Escape

Only if you choose them

These are extras (wrenctl --apps). wrenctl manual NAME shows each step by hand, and docs/extras/ has a page for each, with its limits.

ExtraWhat it adds
firefox-sandboxFirefox as its own locked-down user, with uBlock Origin, HTTPS-Only Mode, no JavaScript JIT, and incognito, a throwaway one
claude-vmA coding agent in a disposable VM, walled off from your files
media, pdf-viewer, gimpOpening pictures, video and PDFs in a sandbox
yt-dlpA video downloader as its own locked user
tor-browser, whonix, onionshare, onion-siteTor, with bridges and checked downloads, and Tor Browser at Safest, as its own user
mullvad-browser-sandboxMullvad Browser as its own user
mullvad-vpnA VPN, from Mullvad's signed repository
backup, vaultEncrypted backups, and an encrypted folder that locks itself
keepassxcA password manager, locked at every screen lock
security-keyHardware keys for SSH, the web and sudo
metadata-cleanerTakes hidden data out of files you share
tails-usb, get-isoOther systems' images, checked against pinned keys, onto a stick
webcam, bluetoothOff at start, with a switch in the menu

What this costs

Most of these have a price: JavaScript is slower without the JIT, init_on_free takes a little speed, gdb and strace can't attach without sudo, some sticks won't mount, and Wi-Fi sign-in pages may ask again. THREAT-MODEL.md, under "Trade-offs", has more.

And a setting list isn't the whole picture: a hardened desktop can still run something bad that you start yourself.