Научная статья на тему 'NoSQL - инъекции на примере нереляционной СУБД MongoDB'

NoSQL - инъекции на примере нереляционной СУБД MongoDB Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
1259
132
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ИНФОРМАЦИОННАЯ БЕЗОПАСНОСТЬ / БАЗЫ ДАННЫХ / НЕРЕЛЯЦИОННЫЕ СУБД

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Фримучков Андрей Николаевич

В статье рассматриваются вопросы уязвимости нереляционных баз данных, в том числе MongoDB. В настоящее время считается, что нереляционные базы данных, в сравнении с классическими реляционными, являются более безопасными по причине отсутствия SQL и, соответственно, связанных с ним инъекций. Однако нереляционные базы данных имеют целый ряд специфических уязвимостей, как в них самих, так и в системе управления, что делает нереляционные базы данных не такими безопасными, как кажется на первый взгляд.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «NoSQL - инъекции на примере нереляционной СУБД MongoDB»

В современных условиях, при недостатке финансирования автотранспортных предприятий, важным является эффективное использование производственно -технической базы. Ведь это напрямую влияет на состояние подвижного состава. Проведение всего перечня операций ТО и Р, наличие современного оборудования, позволят долгие годы поддерживать исправное техническое состояние транспортных средств предприятия.

Литература

1. Напольский Г. МТехнологическое проектирование автотранспортных предприятий и станций технического обслуживания: учебник для вузов. М.: Транспорт, 1985. 231 с.

2. Юркова Т. И., Юрков C. В. Экономика предприятия / Т. И. Юркова, С. В. Юрков. ГАЦМиЗ. Красноярск, 2006. 116 с.

NOSQL — ИНЪЕКЦИИ НА ПРИМЕРЕ НЕРЕЛЯЦИОННОЙ

СУБД MONGODB Фримучков А. Н.

Фримучков Андрей Николаевич /Frimuchkov Andrey Nikolaevich - студент, факультет кибернетики, Московский технологический университет, г. Москва

Аннотация: в статье рассматриваются вопросы уязвимости нереляционных баз данных, в том числе MongoDB. В настоящее время считается, что нереляционные базы данных, в сравнении с классическими реляционными, являются более безопасными по причине отсутствия SQL и, соответственно, связанных с ним инъекций. Однако нереляционные базы данных имеют целый ряд специфических уязвимостей, как в них самих, так и в системе управления, что делает нереляционные базы данных не такими безопасными, как кажется на первый взгляд. Ключевые слова: информационная безопасность, базы данных, нереляционные СУБД.

Введение

Понятие NoSQL (Not Only SQL или No SQL) получило известность с 2009 года. Именно тогда развитие web-технологий и социальных сервисов дало толчок множеству новых подходов к хранению и обработке данных. Разработчики подобных приложений столкнулись с задачами, для которых традиционные реляционные СУБД оказались либо слишком дороги, либо недостаточно производительны. Кроме того, популяризаторами отказа от универсальных «комбайнов» (реляционные СУБД -РСУБД) в пользу специализированных решений стали молодые проекты и те, кому приходится работать в сценариях так называемых Big Data [1].

Уязвимости NoSQL

Логично будет предположить, что нереляционные СУБД безопасны, потому что в них отсутствуют SQL-запросы и, соответственно, отсутствует возможность провести SQL-инъекцию. Отчасти это так степени, но если в запросе отсутствует SQL-код, это еще не говорит, система безопасна. NoSQL закрывает лишь уязвимости типа SQL-инъекции, при этом оставляя множество других.

Обычно она состоит из трех уровней [3]:

• приложение;

• API базы данных NoSQL;

• NoSQL-СУБД.

Каждый их этих уровней потенциально уязвим. Начнем с нижнего, то есть самой СУБД. Как и любое приложение, СУБД может быть подвержена атакам переполнения буфера или иметь уязвимую схему аутентификации. Атаковать этот уровень сложно, потому что за подобными уязвимостями следят как сообщество, так и разработчики.

Следующий уровень — API. Большинство NoSQL-СУБД имеют огромное количество библиотек для организации доступа к данным. Большинство таких проектов имеют открытый код, но часть из них уже не поддерживаются, поэтому вероятность обнаружить уязвимость на этом уровне гораздо выше.

Ну и наконец, верхний уровень — атакуемое. Здесь нужно попытаться найти места, в которых разработчик забыл проверить входные данные. В данном случае используется тот же подход, что и при поиске SQL-инъекций, однако в данной ситуации придется разбираться с JSON, JavaScript или чем-то подобным.

Уязвимости нижнего уровня NoSQL

Рассмотрим уязвимости (или слабые места) на основе анализа нескольких версий MongoDB [3]:

1. Уязвимое место в системе аутентификации. По-умолчанию БД устанавливается без пароля. Создатели MongoDB предполагают, что БД запускается в полностью доверенном окружении.

2. Уязвимое место в системе авторизации. Любой созданный пользователь по-умолчанию имеет доступ на чтение всей базы данных, то есть он имеет доступ ко всему, что у нас имеется.

3. Уязвимое место в системе авторизации администратора. Пользователь с доступом к базе данных Admin имеет права на чтение/запись откуда/куда угодно. А т.к. по-умолчанию нет пароля, то мы имеем доступ везде.

4. Нешифрованный текст. Все данные передаются в открытом виде, то есть они могут быть перехвачены любой MITM—атакой.

5. Доступ с любых интерфейсов. По-умолчанию, БД доступна со всех интерфейсов, что является потенциальной угрозой, т.к. не ко всем интерфейсам есть доверие.

Инъекции в регулярных выражениях

MongoDB, как и многие другие NoSQL-СУБД, предоставляет возможность выполнять поиск при помощи регулярных выражений. Это очень удобный инструмент, однако он представляет собой серьёзную потенциальную угрозу [3].

Для осуществления поиска при помощи регулярных выражений используется оператор $regex. Запрос «верни мне всех пользователей, логин которых начинается с «user»» представлен на рисунке 1.

db.users.fmd({ login: { $regex: t1Aiiser"} })

Рис. 1. Пример запроса с $regex Обработка самого запроса представлена на рисунке 2.

var regexpPwd= new RegExp("A" + password, "i"); var loginParam= { login: login, password: regexpPwd }

Рис. 2. Выполнение запроса с $regex

Для выполнения инъекции достаточно передать вместо пароля строку «[\s\S]*». Этот приём похож на классическое для SQL «1' or 1=1 --». Решение крайне тривиальное - нужно проверять входные данные.

JSON-инъекции

В MongoDB нет SQL-синтаксиса, однако СУБД не может обойтись без языка запросов, поэтому разработчики MongoDB решили использовать вместо SQL JSON. Поэтому можно попробовать осуществить разные атаки-инъекции (конечно, если нет фильтрации входных данных). Такие атаки обычно называют JSON-инъекциями [2]. Пример самого «небезопасного» кода можно увидеть на рисунке 3.

var loginParam= eval("({ login:+ login + password:'" + password+})");

Рис. 3. Пример небезопасной обработки JSON

Первое, что бросается в глаза это не возможность JSON-иньекции, а использование функции eval. Эта функция выполняет код, которые предан в аргументе, поэтому использовать её не рекомендуется.

Но вернёмся к JSON-иньекции, чтобы её выполнить достаточно передать в логин строку «root'})//», что и было сделано на рисунке 4.

({ login: 'root'})//', password: "}) db.users.findQne({ login: 'root'})

Рис. 4. Эксплуатация уязвимости при обработке JSON Манипуляции с REST-интерфейсом

MongoDB предоставляет REST-интерфейс, который позволяет получить доступ к данным без возможности записи. Кроме того, существует проект под названием Sleepy Mongoose, который реализует полную поддержку REST. Пример такого запроса на рисунке 5.

var qry = "/rest/users/?login-' + login + "& password=" +password: var hash = qry.indexOfi["#"); if (hash >-1) {

qry = qry.substring(0, hash);

}

Рис. 5. Пример запроса через REST-интерфейс

Если мы введём имя пользователя root#, то войдём от имени root, т.к. всё что после # будет проигнорировано. Запрос, конечно же, надуманный и в реальном приложении такое встретить не получится, однако, в том или ином виде подобная уязвимость может быть встречена. Выдох один — фильтрация получаемых данных.

JavaScript-инъекции

Большинство современных реляционных СУБД позволяют создавать хранимые процедуры на сервере. У MongoDB имеются аналогичные возможности, среди которых присутствует серверный JavaScript. Это позволяет исполнять почти любой код на сервере БД. С одной стороны, это даёт возможность писать алгоритмы обработки данных, но с другой — делает приложение более уязвимым.

Области применения JavaScript в MongoDB:

1. Запросы с оператором $where.

2. Команда db.eval.

3. Функции для сохранения в базе данных. Для этого используется специальная системная коллекция system.js.

4. Map/Reduce. Это - программный фреймворк, разработанный компанией Google для параллельных вычислений над большими объемами данных. Заключение

На уровне самой БД при настройках по-умолчанию реализации NoSQL (а именно — MongoDB) существенно проигрывают классических РСУБД. Однако, справедливо было бы заметить, что настройки по-умолчанию не используются на боевых серверах, поэтому, в большинстве случаев, если уязвимость есть только при настройках по-умолчанию, то в серьёзных проектах её не будет. И, всё же, это минус в копилку NoSQL.

А вот на уровне приложения ситуация обстоит гораздо лучше. Большинство уязвимостей основаны на очевидных ошибках в коде и существуют только в примерах, а на практике встретить их практически не представляется возможным.

Литература

1. СУБД NoSQL - сильные и слабые стороны. [Электронный ресурс]. Режим доступа: http://www.jetinfo.ru/stati/silnye-i-slabye-storony-nosql/ (дата обращения: 12.11.2016).

2. Азбука NoSQL-инъекций. [Электронный ресурс]. Режим доступа: https://habrahabr.ru/company/xakep/blog/143909/ (дата обращения: 12.11.2016).

3. Mongodb - Security Weaknesses in a typical NoSQL database. [Electronic resource]. URL: https://www.trustwave.com/Resources/SpiderLabs-Blog/Mongodb—Security-Weaknesses-in-a-typical-NoSQL-database/ (date of access: 12.11.2016).

i Надоели баннеры? Вы всегда можете отключить рекламу.