1.1 2006-09-16
Файлы, доступные по чтению для всех

Обычные пользователи не должны иметь доступ к конфигурационным файлам или паролям. Атакующий может украсть пароли к базе данных или веб-сайту и использовать их для дефейса или даже хуже — для удаления файлов. Вот почему важно правильно установить разрешения на файлы. Если вы уверены, что определенный файл может использоваться только суперпользователем, установите для него права 0600 и назначьте ему правильного владельца с помощью chown.

Файлы, доступные по записи для группы или для всех
# find / -type f \( -perm -2 -o -perm -20 \) -exec ls -lg {} \; 2>/dev/null >writable.txt
# find / -type d \( -perm -2 -o -perm -20 \) -exec ls -ldg {} \; 2>/dev/null >>writable.txt

Эти команды создадут огромный файл, содержащий имена файлов, которые имеют права на запись для группы и всех остальных. Проверьте их и устраните ненужные права, запустив для файлов команду /bin/chmod o-w.

Файлы SUID/SGID

Файлы с битами SUID или SGID будут запущены с привелегиями владельца или группы владельца, а не с привелегиями запустившего их пользователя. Обычно это используется для файлов, которые должны запускаться с правами суперпользователя для выполнения необходимых задач. Эти файлы, если содержат уязвимости, могут стать источником повышения привелегий локальным пользователем. Это может быть опасным, поэтому с подобных файлов необходимо любой ценой удалить установленный бит SUID или SGID. Если вы не используете эти файлы, запустите для них команду chmod 0 или удалите пакет, установивший этот файл (проверить, какому пакету принадлежит определенный файл, можно с помощью команды equery; если у вас ее еще нет, то, чтобы установить ее, просто наберите emerge gentoolkit). Иначе просто удалите бит SUID с помощью chmod -s.

# find / -type f \( -perm -004000 -o -perm -002000 \) -exec ls -lg {} \; 2>/dev/null >suidfiles.txt

Эта команда создаст файл, содержащий список всех SUID/SGID-файлов.

/bin/su
/bin/ping
/bin/mount
/bin/umount
/var/qmail/bin/qmail-queue
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/crontab
/usr/bin/chage
/usr/bin/expiry
/usr/bin/sperl5.6.1
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/gpasswd
/usr/bin/procmail
/usr/bin/suidperl
/usr/lib/misc/pt_chown
/usr/sbin/unix_chkpwd
/usr/sbin/traceroute
/usr/sbin/pwdb_chkpwd

По умолчанию в Gentoo Linux не так много файлов с битом SUID (хотя это зависит от типа вашей установки), но у вас может получиться список, представленный выше. Большинство команд используется только суперпользователем. Удалите SUID-бит с ping, mount, umount, chfn, chsh, newgrp, suidperl, pt_chown и traceroute, запустив для каждого из них chmod -s. Не удаляйте бит с su, qmail-queue или unix_chkpwd. Удалив setuid с этих файлов, вы не сможете стать суперпользователем и получать почту. Удаляя бит (там, где это безопасно), вы исключаете возможность обычного пользователя (или злоумышленника) получить права суперпользователя с помощью этих файлов.

В моей системе есть только несколько SUID-файлов: su, passwd, gpasswd, qmail-queue, unix_chkpwd и pwdb_chkpwd. Но если у вас запущен X-сервер, то в вашей системе их будет больше, так как X нужны повышенные привелегии, которые могут быть предоставлены посредством SUID.

SUID/SGID-файлы и жесткие ссылки

Файл может считаться удаленным лишь в том случае, когда нет больше ссылок, указывающих на него. Это может звучать странно, но просто следует понять, что файл (например, /usr/bin/perl) на самом деле является ссылкой на inode, в котором сохранены данные. На файл может указывать любое число ссылок, и пока каждая их них не будет удалена, файл будет существовать.

Если у ваших пользователей есть доступ к разделам, которые не смонтированы с параметрами nosuid или noexec (например, если /tmp, /home, /var/tmp не являются отдельными разделами), вы должны удостовериться, что они не смогут создать жесткие ссылки на файлы с SUID или SGID битами, благодаря чему они могут иметь доступ к устаревшим версиям файлов.

Если вы получаете предупреждения об оставшихся жестких ссылках, а ваши пользователи имеют доступ по записи к разделам, позволяющим запускать файлы с SUID/SGID-битами, вы должны прочитать этот раздел очень внимательно. Любой из ваших пользователей может разрушить ваши обновления, сохранив устаревшую версию программы. Если ваши пользователи не могут создавать собственные файлы с битом SUID или могут только запускать программы с помощью динамического загрузчика (разделы, смонтированные с параметром noexec), то вам не о чем беспокоиться. Пользователям не нужен доступ по чтению для файла, чтобы создать на него ссылку, им нужен всего лишь доступ по чтению к каталогу, содержащему этот файл.

Чтобы проверить, сколько ссылок имеет файл, вы можете использовать команду stat.

$ stat /bin/su
  File: `/bin/su'
  Size: 29350           Blocks: 64         IO Block: 131072 regular file
Device: 900h/2304d      Inode: 2057419     Links: 1
Access: (4711/-rws--x--x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2005-02-07 01:59:35.000000000 +0000
Modify: 2004-11-04 01:46:17.000000000 +0000
Change: 2004-11-04 01:46:17.000000000 +0000

Чтобы найти файлы с SUID и SGID со множеством ссылок, вы можете задействовать команду find.

$ find / -type f \( -perm -004000 -o -perm -002000 \) -links +1 -ls