пятница, 1 июля 2011 г.

Скорее я нахожусь с другой стороны этого герметичного люка

Это перевод It rather involved being on the other side of this airtight hatchway. Автор: Реймонд Чен.

Не всякий баг внедрения кода (code injection bug) является ошибкой безопасности.

Да, баг по внедрению кода - это, действительно, очень серьёзная ошибка. Но это не делает его автоматически проблемой безопасности - пока этот баг не позволяет кому-то делать то, что они обычно не могут.

К примеру, предположим, у вас есть баг, при котором кто-то может ввести очень длинную строку в какой-то edit и нажать "Сохранить", а программа переполнит буфер. Проделав упорную работу, этот баг можно превратить в баг внедрения кода - путём введения специально подобранной строки. Но это ещё не является проблемой с безопасностью программы. Пока вы просто нашли серьёзный баг в программе (да - это странно, что я преуменьшаю серьезность ошибки, но только потому, что я сравниваю его с дырой в безопасности).

Посмотрите, что вы можете сделать: вы могли бы заставить программу выполнить ваш код. Да уж, большая проблема. Вы и так можете выполнить ваш код, для этого не нужно тратить столько усилий. Если вы хотите выполнить ваш код, то просто поместите его в программу и запустите её!

Сложный путь
  1. Напишите код, который вы хотите внедрить, скомпилируйте его в native-код целевой машины.
  2. Проанализируйте ошибку, разработайте специальную строку для ввода, чьё двоичное представление приведёт к перезаписи адреса возврата, записывая в него адрес внутри этой же строки, которая и содержит ваш код.
  3. Напишите кодировщик, который берёт код, который вы написали в шаге 1, и конвертирует его в допустимую строку без нулей (потому что нуль внутри строки будет считаться её терминатором).
  4. Запишите декодер, код которого не будет содержать нулей.
  5. Соедините код с шага 3 с декодером с шага 4 и пристыкуйте результат к строке на шаге 2.
  6. Введите полученную строку в программу.
  7. Наблюдайте за выполнением вашего кода.

Простой путь
  1. Напишите код, который вы хотите внедрить (вы можете писать на любом удобном вам языке любым удобным способом).
  2. Запустите код.
Это всё равно что сказать, что окна в чьём-то доме небезопасны, потому что вор может попасть в дом, открыв их изнутри.

Внедрение кода не является проблемой безопасности, пока оно не позволяет повысить привилегии. Иными словами, если атакующий сможет сделать что-то, на что обычно у него нет прав. Если вектор атаки требует установки ключа реестра, то у атакующего уже должно быть достаточно прав, чтобы писать в реестр - но в этом случае они могут просто забыть про "отпирание окон изнутри" и просто заменить код, работающий с реестром для запуска эксплоита, на код самого эксплоита. Предполагаемый вектор атаки является просто отвлекающим манёвром. Вор уже внутри дома.

Или, предположим, что вы нашли технику, которая может заставить приложение записать куда-то важную информацию; и эта техника запускается настройкой, которую может включить только администратор. Поэтому, чтобы воспользоваться этой "дырой", вам нужны администраторские привилегии - но в этом случае: а чего вам вообще останавливаться только на логгировании? Если уж у вас есть администраторские полномочия, то вы можете просто заменить приложение хакнутой версией, которая делает всё, что вам угодно.

Конечно же, внедрение кода вполне может быть проблемой с безопасностью - если оно позволяет поднять свои привилегии. К примеру, если вы можете внедрить код в программу, запущенную с другим уровнем безопасности (или на другой машине) - то у вас появляется возможность для поднятия уровня привилегий: теперь вы можете сделать что-то (выполнить свой код), чего раньше вы сделать не могли. Вот почему крайне внимательно нужно относиться к написанию Unix программ root-setuid и Windows служб: эти программы работают с повышенными привилегиями и поэтому любой баг внедрения кода становится фатальной дырой в безопасности.

Общей отправной точкой для повышения прав доступа является Интернет-взлом. Если какой-то хакер в Интернете сможет внедрить код в ваш компьютер, то они успешно повысят свои привилегии, потому что хакер раньше не имел возможности выполнить произвольный код на вашей машине, а теперь - может. В следующий раз мы посмотрим на некоторые (возможно - неожиданные) места в вашей программе, которые могут стать уязвимыми для атак из Интернета, даже если вы думаете, что ваша программа не сталкивается с сетью.

1 комментарий:

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

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

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

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

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