········lastmod="$(ls −ld $match | awk '{print $6, $7, $8}')"
········echo "···· $match (setuid $owner, last modified $lastmod)"
······fi
····fi
··done
··exit 0
Как это работает
Этот сценарий отыскивает все команды в системе, имеющие атрибут setuid и доступные для записи группе или всем остальным, и проверяет, модифицировались ли они в последние $mtime дней. Для этого используется команда find
Запуск сценария
Этот сценарий принимает единственный необязательный аргумент −v, управляющий подробностью вывода результатов поиска программ с атрибутом setuid. Данный сценарий должен запускаться с привилегиями пользователя root, но его могут запускать и обычные пользователи, так как все они, как правильно, имеют доступ к основным каталогам.
Результаты
Для проверки мы оставили в системе уязвимый сценарий. Давайте посмотрим, сможет ли findsuid найти его (см. листинг 6.2).
Листинг 6.2. Запуск сценария findsuid и результаты поиска шпионского сценария
$ findsuid
**** /var/tmp/.sneaky/editme (writeable and setuid root)
Это он (листинг 6.3)!
Листинг 6.3. Вывод ls для шпионского сценария показывает символ s в привилегиях доступа, который означает наличие атрибута setuid
$ ls −l /var/tmp/.sneaky/editme
-rwsrwxrwx··1 root··wheel 25988 Jul 13 11:50 /var/tmp/.sneaky/editme
Это огромная дыра в системе безопасности, ожидающая, пока кто-то ею воспользуется. Мы рады, что нашли ее!
№ 46. Установка системной даты
Лаконичность лежит в основе ОС Linux и предшествовавших ей версий Unix, и она оказала самое серьезное влияние на развитие Linux. Но иногда чрезмерная лаконичность способна довести системного администратора до сумасшествия. Типичным примером может служить формат представления системной даты в команде date, показанный ниже:
usage: date [[[[[cc]yy]mm]dd]hh]mm[.ss]
Трудно даже просто пересчитать все эти квадратные скобки, не говоря уже о том, чтобы определить, что нужно вводить, а что нет. Объясним: вы можете ввести только минуты, или минуты и секунды, или часы, минуты и секунды, или месяц, плюс все перечисленное перед этим, или вы можете добавить год и даже век. Чистое сумасшествие! Вместо утомительных попыток выяснить, что и в каком порядке вводить, попробуйте воспользоваться приведенным в листинге 6.4 сценарием, который предложит ввести соответствующие значения и затем сконструирует компактную строку с датой. Это верный способ сохранить психическое здоровье.
Код
Листинг 6.4. Сценарий setdate
··#!/bin/bash
··# setdate — дружественный интерфейс к команде date.
··# Команда date предлагает формат ввода: [[[[[cc]yy]mm]dd]hh]mm[.ss]
··# Чтобы обеспечить максимум удобств, эта функция просит ввести конкретную
··#·· дату, показывая значение по умолчанию в квадратных скобках [], исходя
··#·· из текущей даты и времени.
··. library.sh # Source our library of bash functions to get echon().
··{
····# $1 = имя поля, $2 = значение по умолчанию, $3 = максимальное значение,
····# $4 = требуемая длина в символах/цифрах
····echon "$1 [$2]: "
····read answer
····if [${answer:=$2} −gt $3]; then
······echo "$0: $1 $answer is invalid"
······exit 0
····elif ["$(($(echo $answer | wc −c) — 1))" −lt $4]; then
······echo "$0: $1 $answer is too short: please specify $4 digits"
······exit 0
····fi
····eval $1=$answer # Загрузить в заданную переменную указанное значение.
··}
··askvalue year $nyear 3000 4