Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
Помогли мы вам |
Словосочетание NPM Package Hijacking уже могло тебе встречаться в исследовании, которое было опубликовано Нейтаном Джонсоном в 2016 году. Однако я расскажу об иной технике, и совпадение здесь в основном в названии.
Началась эта история, когда я еще вел в «Хакере» ежемесячные обзоры эксплоитов. Чтобы пользоваться всеми прелестями формата Markdown, я писал статьи в одном модном тогда редакторе и случайно обнаружил уязвимость типа XSS в модуле предпросмотра статьи. Я всего-то забыл добавить кавычки, чтобы обрамить код очередного эксплоита, и вскоре докопался до RCE!
Я несколько раз отправлял разработчикам информацию об уязвимости, но руки до этого бага у них, видимо, так и не дошли. В очередной раз об этой проблеме я вспомнил, когда наткнулся на статью человека, нашедшего все ту же уязвимость в редакторе Atom.
Это вдохновило меня продолжать исследование и поискать похожие программы. Ведь Node.js в целом и движок Electron в частности все больше набирают популярность и используются во многих распространенных приложениях. Тут тебе и продукты Adobe, и апдейтеры разных игр, редакторы кода и текста, мессенджеры (в том числе «защищенные») и прочий софт. Node.js часто используется для создания установщиков и апдейтеров — Adobe попала в мой список именно так. Или можно вспомнить Nvidia GeForce Experience — утилиту, которая следит за обновлениями другого ПО Nvidia. Она тоже написана на модном нынче Node.js.
Приложения на Electron включают в себя браузер, основанный на Chromium, а к нему обычно идет локальный веб-сервер — он тоже входит в программу и запускается вместе с ней. Так и получается, что на твоем рабочем компе внезапно крутится куча серверного софта. Вот только сисадминов у этого софта нет, а уязвимости или слабые места в защите по-прежнему могут быть проблемой. Об эксплуатации одной из таких слабостей мы и поговорим.
В «Хакере» уже не раз писали о DLL Hijacking, он же DLL/Binary Planting или Preloading. Эта техника работает так. Если разработчик не указал явным образом пути для загрузки библиотек DLL в своем исполняемом файле, то операционная система будет искать эти библиотеки по путям, перечисленным в переменной PATH
(в том числе в Windows, подробнее — в официальной документации). Подложив в какую-то из этих папок вредоносный клон библиотеки, атакующий может исполнить произвольный код.
При загрузке модулей Node.js ищет папку node_modules
по всем путям выше родительской директории вызываемого скрипта, проверяя их, пока не найдет нужный модуль. Получается что-то вроде ../
, где указателей на родительскую папку может быть произвольное количество. Более наглядно это представлено на картинке ниже.
Думаю, ты уже догадался, почему я окрестил эту атаку NPM Hijacking по аналогии с DLL Hijacking. На исследуемых машинах я заметил многочисленные попытки загрузить скрипты из каталогов, перечисленных в переменной PATH
, или домашнего каталога текущего пользователя. Уж эта-то папка доступна без всяких повышенных прав, чем и могут воспользоваться вредоносы. Собственно, такие фокусы уже вовсю практикуются при атаках на веб-серверы с «Нодой», но там защита в целом на более высоком уровне, чем на десктопе, поэтому такая проблема менее опасна.
Давай теперь посмотрим, как эта особенность эксплуатируется в разных приложениях, внутри которых крутятся серваки с Node.js. Мы рассмотрим три примера:
Чат Discord знаменит возможностью общаться голосом, а сделан он на Electron. Неудивительно, что он уязвим перед NPM Hijacking, — проблему я обнаружил во времена версии 0.0.300, о чем и оповестил разработчиков. При запуске Discord ищет следующие скрипты, идя вверх по каталогам:
discord_utils.js
;discord_overlay2.js
;discord_game_utils.js
;discord_spellcheck.js
;discord_contact_import.js
;discord_voice.js
.Сам поиск и загрузка скрипта с точки зрения ОС выглядят как последовательный перебор следующих папок:
C:UsersUserAppDataRoamingdiscord0.0.300modulesdiscord_desktop_corenode_modules
C:UsersUserAppDataRoamingdiscord0.0.300modulesnode_modules
C:UsersUserAppDataRoamingdiscord0.0.300node_modules
C:UsersUserAppDataRoamingdiscordnode_modules
C:UsersUserAppDataRoamingnode_modules
C:UsersUserAppDatanode_modules
C:UsersUsernode_modules
C:Usersnode_modules
C:node_modules
C:UsersUserAppDataRoamingdiscord0.0.300modulesdiscord_voice.js
По умолчанию с первого по девятый пункт операционная система ничего не обнаружит, если у тебя нет таких папок, и только потом (на пункте 10) Node.js начнет поиск скрипта, лежащего не в node_modules
, а отдельно, как и сделано в Discord. Если нам доступна для записи папка пользователя, то мы можем подложить свою библиотеку так, чтобы она загрузилась, например, на пункте 7.
|
|