Debian GNU/Linux · Filesystem & permissions

Keep system programs and libraries owned by root and not writable by others

When it fails: System programs or libraries can be changed by a non-root account. A user or service that can write to a system program or library runs code as every user who calls it, root included.

CB-DEB-FS-011highactiveautomatedprofile core

Description

In the system program and library directories (/usr/bin, /usr/sbin, /usr/lib, /usr/lib64, /usr/libexec, /usr/local/bin, /usr/local/sbin, /usr/local/lib, and /bin, /sbin, /lib, /lib64 when they are real directories):

  • every directory belongs to root:root and is not writable by group or others;
  • every file belongs to root and is not writable by group or others.

Files may belong to another group: Debian ships setgid helpers owned by groups such as shadow, _ssh or messagebus.

A deviation here usually means software installed outside the package manager, or tampering. The fix is therefore manual: find the cause before changing the owner, because chown also clears setuid and setgid bits.

Rationale

Programs in these directories run as root through services, cron, sudo and package scripts, and libraries are loaded into every process. Write access for anyone but root lets that account replace them and gain root, or persist unnoticed.

Impact

None on a standard system, where packages install everything as root. Software installed by hand under /usr/local by a regular user must be given to root.

Audit

Run, for each of the directories above that exists and is not a symbolic link:

find <dir> -xdev \( -type d \( ! -user root -o ! -group root -o -perm /022 \) \) -o \( ! -type d ! -type l \( ! -user root -o -perm /022 \) \) -print

The command must print nothing.

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

system-dirs

Owner, group and write bits of directories and files in system program and library directories.

script: |
  out=$(for d in /usr/bin /usr/sbin /usr/lib /usr/lib64 /usr/libexec /usr/local/bin /usr/local/sbin /usr/local/lib /bin /sbin /lib /lib64; do
    [ -d "$d" ] && [ ! -L "$d" ] || continue
    find "$d" -xdev \( \( -type d \( ! -user root -o ! -group root -o -perm /022 \) \) -o \
      \( ! -type d ! -type l \( ! -user root -o -perm /022 \) \) \) -print 2>/dev/null
  done | sort -u)
  [ -z "$out" ] && { echo "system programs and libraries belong to root and are not writable by others"; exit 0; }
  echo "$(printf '%s\n' "$out" | wc -l) item(s):"
  printf '%s\n' "$out" | head -n 20 | while IFS= read -r f; do stat -c '%A %U:%G %n' "$f"; done
  exit 1

Remediation

For each reported item:

  1. Find its package with dpkg -S <path> and check it with dpkg --verify <package>. A changed file from a package is a possible compromise: investigate first, then reinstall the package with apt-get install --reinstall <package>.
  2. For files installed by hand, run chown root <path> (then restore any setuid or setgid bit that was intended) and chmod go-w <path>; for directories, chown root:root <dir> and chmod go-w <dir>.

References

Mappings

FrameworkIDRelationNote
ANSSI-BP-028 - Recommandations de configuration d'un système GNU/Linux2.0R50partialR50 covers every sensitive file; this control covers system programs and libraries.
NIST SP 800-53 Rev. 55.1.1CM-5(6)equivalent

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

Threats mitigated

  • related CB-DEB-FS-010 Review setuid and setgid programs and keep only those that are needed

People and lifecycle

Authors
Verified2026-10-18 by Sn0wAlice on 12, Proxmox VM 922, Debian 12 genericcloud image, kernel 6.1.0-54-cloud-amd64. Passes on fresh install; group-writable file owned by nobody in /usr/local/bin detected.
Verified2026-10-18 by Sn0wAlice on 13, Proxmox VM 932, Debian 13 genericcloud image, kernel 6.12.113+deb13-cloud-amd64. Passes on fresh install; group-writable file owned by nobody in /usr/local/bin detected.
Introduced inv0.1.0
Created, updated2026-10-18, 2026-10-18
Translationsfr