Магелланова ошибка: Buffer overrun или кругосветная экспедиция средствами SQLite FTS

в 19:12, , рубрики: Google Chrome, sqlite, vulnerability, WebSQL, браузеры, информационная безопасность, Программирование

Как-то обошли на Хабре недавнюю Magellan-ошибку и связанные с ней уязвимости, попробую исправить это упущение.

Немного истории:

  • 1 Ноября 2018 в Chromium прилетел баг-репорт за номером 900910: "Multiple issues in SQLite via WebSQL." Об ошибке сообщает Wenxiang Qian из Tencent Blade Team.
  • 5 Ноября 2018 ошибку закрывают в ядре библиотеки SQLite (FTS3), где она собственно и живет чуть не со времен создания модуля, т.е. с ноября 2009-го года.
  • 28 Ноября 2018 оно вливается в Chromium
  • Чуть позже Tencent Blade Team публикует сообщение об ошибке, дав ей название Magellan, особенно не раскрывая при этом подробностей, и указав, что публикация готовых эксплойтов и PoC пока не планируется.
  • Через неделю в интернете полно PoC, крэшащих Chrome, Electron dev-framework и т.п. Доказательств и каких-либо других сведений, что уязвимость использовалась в злонамеренных целях по прежнему нет.
  • DRH, подтвердил подозрения на Hacker News, что уязвимость имеет место (как минимум если допускается исполнение "чужого" SQL-запроса, или SQL Injection подобного сценария).

Немного подробнее о Magellan SQLite BUG

Ошибка связана с переполнением суммы целых чисел aka integer overflow, которая может быть вызвана в подсистеме FTS3/4 изменением индекса FTS таблицы, что в свою очередь может привести к переписыванию памяти или завершению с исключением.

Целевое искусственное применение этого целочисленного переполнения, посредством грамотного "обрезания" буферов записи, приводит к переполнению памяти, и может использоваться в дальнейшем специально созданными SQL-запросами.

В результате, в теории могут быть уязвимы многие приложения, использующие SQLite (с виртуальными FTS таблицами) и в частности популярные браузеры, поддерживающие WebSQL на базе SQLite с включенным FTS (например Google Chrome, Chromium, Opera, Slimjet Browser, SRWare Iron, Torch, Comodo Dragon, CoolNovo, Yandex Browser, Vivaldi и т.д.).

Базы данных SQLite вообще очень популярны, предоставляются средствами не одного десятка языков программирования, toolchain, фреймворков и т.д., используются приложениями как для мобильных устройств, так и полноценных компьютеров, и нередко встречаются даже в серверных решениях. Так, например, в этом формате хранят данные популярные веб-браузеры, такие как Google Chrome, Mozilla Firefox и Yandex Browser, множество мессенджеров (например, WhatsApp, Viber, WeChat и другие), и т.д. и т.п.
Тот же Fossil SCM, например, использует базу данных SQLite для хранения истории ревизий и позволяет использовать полнотекстовое индексирование через FTS (и предоставляет доступ к ней из UI/веб-морды, где например есть возможность создания собственных SQL-запросов, к примеру custom ticket reports и т.п.).

Такое "предсказуемое" переполнение и само по себе не очень приятная штука, а если вспомнить, что конкретно может храниться и в самой банке (от содержимого журналов до собственно таблиц)…
Так-что не ленимся товарищи..., и обновляемся, обновляемся.

Исправление [940f2adc8541a838] предоставляется в рамках обновления SQLite 3.25.3 (до которого также обновились Chromium и ко., например Chrome в версии 71.0.3578.80).
Версия SQLite 3.26 предоставляет также дополнительные возможности защиты FTS-контейнеров, например:

support for read-only shadow tables when the SQLITE_DBCONFIG_DEFENSIVE option is enabled

Это кстати уже не первая ошибка вида overflow & buffer overrun в SQLite конкретно и в FTS модуле в частности (например [56be976859294027]), однако вероятно крупнейшая в своем роде по значимости, теоретическому воздействию и относительной "масштабности" в способах возможного применения и оценке последствий этого.

Автор: sebres

Источник


* - обязательные к заполнению поля