П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 184079 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 84178 раз(а).

Учебник HTML.
Просмотров 78296 раз(а).

Руководство по PHP5.
Просмотров 48951 раз(а).

Хостинг через призму DNS.
Просмотров 56550 раз(а).

Подборка текстов стандартных документов.
Просмотров 48328 раз(а).

Учебник PHP - Самоучитель
Просмотров 54886 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 55939 раз(а).

Внешние атаки...
Просмотров 45395 раз(а).

Учебник PHP.
Просмотров 40237 раз(а).

SSI в примерах.
Просмотров 30359 раз(а).






 
 
| Добавить в избранное | Сделать стартовой Project.Net.Ru | Помощь





Изменение уровня привилегий

Когда приложение выполняется с EUID отличным от его RUID, оно предоставляет пользователю привилегии, которые ему нужны, но которых у него нет (доступ к файлу, зарезервированный системный вызов...). Однако данные привелегии нужны только на очень короткое время, например при открытии файла, в остальное время приложение может выполняться с привилегиями своего пользователя. Возможно временное изменение EUID приложения при помощи системного вызова:

  int seteuid (uid_t uid);
Процесс всегда может поменять значение своего EUID и присвоить ему значение RUID. В этом случае старый UID хранится в сохранном месте, называемом SUID (Saved UID - сохраненный UID), не путать с SID (Session ID - ID сессии), который используется для взаимодействия с управляющим терминалом. Всегда возможно вернуть назад SUID в качестве EUID. Естественно, программа с нулевым EUID (root) может менять по желанию как свой EUID так и RUID (таким образом работает /bin/su).

Чтобы уменьшить риск атак, советуется менять EUID и использовать вместо него RUID пользователя. Когда части кода требуются привилегии владельца файла, возможно поместить сохраненный UID в EUID. Вот пример:

  uid_t e_uid_initial;
  uid_t r_uid;

  int
  main (int argc, char * argv [])
  {
    /* Сохраняем различные UID-ы */
    e_uid_initial = geteuid ();
    r_uid = getuid ();

    /* Ограничиваем права доступа до прав пользователя,
     * запустившего программу */
    seteuid (r_uid);
    ...
    privileged_function ();
    ...
  }

  void
  privileged_function (void)
  {
    /* Возвращаем назад начальные привилегии */
    seteuid (e_uid_initial);
    ...
    /* Часть кода, которой нужны привилегии */
    ...
    /* Назад к правам пользователя, запустившего программу */
    seteuid (r_uid);
  }

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

Назад | Содержание | Вперед



Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
 





Copyright © 2005-2016 Project.Net.Ru