ое выполняет для вас такой поиск. УЧЕТНЫЕ ФАЙЛЫ Вероятно, наиболее важным среди протокольных файлов является учетный файл. В учетном файле имеется запись о каждом и всяком про- цессе, запускаемом в системе. Точную структуру можно посмотреть в файле /usr/include/sys/acct.h. В одном из полей этой структуры запи- саны процессы, имеющие суперпользовательские возможности. Когда кто-либо входит в систему через корневую дверь, для shell- интерпретатора, который он запускает, и для всех процессов, которые он порождает, владельцем является корень (суперпользователь). В учет- ном файле отражен номер терминала, с которого запущен процесс, поэто- му вы можете увидеть корневые процессы, запущенные с таких термина- лов, на которых пользователям не разрешен суперпользовательский доступ. Если у вас имеются обычные линии с набором номера, то все такие записи могут представлять не одного и того же пользователя. Другие входы в систему могут иметь одинаковый номер терминала, но разные пользовательские идентификаторы. Однако, вы можете знать, кто обычно имеет доступ к некоторым выделенным линиям. Учетные файлы могут хорошо разоблачить процессы, имеющие не та- кой пользовательский идентификатор, как у лица, запустившего эти про- цессы. Поищите процессы, владельцем которых был известный пользова- тель, но которые имеют суперпользовательские возможности. Среди них могут быть корректные записи, например lpr, так как отображаются все системные программы, запущенные со взведенным битом setuid. Записи, которые мы ищем, относятся к shell-интерпретаторам с установленным учетным флагом суперпользователя. Это выдает тот факт, что была вы- полнена программа потайной двери. Изучите подключаемый файл acct.h, чтобы увидеть все определения. Используя бит ASU для проверки поля, мы можем изолировать флаговую область, отражающую привилегию супер- пользователя. Самый лучший способ рассмотреть эту структуру - напи- сать программу на языке Си, печатающую все элементы структуры. В сле- дующей распечатке показаны некоторые важные учетные поля: -------------------------- | | cmd f uid tty btime | | more 0 russ 0 Sat Jul 5 01:25:59 1986 | ls 0 russ 0 Sat Jul 5 01:31:12 1986 | ps 0 russ 0 Sat Jul 5 01:31:59 1986 | id 0 russ 0 Sat Jul 5 01:34:00 1986 | pwd 0 russ 0 Sat Jul 5 01:34:12 1986 | sh 1% russ 0 Sat Jul 5 01:33:51 1986 | \__ корневой shell с эффективным пользовательским идентификатором | | sync 0 russ 0 Sat Jul 5 01:34:21 1986 | df 0 russ 0 Sat Jul 5 01:34:27 1986 | id 0 root 0 Sat Jul 5 01:34:37 1986 | sh 2# root 0 Sat Jul 5 01:34:33 1986 | \__ корневой shell с реальным пользовательским идентификатором, | 2# обозначает бит суперпользователя, | владелец изменен на root | Отметим, что shell-интерпретаторы с эффективным пользовательским идентификатором маскируют бит во флаге суперпользователя, но владель- цем их процессов является обычный пользователь. Не известно, все ли системы применяют значение 1 в качестве флага shell-интерпретатора с эффективным пользовательским идентификатором. Похоже, что Berkeley поступает именно так, а System V нет. КОМАНДА su Как мы уже отмечали, UNIX предоставляет пользователям обычный способ стать суперпользователем - это команда su. Как видно из преды- дущего изложения, суть команды su заключается в системном вызове exec. Тот, кто применяет команду su, должен знать корневой пароль, транзакция протоколируется в файле /usr/adm/sulog, а команда ps огла- шает тот факт, что активен корневой shell. Этот прием не самый хитро- умный. ДОСТУП К ТЕРМИНАЛУ СУПЕРПОЛЬЗОВАТЕЛЯ Помните о том, что НИКОГДА нельзя оставлять без присмотра терми- нал, на котором вы работаете в качестве суперпользователя? Пока вы отсутствуете, кто-то может воспользоваться этим терминалом, чтобы вы- полнить команду chmod с целью установки бита пользовательского иден- тификатора. Хорошо подготовленный нарушитель уже имеет откомпилиро- ванную программу потайной двери, владельцем которой является суперпользователь, и ждет, когда будут изменены права доступа. Не ос- таются ли консольные терминалы доступными в качестве суперпользова- тельских ночью, во время действий по резервному копированию? Если ос- таются, то наутро администратор может оказаться в незавидном положении! БОЛЕЕ ПОДРОБНО О ПОЛЬЗОВАТЕЛЕ bin Мы уже упоминали о "лазейке" в некоторых системах, позволяющих пользователю "bin" без труда завладеть суперпользовательским досту- пом. Проблема "bin" имеет еще ряд аспектов. Если несанкционированные пользователи могут войти в систему через bin (являющийся владельцем большинства дистрибутивных исполняемых модулей), то они почти навер- няка смогут получить права суперпользователя. Прежде всего, в некото- рых версиях владельцем всех исполняемых модулей, размещенных в ката- логах /bin и /usr/bin, является bin. Это значит, что нарушители могут перезаписать или подправить исполняемые модули своими собственными вариантами, выполняющими некоторые особые действия, например "chmod 4755 door", а затем восстановить на место исходную версию исполняемо- го модуля. Еще один способ простого превращения bin в суперпользователя заключается в модификации /etc/rc - файла запуска команд ("run command"). Он запускается каждый раз, когда машина загружается в мно- гопользовательском режиме. Записывая в него "chmod 777 /etc/passwd", нарушитель может превратить парольный файл в обычный пользовательский после того, как машина загрузится. Последний способ - использовать файл /usr/lib/crontab. Этот путь изменен в последней версии System V. Теперь полное имя этого файла /usr/spool/cron/crontabs/xxx, где xxx - файл crontab для каждого пользователя. В старом варианте владельцем файла /usr/lib/crontab иногда является bin. Кто-нибудь может отредактировать этот файл и по- местить в него такие, например, команды: * * * * * chmod 777 /etc/passwd * * * * * chmod 4755 /tmp/door * * * * * /bin/su root -c "chmod 777 /etc/passwd" Все это срабатывает по той причине, что cron выполняется процес- сом init. Поскольку init - один из первых запущенных процессов, его владельцем является суперпользователь. Поэтому любая команда, которую выполняет cron, имеет корневые привилегии. Звездочки означают, что cron должен выполнить указанные команды в очередной возможный момент времени. Cron запускает процесс, изменяющий права доступа к указанно- му файлу. Нарушители могут поменять парольный файл (что несколько бо- лее опасно) или просто активизировать программу потайной двери. Если две первые команды не сработают, то владелец будет изменен на супер- пользователя методом грубой силы - выполнением команды su, а затем передачей команды chmod shell-интерпретатору, запущенному командой su. Вы должны почаще проверять файлы crontab и /etc/rc! ВОЗМОЖНОСТЬ ЗАПИСИ В СПЕЦИАЛЬНЫЕ ФАЙЛЫ Это редко применяемый метод. Он предполагает, что обычный поль- зователь имеет право на запись в исполняемый модуль или в специальный файл. Если кто-то может писать в исполняемый модуль, скажем ls, то он может поместить туда некоторый код, который устанавливает потайную дверь, а затем заменяет себя настоящей утилитой. Это работает еще лучше, когда эту команду запускает пользователь с корневыми возмож- ностями, так как тогда команда выполняется как привилегированный про- цесс. Такой способ упрятывания кода в программу с возможностью запус- ка ее не вызывающим подозрения пользователем называется "троянским конем". Он выглядит безвредным, но то, что спрятано у него внутри, крепко бьет по защите системы. Как мы уже отмечали, периодическая проверка контрольных сумм для стандартных исполняемых модулей - одно из противоядий от "троянских коней". Если нарушители овладевают возможностью чтения или записи файлов устройств, они могут прочитать в этих файлах информацию о суперблоке и файловой системе и получить доступ к любому файлу. Им может понадо- биться пройти по файловой системе в поисках нужного файла, подправить его и записать обратно в файл устройства. Люди, которые этим занима- ются и совершают при этом ошибки, могут добиться краха всей системы. Если файл устройства находится в памяти, пользователи могут просматривать информацию о процессах или ядре непосредственно в памя- ти. Может быть использован старый прием отслеживания списков clist на предмет поступления пароля пользователя, входящего в систему. Это требует больших знаний о том, где данная информация размещается в па- мяти и как к ней добраться, поэтому этим методом пользуются, вероят- но, только опытные нарушители. ПЕРЕЗАГРУЗКА СИСТЕМЫ В некоторых системах бывает, что после перезагрузки машины на консоли работает суперпользовательский shell. Такое может произойти в однопользовательском режиме или на микро-ЭВМ, служащей консолью для большой машины. Очевидное решение - ограничить физический доступ к консоли. ИСПОЛЬЗОВАНИЕ ПРЕИМУЩЕСТВ ПЕРЕМЕННОЙ $PATH Кое-кто может воспользоваться ситуацией, когда пользователь име- ет каталог $HOME/bin впереди системных каталогов /bin и /usr/bin в своей переменной PATH. Помещая подправленную программу в регистраци- онный каталог безвредного пользователя, нарушитель заставляет эту программу выполняться вместо настоящей, поскольку система исполняет первый файл, совпадающий с именем команды, который она обнаруживает в ходе просмотра определенного пользователем маршрутного списка. Приме- ром могла бы служить команда ls. Когда команда выполняется, она запускается с теми же правами доступа, что и запустивший ее пользователь. Конечная цель нарушителей - добиться прав суперпользователя, поскольку тогда они смогли бы вы- полнить любую команду. Диверсионная программа может подготовить по- тайную дверь для овладения правами суперпользователя или даже нес- колько таких дверей. Она может удалить себя, чтобы при очередном вызове данной команды выполнялась настоящая команда. Настоятельная необходимость для администратора - проверять наличие в рабочем прост- ранстве опасных файлов (в частности, исполняемых модулей). ФАЛЬШИВЫЕ ВЕРСИИ НА ЛЕНТАХ Мы не слышали, чтобы кто-либо это делал, но имеет смысл от этого защититься. Старательный нарушитель мог бы сначала подготовить правки для системы, поместить их на ленту и переслать их вам, администрато- ру. Вы, вероятно, предположили бы, что это правильные модификации системы и установили бы их. И ваша система получила бы "подарочек" от нарушителя. Поэтому администратор может захотеть сверить новые версии с их изготовителем перед тем, как устанавливать их у себя. ЗАШИФРОВАННАЯ БАЗА ДАННЫХ Хотя мы не можем дать гарантию, что кто-нибудь смекалистый не опишет, как расколоть парольную защиту, кодирование пароля в системе UNIX по алгоритму DES считается довольно секретным. (Рассмотрение ме- ханизма DES выходит за пределы данной книги.) К этой защите добавля- ется одна вещь - два символа, генерируемые случайным образом, называ- емые "солью" (salt) и хранимые в файле /etc/passwd для каждой записи. "Соль" используется для определения того, какой из 4096 вариантов ал- горитма DES применяется для кодирования заданного пароля. Нарушитель мог бы захватить пароль, использовать его "соль" и зашифровать список известных паролей. Если бы результат совпадал с пробным паролем, взлом был бы осуществлен. Нарушителю пришлось бы иметь доступ к некоторой довольно чувс- твительной методике, чтобы добиться своего. Нелишняя мера, которую может предпринять администратор,- следить за чрезмерным использовани- ем команды crypt (если она есть в вашей системе). Эта команда специ- ально сконструирована так, чтобы занимать много процессорного времени - не настолько много, чтобы причинять неудобства законным пользовате- лям, но достаточно много, чтобы выявить попытки автоматизированного взлома. ЗАПАДНЯ Западня работает только на специально выделенных линиях. Когда UNIX ожидает, что кто-то будет входить в систему, она печатает ре- гистрационную строку из файла /etc/gettydefs. Пользователь вводит свое регистрационное имя и пароль и попадает в систему. Программа западни извлекает из этого выгоду. Она имитирует пове- дение экрана во время регистрации. Когда пользователь вводит свое имя и пароль, такая программа печатает сообщение "login incorrect" ("не- верная регистрация"), а затем запускает настоящую регистрационную программу. Пользователь думает, что он сделал ошибку и повторяет по- пытку входа в систему, на этот раз успешно. Регистрационное имя и па- роль можно куда-нибудь отложить для последующего изучения. Самая луч- шая защита администратора от этого - обучение пользователей. Видимо, с помощью регулярной почты или бюллетеней нужно напоминать им, что если им кажется, что они набрали пароль правильно, но получили при этом сообщение "incorrect", то они должны немедленно сменить свой па- роль и сообщить об этом происшествии администратору. Бывают случаи, когда пользователь действительно ошибается при вводе пароля, но к большому количеству таких происшествий нужно отнеститсь со всей серь- езностью. КОМАНДА МОНТИРОВАНИЯ Команда монтирования была создана для того, чтобы позволить при- соединять к системе несколько дисковых устройств. Раньше, в эпоху ми- никомпьютеров единственным видом дисковых устройств были большие на- копители, в которые вставлялись большие дисковые пакеты. Они обычно находились в машинном зале, и только администратор монтировал их. Теперь многие системы имеют гибкие диски. Они гораздо персональ- нее и намного меньше, чем большие дисковые пакеты. Это уменьшение размера ощутимо воздействует на важность самого объекта. Похоже, что теперь каждый пользователь может иметь дело со своими дисками, и ад- министратору больше нет необходимости заниматься этим. Такой сценарий работы приводит к следующему. Обычное действие, предпринимаемое в небольших системах для того, чтобы дать пользователям возможность работать с их собственными гиб- кими дисками,- это установка бита пользовательского идентификатора для файла команды /etc/mount. Таким образом, когда запускается коман- да монтирования, ее пользовательский идентификатор становится корне- вым, и она может смонтировать гибкий диск. Команда демонтирования должна быть подготовлена аналогично. Кто-то может извлечь выгоду из того, что команда mount может по- лучить во время своей работы права суперпользователя. Обычно в не- больших системах одна машина открыта для экспериментов несанкциониро- ванного пользователя. Он может стать суперпользователем в вашей системе, подготовить программу потайной двери и поместить ее на гиб- кий диск. Владельцем является суперпользователь, а права доступа 4755. Затем нарушитель может размонтировать гибкий диск и войти в за- щищенную систему. С этого момента нарушитель может просто входить в систему как обычный пользователь, без всяких специальных прав доступа и монтиро- вать гибкий диск, на котором имеется программа потайной двери. Когда гибкий диск монтируется, файловая система гибкого диска встраивается в файловую систему жесткого диска, и две системы сливаются в одну. Это означает, что потайная дверь для овладения правами суперпользова- теля готова для файловой системы на жестком диске. Когда нарушитель запускает программу потайной двери на гибком диске, происходит то же самое, что происходило бы, если бы эта прог- рамма была на жестком диске. Мера предотвращения - контролировать ис- пользование команды mount в вашей системе. Доступ к команде mount должен быть ограничен определенным кругом пользователей, она не долж- на разрешать монтировать файлы с установкой пользовательского иденти- фикатора. АВТОНОМНЫЙ shell (SASH) В системах UNIX с гибкими дисками загрузочный диск обычно загру- жается с гибкого накопителя. Подразумевается, что гибкий диск приме- няется для подготовки жесткого диска и копирования всех файлов систе- мы UNIX с гибкого диска на жесткий. Но за этим кроется нечто большее. На самом деле загружаемый гибкий диск - это компактная, перено- симая версия системы UNIX. Ядро адаптировано к тому, чтобы размещать- ся на гибком диске, а не на жестком. Когда вы его загружаете, вы по- лучаете интерпретатор shell и среду точно так же, как при работе с жесткого диска. Вот почему такой shell называется автономным (SASH, standalone shell). Корневая файловая система на гибком диске даже выглядит точно так же, как файловая система жесткого диска. Фактически вы можете смонтировать загружаемый диск и скопировать утилиты с жесткого диска на гибкий. Нужны две важные команды: mount и umount. Ограничением яв- ляется размер гибкого диска. На него не так много помещается. Сценарий, с помощью которого несанкционированный пользователь может применить SASH для входа в систему с суперпользовательскими привилегиями, выглядит примерно так. Сначала он должен отключить пи- тание или перезагрузить защищенную систему. Затем он должен загрузить SASH и смонтировать корневую файловую систему жесткого диска в точку монтирования своей файловой системы гибкого диска. Команды могут быть такими: # /etc/mount /dev/fp001 /mnt <-- для System V # /etc/mount /dev/hd0a /mnt <-- для XENIX Это дает нарушителям доступ на жесткий диск при помощи обращения /mnt/*. Все, что им нужно для редактирования файла /etc/passwd - это пройти вниз по дереву каталогов. Для этого можно применить такие ко- манды: # /mnt/bin/vi /mnt/etc/passwd # sync Теперь жесткий диск изменен, и его можно вернуть на место. Нару- шитель может остановить автономный вариант UNIX и перезагрузиться с жесткого диска. Он может использовать новое регистрационное имя, соз- данное при помощи SASH. Мы не знаем, насколько часто люди могут предпринимать такие попытки. Небольшие системы более уязвимы, но в них и меньше пользователей (и потенциальных злодеев). Во многих слу- чаях нижней границей "логической защиты" становится "физическая защи- та". Большинство людей, имеющих большие машины или даже мини-ЭВМ, постоянно осознают, что им есть что защищать. А микро-ЭВМ выглядят настолько "дружественными" и простыми, что люди обычно забывают, что информация, которая содержится на микрокомпьютерах, при определенных обстоятельствах может оказаться настолько же желаемой и значительной, как и на больших машинах. ПРАВКИ ИСХОДНЫХ ТЕКСТОВ Чаще всего правки исходных текстов являются самым мощным, хотя и не самым легким способом проникновения нарушителей в систему. Внедряя свой собственный код в подходящих местах, несанкционированные пользо- ватели могут извлечь всю секретную информацию, которая им нужна. Од- нако, правки кода могут быть полезны также и для администратора. Ад- министратору может понадобиться внести правки в регистрационную программу, чтобы посмотреть, кто и как часто пытается зарегистриро- ваться на машине. Другой вариант - внесение правок в программы с ус- тановкой пользовательского идентификатора и в другие доступные огра- ниченному кругу лиц программы, чтобы они регистрировали свой сеанс работы в секретном протокольном файле. ЯДРО Еще одно место, в котором нужно следить за несанкционированными правками - библиотеки ядра. Подправленные объектные модули можно лег- ко поместить в библиотеки незамеченными. Другим библиотекам грозит та же опасность. Дополнительные разумные усовершенствования ядра можно обнаружить в системных вызовах chmod и chown. Когда выполняются эти системные вызовы, они проверяют, имеете ли вы пользовательский иден- тификатор 0. Если нет, то ваш запрос не удовлетворяется. Отменив эту проверку, любой обычный пользователь мог бы изменить владельца файла на суперпользователя, а также изменить режим защиты файла, чтобы взвести бит установки пользовательского идентификатора. Это позволило бы успешно обойти защитный барьер. ПРОГРАММА passwd Программа passwd - охранник ворот системы UNIX. Точно так же, как многие древние города пали из-за того, что враги подкупили охран- ника ворот, так и хорошо защищенная система UNIX может быть превраще- на в широко открытую, если кто-либо подправит эту программу. Посколь- ку пользователи применяют программу passwd для изменения своих паролей, подправленная версия может записывать новый пароль, вводимый пользователем для изменения, в секретный файл, принадлежащий наруши- телю. Это может обесценить каждый вновь создаваемый в системе пароль. Внутри программы passwd пароль является просто символьным массивом, поэтому с этими данными легко управиться. ПРОГРАММА crypt Потенциальной правкой программы шифрования файлов crypt может быть накопление имен файлов и ключей шифра при каждом использовании программы. Таким методом вы можете проследить, кто запускает эту ко- манду, какой файл он использует и какой ключ применяется для того, чтобы получить доступ к этому файлу. Неприятности, связанные с последними двумя случаями, заключаются в том, что кто-нибудь может разрушить меры системной безопасности. Если вы считаете, что в вашей системе есть заманчивые, важные данные, то вам как администратору следует почаще проверять эти программы (по контрольной сумме или сравнением) на предмет повреждения. КОМАНДА su Поскольку команда su предоставляет суперпользовательский доступ для обычных пользователей, имеющих корневой пароль, это еще одна по- тенциальная лазейка в защите системы. Общая схема работы команды su выглядит так: -------------------------------------------- | | Получить информацию о пользователе: пользовательский идентификатор, | групповой идентификатор, пароль, номер терминала, ... | Если пароль пустой или пользовательский идентификатор равен нулю, | То пройти мимо вопросов о пароле. | | Запрос пароля | Если зашифрованный вариант того, что было только что набрано, | не совпадает с парольной строкой из файла /etc/passwd, | То запротоколировать неудачную попытку применения su, | напечатать сообщение "sorry" (сожаление по поводу неудачи), | выйти. | Пароль прошел: | запротоколировать успешную попытку применения su, | выполнить системные вызовы для того, чтобы ввести в действие | пользовательский и групповой идентификатор, | установить среду, если это требуется, | выдать на консоль сообщение, если это корневой shell, | а вы не за системной консолью, | организовать аргументы для показа su в команде ps, | выполнить интерпретатор shell. | Для подправленной версии потребовались бы лишь небольшие измене- ния в приведенной выше последовательности. Вместо того, чтобы сразу же зашифровывать пароль, su могла бы проверить "секретный" пароль на- рушителя. Если введен такой пароль, то проверку пароля и действия по про- токолированию можно обойти, поэтому запрещенный доступ не отразился бы в протоколе. Несанкционированный пользователь добился бы того, что ДРУГИЕ пароли для команды su записывались бы в "секретный" файл. В результате он бы потихоньку получил все интересующие его пароли для потенциального использования. Для пользователя команда su срабатывала бы успешно, если пароль правильный, а нарушитель получал бы в свое распоряжение пароль. КОМАНДА login Несанкционированный пользователь может повредить команду login при помощи тех же методов, что и для passwd. Тем не менее, админист- ратор может сделать нечто большее, чем просто защитить данную прог- рамму от повреждения. По теории, наилучшей защитой является нападе- ние. Поэтому администратор может внести в команду login свои собственные правки и применять ее как систему оповещения о вмешатель- стве. Каждый раз, когда кто-то входит в систему или пытается войти, можно изменить запись об используемых имени и пароле. Это может сиг- нализировать вам о любых попытках нарушителей угадать пароли методом грубой силы. В силу способа, которым реализована команда login, требуется только одно изменение. Алгоритм проверки как пользовательского паро- ля, так и пароля при наборе номера для модемной связи вызывает одну и ту же подпрограмму. К сожалению, мы не можем привести ее здесь, так как несанкционированные пользователи смогли бы применить ее для сбора паролей в своих корыстных целях. Далее, если вы завели ваш собствен- ный секретный файл для протоколирования попыток входа в систему, то вы должны попытаться убедить нарушителей, что они не смогут прочитать его и останутся со своими заботами. Вы можете сделать следующее, хотя это увеличило бы накладные расходы: зашифровать утилитой crypt пароли в протокольном файле с применением вашего собственного секретного ключа. Тогда даже если кто-то прочитает этот файл, он не сможет вос- пользоваться этой информацией. ПРОСТИТЕЛЬНЫЕ ГРЕХИ Рассматриваемые ниже случаи представляют собой менее, но все же потенциально болезненные проблемы безопасности. Они не привлекают способов овладения суперпользовательскими привилегиями, но являются способами надувательства системы и бегства из нее. СИСТЕМНЫЙ РЕЖИМ Данный прием, пожалуй, редко применяется, если только у вас нет человека, который очень близко знаком с низкоуровневым функционирова- нием того или иного процессора, используемого в вашей машине. Он мо- жет проникнуть в сердце аппаратного оборудования и пристроиться по- верх операционной системы. Тем не менее, администраторы должны осознавать, что такие вещи возможны. Во многих процессорах, например в процессоре Motorola 68000, имеется регистр состояния процессора (Processor Status Register), на- зываемый обычно PSW, хотя у разных процессоров он может называться по -разному. PSW содержит бит, определяющий, работает ли машина в "су- первизорном" или в пользовательском режиме. Этот режим важен для мно- гопользовательской аппаратуры, поскольку все пользовательские прог- раммы работают в пользовательском режиме, что сегментирует и защищает память от "коллизий" между процессами. С другой стороны, ядро работает в супервизорном режиме. Это оз- начает, что защита памяти не действует и центральный процессор может изменять содержимое любой ячейки памяти во всей машине. Ядру необхо- дима такая возможность, поскольку ядро поддерживает механизм своппин- га для перемещения процесса в защищенную память и из нее, когда про- цесс выполняется. Если нарушители безопасности могут получить в прграмму, работающую в системном режиме, то они получают возможность изменять всю память в системе. Последствия могут варьироваться от абсолютного разрушения, нап- ример записывания нулей в каждую ячейку памяти, до способности читать и сортировать данные в памяти, включая пароли и другую информацию с очень ограниченным к ней доступом. Для того чтобы добиться системного режима, нарушителю необходима возможность сгенерировать и установить новое ядро. Используемый метод зависит от того, есть ли у нарушителя исходный текст программ ядра. Приводимые нами подробности относятся к процессору 68000, но могут быть аналогичными для других процессоров. СИСТЕМНЫЙ ВЫЗОВ Первый метод - создать "пользовательский" системный вызов. Сис- темные вызовы находятся в исходных файлах с именами вида os/sys?.c. Это примерно 60 системных вызовов, и каждый из них имеет специфичес- кий номер. Этот номер определяется таблицей системных входов - табли- цей адресов точек входа в системные вызовы. Для добавления нового системного вызова необходимо подготовить его исходный код. Когда ядро перекомпилировано и установлено, можно производить системный вызов из любой программы в системе. Как только такой вызов активизирован, он может перевести машину в системный режим. К счастью, не так уж легко для "обычного" пользователя переком- пилировать и переустановить ядро системы. Этот метод, вероятно, тре- бует "внутренней работы". Помогло бы хранение ваших исходных текстов подальше от системы, но если вам нужно иметь системных програмистов, регулярно модифицирующих эти исходные тексты, то все, что в ваших си- лах - ограничить доступ (и подобрать надежных людей)! ПСЕВДОУСТРОЙСТВО Второй метод может быть использован теми нарушителями, которые не имеют исходных текстов, но имеют все библиотеки, образующие ядро. Здесь подход несколько другой, но результат тот же. В соответствии с той же идеей системного режима, цель заключает- ся в том, чтобы в регистре PSW центрального процессора был установлен привилегированный доступ ("супервизорный" или "системный режим"). Вместо того, чтобы использовать надлежащим образом ядро, этот метод пользуется внешним драйвером, который связывается с ядром. Это выпол- няется путем создания псевдоустройства. Псевдоустройство подобно нас- тоящему устройству, но его имя не ведет ни к какой физической перифе- рии. Доступ к псевдоустройству осуществляется с помощью всех тех же самых примитивов (открыть, закрыть, читать, писать), но это доступ к логической области, а не к физической. Для того чтобы определить псевдоустройство, нужно модифицировать главный файл устройства. В главном файле (который называется /etc/master или /usr/sys/conf/master) имеется таблица всех имен драй- веров устройств, связанных с каждым примитивом. Когда создается псев- доустройство, в таблицу драйверов устройств помещается новая запись. В этой таблице содержатся имена всех подпрограмм, поддерживающих при- митивы. Привилегированного режима можно добиться при помощи открытия псевдоустройства. Системный вызов open передает управление драйверу устройства, т.е. добавленному коду. В момент запуска этого кода маши- на уже находится в системном режиме, поскольку когда выполнялся вызов open, он был "пойман" системой и передан программе обработки, функци- онирующей в системном режиме. После этого драйвер устройства может делать то, что он хочет. НАРУШИТЕЛЬ ВЫДАЕТ СЕБЯ ЗА УДАЛЕННЫЙ УЗЕЛ uucp Если команда login подобна сторожу крепости, то программа uucp подобна заброшенному спасательному туннелю, через который враги могут проникнуть во дворец. С приходом межмашинных коммуникаций возникает целый ряд пробоин в защите системы. При помощи uucp несанкционированные пользователи могут попасть в систему, выдав себя за удаленный узел uucp. Это очень легко сделать. Нарушители могут заглянуть в файл /usr/lib/uucp/L.sys в вашей системе и обнаружить, где находятся удаленные системы, путем поиска входов в систему на других машинах. Затем они могут посмотреть в файле /etc/passwd такие входы в систему, которые запускают программы uucico вместо обычного shell-интерпретатора. Если они обнаружат соответству- ющие пароли, они могут попытаться применить некоторые вероятные паро- ли или использовать один из методов внесения правок, рассмотренных ранее, с целью перехвата паролей. Затем нарушитель может изменить имя узла своей системы на имя узла удаленной системы, чтобы выдать себя не за того, кем он на самом деле является. Он может войти в систему под именем uucp или под спе- циальным регистрационным именем, предназначенным для удаленной маши- ны. Программы uucp передают это узловое имя (которое является под- дельным) в вашу систему. Нарушители могут перекачать почту, файлы и т.д. из вашей системы на свою машину. Если у вас есть что-нибудь в очереди, ожидающей отп- равки на законную удаленную машину, нарушители могут сразу там очу- титься. Вы можете столкнуться с неприятностями, когда один из ваших операторов законной удаленной системы звонит и спрашивает вас, почему он неделями не получает от вас ни почты, ни программных запросов! Од- нако, коварный нарушитель мог бы переслать копию украденных файлов обратно к вам и использовать прогрессивные средства для отправки их на законную удаленную машину. ПОДДЕЛКА ПОЧТЫ Этот прием довольно хорошо известен, но мы включаем его для пол- ноты изложения. Похоже, однако, что он работает не во всех версиях системы UNIX. Он работает в System V, но не работает в XENIX, System III и Berkeley 4.2. Данный метод заключается в изменении пользова- тельской переменной среды LOGNAME. Поскольку команда mail использует ее, чтобы идентифицировать вас при отправке вам почты, меняется заго- ловок почты. Обычно это всего лишь мелкая неприятность, но вы должны уведомить об этом пользователей, чтобы они очень внимательно относи- лись к таким сообщениям, которые кажутся несвойственными для их мни- мого отправителя. СКРЫТЫЕ ИМЕНА ФАЙЛОВ ПРИ РАБОТЕ С РЕДАКТОРОМ vi Полезной практикой для обеспечения безопасности является выпол- нение случайных команд ps. Такая мера более-менее равносильна перио- дическому патрулированию с целью увидеть, не происходит ли что-нибудь опасное. Необходимо, однако, отметить, что лица, использующие редак- тор vi для несанкционированной работы, могут замести свои следы, вы- бирая такое имя редактируемого файла, чтобы оно не появлялось в рас- печатке команды ps. Самый простой способ, которым они могут это сделать - вызвать vi без указания имени файла. Тем самым vi запуска- ется с пустым файлом. Затем они могут применить команду ex для редак- тирования нужного им файла. Это убережет имя файла от распечатки ко- мандой ps, так как оно не является частью набора аргументов команды vi. Массив аргументов формируется при вызове команды vi, а не после ее запуска. Другой способ - использовать маскировку. Нарушители могут переи- меновать файл, который они хотят редактировать, в ничего не означаю- щее имя, например tmp, а потом использовать имя tmp при вызове редак- тора vi. В результате в массив аргументов занесется имя tmp. Оно и появится в распечатке команды ps. -------------------------------------------------------- ИМЯ: access -------------------------------------------------------- access НАЗНАЧЕНИЕ Ищет в парольном файле все регистрационные записи, не имеющие паролей. ФОРМАТ ВЫЗОВА access ПРИМЕР ВЫЗОВА access Выдает список всех беспарольных входов в систему ТЕКСТ ПРОГРАММЫ 1 : 2 # @(#) access v1.0 Show all free access logins Author: Russ Sage 4 if [ "$#" -gt "0" ] 5 then echo "access: too many arguments" >&2 6 echo "usage: access" >&2 7 exit 1 8 fi 10 grep '^[^:]*::' /etc/passwd || echo "All logins protected" ОПИСАНИЕ ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ access? Мы уже отмечали, что записи о входе в систему в парольном файле создают возможность нарушения защиты, если с ними не связаны пароли, т.е. если поле пароля пустое. Проблема заключается в том, что в боль- ших системах парольный файл может сильно разрастись. Искать в таком файле вручную регистрационные записи, в которых отсутствуют пароли, было бы утомительным и приводило бы к ошибкам. Почему бы не поручить системе сделать за вас эту работу? ЧТО ДЕЛАЕТ access? Командный файл access использует команду grep с шаблоном поиска, описывающим регистрационную запись, не имеющую пароля. Когда такая запись попадается, она печатается в стандартный вывод. Если указанных записей не найдено, выводится сообщение "All logins protected" ("Все входы в систему защищены"). ПОЯСНЕНИЯ Первое, что делает access (в строках 4-8) - проверяет, правильно ли она была вызвана. Поскольку опций не предусмотрено, в командной строке ничего не должно быть. Если количество аргументов в командной строке больше нуля, то на стандартное устройство регистрации ошибок выдается сообщение об ошибке и командный файл завершается. Оператор в строке 10 выполняет поиск в парольном файле. Применя- ется утилита grep, т.к. мы используем в этой команде выражение. Если бы мы использовали фиксированную строку, более предпочтительной была бы утилита fgrep, потому что она быстрее. Выражение, задающее поиск, означает следующее: начиная с начала строки, найти все символы, от- личные от двоеточия, вплоть до обнаружения двух двоеточий подряд. Ес- ли вы заглянете в файл /etc/passwd, то увидите, что первое поле представляет собой имя (от начала строки до первого двоеточия). Затем между первым и вторым двоеточием размещается пароль. Если пароль от- сутствует, то после первого двоеточия сразу же следует второе - имен- но это соответствует нашему шаблону поиска. Поиск выполнятся в файле /etc/passwd. Если grep успешно обнаружил хотя бы одну запись, то код возврата нулевой. Если grep ничего не обнаружил, то код возврата еди- ница. Тогда активизируется последняя часть строки 10 и выводится со- общение о том, что все записи о входе в систему защищены. ---------------------------------------------------- ИМЯ: chkset ---------------------------------------------------- chkset НАЗНАЧЕНИЕ Выдает список всех файлов, имеющих включенный бит разрешения ус- тановки пользовательского/группового идентификатора. ФОРМАТ ВЫЗОВА chkset [-l] [dir ...] ПРИМЕР ВЫЗОВА chkset -l Вести поиск, начиная с корневого каталога, поскольку каталог не указан. С помощью команды "ls -d" выдать список файлов, для которых установлен в единицу бит разрешения установки идентификатора пользо- вателя либо идентификатора группы. Результат отсортировать по имени файла. (Бит установки пользовательского идентификатора S_ISUID и бит установки группового идентификатора S_ISGID являются атрибутами защи- ты файла наряду с битами прав доступа на чтение/запись/выполнение и определены в подключаемом файле /sys/stat.h. - Примеч. перев.) ТЕКСТ ПРОГРАММЫ 1 : 2 # @(#) chkset v1.0 Check for set bits on Author: Russ Sage 4 FORM="-print" 5 SORT="sort" 7 if [ "`echo $1 | cut -c1`" = "-" ] 8 then case $1 in 9 -l) shift 10 FORM="-exec ls -ld {} ;" 11 SORT="sort +7";; 12 *) echo "usage: chkset [-l][file/dir ...]" >&2 13 exit 1;; 14 esac 15 fi 17 if [ "$#" -gt 0 ] 18 then SRC="$*" 19 else SRC="/" 20 fi 22 find $SRC \( -perm -4000 -o -perm -2000 \) $FORM | $SORT ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ FORM Команда и опции для листинга SORT Команда и опции для сортировки результата SRC Исходный каталог, от которого нужно начинать поиск ОПИСАНИЕ ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ chkset? Мы уже рассмотрели проблемы безопасности, которые могут возник- нуть, когда для исполняемых файлов установлен в единицу бит разреше- ния установки идентификатора пользователя. Это означает, что они мо- гут запускать интерпретатор shell с корневой или с другой привилегией высокого уровня. С той же целью может быть установлен в единицу бит разрешения установки идентификатора группы. Поэтому системный адми- нистратор должен непрерывно разыскивать и проверять все файлы в сис- теме, для которых установлены эти биты, чтобы посмотреть, не исполь- зуются ли они для несанкционированных целей. Не для всех интерпретаторов shell, нарушающих защиту, владельцем является суперпользователь (root). Один пользователь может запустить shell, владельцем которого является другой пользователь, имеющий бо- лее высокие привилегии. Это фактически предоставляет пользователю, запустившему shell, все возможности владельца файла. Найти shell-интерпретаторы, устанавливающие идентификатор поль- зователя или группы, бывает легко, а бывает и трудно, в зависимости от их авторства. Легко найти такие, которые: а) имеют необычные имена (некоторые нарушители любят выстав- лять свои достижения напоказ); б) содержат в исполняемом файле символьные строки, которые можно прочитать; в) размещены в необычном или очевидном каталоге; г) не имеют ограничений относительно того, кто может их запус- тить. Для изощренных shell-интерпретаторов характерно следующее: а) они имеют имена, похожие на обычные команды системы UNIX; б) имеют размеры файлов, которые соответствуют другим файлам, размещенным неподалеку от них; в) содержат упрятанные символьные строки, которые не так-то легко прочитать; г) имеют, возможно, специальную опцию, запускающую shell, или даже специальный пароль, необходимый для его запуска. Самые хулиганские из ни