Проверка параметров

Проверка параметров

Системные вызовы должны тщательно проверять все свои параметры для того, чтобы убедиться, что их значения адекватны и законны. Системные вызовы выполняются в пространстве ядра, и если пользователь может передать неправильные значения ядру, то стабильность и безопасность системы могут пострадать.

Например, системные вызовы для файлового ввода-вывода данных должны проверить, является ли значение файлового дескриптора допустимым. Функции, связанные с управлением процессами, должны проверить, является ли значение переданного идентификатора PID допустимым. Каждый параметр должен проверяться не только на предмет допустимости и законности, но и на предмет правильности значения.

Одна из наиболее важных проверок — это проверка указателей, которые передает пользователь. Представьте, что процесс может передать любой указатель, даже тот, который указывает на область памяти, не имеющей прав чтения! Процесс может таким обманом заставить ядро скопировать данные, к которым процесс не имеет доступа, например данные, принадлежащие другому процессу. Перед тем как следовать указателю, переданному из пространства пользователя, система должна убедиться в следующем.

• Указатель указывает на область памяти в пространстве пользователя. Нельзя, чтобы процесс заставил ядро обратиться к памяти ядра от имени процесса.

• Указатель указывает на область памяти в адресном пространстве текущего процесса. Нельзя позволять, чтобы процесс заставил ядро читать данные других процессов.

• Для операций чтения есть права на чтение области памяти. Для операций записи есть права на запись области памяти. Нельзя, чтобы процессы смогли обойти ограничения на чтение и запись.

Ядро предоставляет две функции для выполнения необходимых проверок при копировании данных в пространство пользователя и из него. Следует помнить, что ядро никогда не должно слепо следовать за указателем в пространстве пользователя! Одна из этих двух функций должна использоваться всегда.

Для записи в пространство пользователя предоставляется функция copy_to_user(). Она принимает три параметра: адрес памяти назначения в пространстве пользователя; адрес памяти источника в пространстве ядра; и размер данных, которые необходимо скопировать, в байтах.

Для чтения из пространства пользователя используется функция copy_from_user(), которая аналогична функции copy_to_user(). Эта функция считывает данные, на которые указывает второй параметр, в область памяти, на которую указывает первый параметр, количество данных — третий параметр.

Обе эти функции возвращают количество байтов, которые они не смогли скопировать в случае ошибки. При успешном выполнении операции возвращается нуль. В случае такой ошибки стандартным является возвращение системным вызовом значения -EFAULT.

Давайте рассмотрим пример системного вызова, который использует функции copy_from_user() и copy_to_user(). Системный вызов silly_copy() является до крайности бесполезным. Он просто копирует данные из своего первого параметра во второй. Это очень не эффективно, так как используется дополнительное промежуточное копирование в пространство ядра безо всякой причины. Но зато это позволяет проиллюстрировать суть дела.

/*

* Системный вызов silly copy — крайне бесполезная функция,

* которая копирует len байтов из области памяти,

* на которую указывает параметр src, в область памяти,

* на которую указывает параметр dst, с использованием ядра

* безо всякой на то причины. Но это хороший пример!

*/

asmlinkage long sys_silly_copy(unsigned long *src,

 unsigned long *dst, unsigned long len) {

 unsigned long buf;

 /* возвращаем ошибку, если размер машинного слова в ядре

    не совпадает с размером данных, переданных пользователем */

 if (len != sizeof(buf))

  return -EINVAL;

 /* копируем из src, который является адресом в пространстве

    пользователя, в buf */

 if (copy_from_user(&buf, src, len))

  return -EFAULT;

 /* копируем из buf в dst, который тоже является адресом

    в пространстве пользователя */

 if (copy_to_user(dst, &buf, len))

  return -EFAULT;

 /* возвращаем количество скопированных данных */

 return len;

}

Следует заметить, что обе функции, copy_from_user() и copy_to_user(), могут блокироваться. Это возникает, например, если страница памяти, содержащая данные пользователя, не находится в физической памяти, а в данный момент вытеснена на диск. В таком случае процесс будет находиться в приостановленном состоянии до тек пор, пока обработчик прерываний из-за отсутствия страниц (page fault handler) не возвратит страницу памяти в оперативную память из файла подкачки на диске.

Последняя проверка — это проверка на соответствие правам доступа. В старых версиях ядра Linux стандартом было использование функции suser() для системных вызовов, которые требуют прав пользователя root. Эта функция просто проверяла, запущен ли процесс от пользователя root. Сейчас эту функцию убрали и заменили более мелко структурированным набором системных "возможностей использования" (capabilities). В новых системах предоставляется возможность проверять специфические права доступа к специфическим ресурсам. Функция capable() с допустимым значением флага, определяющего тип прав, возвращает ненулевое значение, если пользователь обладает указанным правом, и нуль— в противном случае. Например, вызов capable (CAP_SYS_NICE) проверяет, имеет ли вызывающий процесс возможность модифицировать значение параметра nice других процессов. По умолчанию суперпользователь владеет всеми правами, а пользователь, не являющийся пользователем root, не имеет никаких дополнительных прав. Следующий пример системного вызова, который демонстрирует использование возможностей использования, тоже является практически бесполезным.

asmlinkage long sys_am_i_popular(void) {

 /* Проверить, имеет пи право процесс использовать

    возможность CAP_SYS_NICE */

 if (!capable(CAP_SYS_NICE))

  return -EPERM;

 /* Возвратить нуль, чтобы обозначить успешное завершение */

 return 0;

}

Список всех "возможностей использования" и прав, которые за ними закреплены, содержится в файле <linux/capability.h>.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Проверка внедрения

Из книги Модель зрелости процессов разработки программного обеспечения автора Паулк Марк

Проверка внедрения Проверка 1 Регулярная проверка высшим руководством выполнения работ по планированию разработки.Регулярные проверки проводятся высшим руководством для получения своевременной информации о производственном процессе и его понимания на


5.5.2.4. Проверка драйвера

Из книги Fedora 8 Руководство пользователя автора Колисниченко Денис Николаевич

5.5.2.4. Проверка драйвера После загрузки убедитесь, что драйвер установлен и используется. Нажмите ‹Alt+F2›, введите system-config-display, перейдите в раскрывшемся окне на вкладку Оборудование и щелкните на кнопке Настроить напротив строки с идентификацией видеокарты. В


12.3. Проверка правописания

Из книги Linux для пользователя автора Костромин Виктор Алексеевич

12.3. Проверка правописания Прежде, чем перейти к рассмотрению текстовых редакторов под Linux, необходимо кратко рассмотреть программу проверки правописания ispell. Дело в том, что проверка правописания - это одна из функций, которую должен иметь современный текстовый редактор,


Проверка орфографии

Из книги Adobe InDesign CS3 автора Завгородний Владимир

Проверка орфографии Проверка орфографии в Adobe InDesign может выполняться «на лету» или в специальном диалоговом окне. Включить и отключить проверку «на лету» можно, выполнив команду Edit ? Spelling ? Dynamic Spelling (Редактирование ? Орфография ? Динамическая проверка орфографии).


Проверка

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Проверка Инструкция проверки рассматривалась при обсуждении утверждений (лекция 11). Она говорит, что определенные утверждения должны удовлетворяться в определенных точках:checkassertion -- Одно или больше


Проверка и ремонт

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

Проверка и ремонт Firebird предоставляет утилиты для проверки логических структур в базе данных и идентификации незначительных проблем, а также некоторый их ремонт. Множество таких ошибок может появляться время от времени, особенно в средах, где сети нестабильные или


Проверка ссылок

Из книги Как раскрутить и разрекламировать Web-сайт в сети Интернет автора Загуменов Александр Петрович

Проверка ссылок До начала рекламной кампании стоит убедиться в том, что в текстах страниц, размещенных на сайте, нет технических ошибок. К таковым относятся неправильно расставленные ссылки, отсутствие каких-либо файлов и собственно погрешности в HTML-коде, а также


Проверка правописания

Из книги Введение в криптографию автора Циммерманн Филипп

Проверка правописания Пользователи не любят опечаток и грамматических ошибок и из-за них могут отказаться от посещения вашего сайта. Если вас плохо владеете орфографией и пунктуацией, попросите кого-нибудь сведущего проверить правописание текста, либо воспользуйтесь


Проверка подлинности

Из книги Язык Си - руководство для начинающих автора Прата Стивен

Проверка подлинности Один из способов определения подлинности сертификата — некоторая механическая процедура. Существует несколько методик её проведения. Например, вы можете попросить своего корреспондента передать копию его открытого ключа "физически", то есть


Проверка

Из книги Linux глазами хакера автора Флёнов Михаил Евгеньевич

Проверка      Так ли уж правильны наши рассуждения? Давайте проверим нашу функцию на учебной программе:/* проверка функции getint( )*/#define STOP - 1#define NONUM 1#define YESNUM 0main( ){int num, status;printf(" Программа прекращает считывание чисел, если встречает EOF. " );while((status = getint(&num)) != STOP)if(status = =


12.3. Проверка конфигурации

Из книги HTML5 для веб-дизайнеров автора Джереми Кит

12.3. Проверка конфигурации Мы рассмотрели достаточно много правил конфигурирования системы, и помнить все невозможно. Настройка системы достаточно сложный процесс, во время которого очень легко ошибиться. Но т.к. есть определенные правила конфигурирования, т.е. и


Проверка

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид


18.3.8. Проверка параметров, передаваемых сценарию

Из книги C++ для начинающих автора Липпман Стенли

18.3.8. Проверка параметров, передаваемых сценарию Оператор if может применяться при определении числа параметров, которые передаются сценарию. Чтобы проверить, соответствует ли количество необходимых параметров количеству вызываемых параметров, используется


Проверка

Из книги автора

Проверка Установка цветов в соответствии с правилами может здорово помочь при проверке данных на этапе ввода. Например, аварийным красным будут выделяться значения, явно выходящие за рамки указанного диапазона, или подсвечиваться желтым «подозрительные» слова и цифры.