Вход/Регистрация
19 смертных грехов, угрожающих безопасности программ
вернуться

Виега Джон

Шрифт:

Если вас беспокоят удаленные атаки против реализации AES, то Бернстайн предложил контрмеры против всех известных атак с хронометражем. Популярная реализация Брайана Гладмана защищена против таких атак (см. раздел «Другие ресурсы»). Насколько нам известно, другие реализации AES пока еще недоработаны в этом направлении.

CAN–2005–1411

ICUII – это программа для организации видеочата в реальном времени. В версии 7.0.0 есть ошибка, позволяющая неавторизованному пользователю увидеть пароли из–за слабого списка управления доступом (ACL) некоторым файлом, который разрешено читать всем.

CAN–2005–1133

Этот дефект в операционной системе IBM AS/400 дает классический пример утечки информации – система возвращает разные коды ошибок в зависимости от того, была ли попытка установить сеанс с РОРЗ–сервером неудачной из–за неверного имени пользователя или пароля. Подробное описание ошибки можно найти в статье «Enumeration of AS/400 users via РОРЗ» (www.veneracom/downloads/ Enumeration_of_AS400_users_via_pop3.pdf), а мы ограничимся простым примером:

...

+OK POP server ready

USER notauser

+OK POP server ready

PASS abcd

–ERR Logon attempt invalid CPF2204

USER mikey

+OK POP server ready

PASS abcd

–ERR Logon attempt invalid CPF22E2

Обратите внимание: код CPF2204 означает, что такого пользователя нет, а код CPF22E2 – что пользователь есть, но пароль неверен. Разные сообщения об ошибках очень полезны для противника, поскольку теперь он знает, что пользователя notauser не существует, а пользователь mikey имеется.

Искупление греха

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

Разумеется, конфиденциальные данные нужно защищать с помощью подходящих средств, например списков АСЕ в Windows и Apple MAC OS X 10.4 Tiger или прав доступа в *nix.

Есть и другие защитные меры, такие, скажем, как шифрование (с корректной политикой управления ключами) и управление цифровыми правами (Digital Rights Management – DRM). Механизм DRM в этой книге не рассматривается, но вкратце его суть в том, что пользователь может явно определить, кому разрешено открывать, читать, модифицировать и передавать другим лицам содержимое документов, в частности электронной почты. Организация может создать шаблоны политик управления правами, которые определяют правила, применимые к содержимому документов. Конечно, надо быть готовым к тому, что кто–то окажется достаточно настойчив, чтобы обойти механизм DRM, но на практике немного найдется людей, способных на это.

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

Искупление греха в С# (и других языках)

Следующий пример – это модифицированный вариант греховного кода на С#, который был показан выше, но та же идея применима и к любому другому языку. Обратите внимание, что сообщения об ошибках выводятся лишь, если пользователь обладает правами администратора Windows. Кроме того, предполагается, что в этой программе предварительно запрашивается декларативное разрешение, так что обращения к протоколу событий всегда завершаются успешно, а не возбуждают исключение SecurityException из–за того, что в доступе отказано.

...

try {

// код обращения к SQL-серверу опущен

} catch (SqlException se) {

Status = sqlstring + " failed\r\n";

foreach (SqlError e in se.Errors)

Status += e.Message + "\r\n";

WindowsIdentity user = WindowsIdentity.GetCurrent;

WindowsPrincipal prin = new WindowsPrincipal(user);

if (prin.IsInRole(WindowsBuiltInRole.Administrator))

Response.Write("Error" + Status);

else {

Response.Write("An error occured, please bug your admin");

// Записать данные в протокол Windows Application Event Log

EventLog.WriteEntry("SQLApp", Status.EventLogEntryType.Error);

}

}

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

Учет локальности

Иногда имеет смысл выводить информацию об ошибках только локальным пользователям. Чтобы решить этот вопрос, взгляните на IP–адрес, по которому вы собираетесь отправлять данные. Если он отличается от 127.0.0.1 или его эквивалента в IPv6 (::1), не посылайте данные. Даже если это открытый IP–адрес самой текущей машины, отправленные на него пакеты обычно видны всем машинам в локальной сети.

  • Читать дальше
  • 1
  • ...
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: