понедельник, 26 апреля 2010 г.

Будьте осторожны, передавая дескрипторы безопасности между машинами

Это перевод Be careful when interpreting security descriptors across machine boundaries. Автор: Реймонд Чен.

Хотя функция AccessCheck может быть использована для проверки того, разрешает ли указанный дескриптор безопасности (security descriptor) доступ к токену, вам нужно быть в курсе, откуда пришёл этот дескриптор. Если он пришёл с другой машины (например, вы получили его вызовом GetNamedSecurityInfo для файла на сетевом пути), то вызов функции AccessCheck на вашей машине может давать результат, отличный от выполнения функции на удалённой машиине. Другими словами, может случиться так, что AccessCheck скажет вам, что у вас есть доступ, а на самом деле, его у вас нет.

Как такое может произойти?

Во-первых, есть много SID, которые зависят от машины. Если удаленный объект разрешает доступ, скажем, группе администраторов (Builtin Administrators), то запуск функции AccessCheck будет делать проверку для объектов машины, на которой она запущена. И если вы входите в группу Builtin Administrators на своей машине, но не входите в группу Builtin Administrators на удалённой машине, то вот и получится ситуация, когда вы думаете, что вы имеете доступ, а на самом деле его у вас нет.

В дополнение к SID, относительным к машине, есть также проблема, что токены могут потерять своё значение (identity) во время передачи по сети. Например, если на сервере включена политика ForceGuest, то не имеет значения, чем на самом деле является ваш токен, потому что на удалённой машине вы будете гостем.

Мораль истории: попытка определить, имеете ли вы доступ к объекту, не производя доступа к объекту, сложнее, чем кажется. Обычно вы получите гораздо лучшие результаты, просто пытаясь получить доступ к объекту без проверки. Нет смысла эмулировать действия, которые захочет сделать удалённый компьютер, если вы можете просто попросить его сделать проверку за вас!

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.