Debian GNU/Linux · Boot & system hardening

Protect hard links to files the user does not own

When it fails: Users can create hard links to files they do not own. Hard links to privileged files enable link-based races and keep vulnerable binaries reachable after an update.

CB-DEB-BOOT-007mediumdraftautomatedautomated fixprofile core

Status draft: not part of any release yet, may still change.

Description

With fs.protected_hardlinks = 1, a user can only create a hard link to a file they own, or to a file they can both read and write. Linking to other files needs the CAP_FOWNER capability.

Debian enables it by default: through /usr/lib/sysctl.d/99-protect-links.conf (procps) on Debian 12, and through /usr/lib/sysctl.d/50-default.conf (linux-sysctl-defaults) on Debian 13.

Rationale

Hard links to files owned by other users enable races similar to symlink attacks. They also let an attacker keep a copy of a vulnerable setuid binary that survives its replacement by a package update, and exploit it later.

Impact

None known for normal use. Tools that hard link files they do not own (some backup or deduplication tools run as a regular user) must run with the needed privileges.

Setting

Locationsysctl `fs.protected_hardlinks`, persisted in `/etc/sysctl.d/`
Default1
Recommended1

Audit

Run sysctl fs.protected_hardlinks. The value must be 1. Then check that no sysctl configuration file sets it to 0.

Automated: every check must pass. Scanners report each check by its id.

running

Running value of fs.protected_hardlinks.

key: fs.protected_hardlinks
value: 1

Remediation

Create /etc/sysctl.d/60-cirsec.conf containing fs.protected_hardlinks = 1, remove any other assignment of this key, then run sysctl --system.

Restartnone
Disruptionnone

Rollback

Remove the line from /etc/sysctl.d/60-cirsec.conf and run sysctl --system.

set

Generated from check running: the engine writes the fix for every output, it sets the expected value and the check runs again after.

Each release turns these fixes into remediate.sh and an Ansible role per profile: dry run by default, a fix runs only when its check fails.

References

Mappings

FrameworkIDRelationNote
ANSSI-BP-028 - Recommandations de configuration d'un système GNU/Linux2.0R14partialR14 lists several filesystem settings; this control covers fs.protected_hardlinks.
NIST SP 800-53 Rev. 55.1.1AC-6related

How this control relates to the other framework's: equivalent, stricter, looser, partial or related.

Threats mitigated

People and lifecycle

Authors
Verified2026-10-18 by Sn0wAlice on 12, Proxmox VM, Debian 12 genericcloud image, kernel 6.1.0-54-cloud-amd64. Generated check, fix and check again for profiles core and server-hardened; values kept after reboot; fix idempotent.
Verified2026-10-18 by Sn0wAlice on 13, Proxmox VM, Debian 13 genericcloud image, kernel 6.12.113+deb13-cloud-amd64. Generated check, fix and check again for profiles core and server-hardened; values kept after reboot; fix idempotent.
Introduced inv0.1.0
Created, updated2026-10-18, 2026-10-18
Translationsfr