Хорошо, я знаю, почему это происходит. В /etc/rc.local есть скрипт:
#!/bin/sh
rm -f etc/ssh/ssh_host_*
/usr/bin/ssh-keygen -t rsa -N '' -f /etc/ssh/ssh_host_rsa_key
/usr/bin/ssh-keygen -t dsa -N '' -f /etc/ssh/ssh_host_dsa_key
/usr/bin/ssh-keygen -t rsa1 -N '' -f /etc/ssh/ssh_host_key
/usr/bin/ssh-keygen -t ecdsa -N '' -f /etc/ssh/ssh_host_ecdsa_key
/usr/bin/ssh-keygen -t ed25519 -N '' -f /etc/ssh/ssh_host_ed25519_key
systemctl restart ssh
DHCP6CCTLKEY=/etc/wide-dhcpv6/dhcp6cctlkey
# The key mustn\'t be world readable
umask 066
echo "Generating ${DHCP6CCTLKEY}..." >&2
dd if=/dev/random bs=32 count=1 2>/dev/null | uuencode -m ${DHCP6CCTLKEY} | head -n 2 | tail -n 1 > ${DHCP6CCTLKEY}
umask 022
mv -f /etc/rc.local.orig /etc/rc.local
Проще говоря, привилегированные инструкции обычно связаны с вводом-выводом с аппаратными устройствами или защитой памяти. Доступ к ним из произвольных процессов без прохождения какой-либо центральной логики позволит процессам уничтожить память других процессов, испортить файловую систему и т. д. Либо случайно, либо намеренно.
Если мы рассмотрим некоторые распространенные системные вызовы, например,. open()
, read()
, write()
и другие, которые обращаются к файлам и в конечном итоге приводят к вводу-выводу на диск или другое устройство. Или fork()
и mmap()
, которые влияют на память процесса или других процессов.
Конечно, что-то вроде превращения процесса , а не в системный вызов, не требует привилегий и может быть выполнено с помощью библиотеки. То же самое для подделки результатов системного вызова.Хотя, конечно, что-то вроде изменения всех отметок времени на две недели назад (, как в примере libfaketime
), требует сначала выяснить правильное время, и это должно произойти через системный вызов. В дополнение к libfaketime
и libeatmydata
есть, например. fakeroot
который делает вид, что процесс выполняется под UID 0.