The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

В PostgreSQL устранена уязвимость, использованная при атаке на BeyondTrust

16.02.2025 16:11

Сформированы корректирующие обновления для всех поддерживаемых веток PostgreSQL 17.3, 16.7, 15.11, 14.16 и 13.19, в которых исправлено более 70 ошибок и устранена уязвимость (CVE-2025-1094), в конце декабря задействованная в атаке на компанию BeyondTrust и Министерство финансов США. Проблема в PostgreSQL выявлена при анализе удалённой уязвимости (CVE-2024-12356) в сервисах BeyondTrust PRA (Privileged Remote Access) и BeyondTrust RS (Remote Support), при эксплуатации которой дополнительно была задействована ранее неизвестная (0-day) уязвимость в libpq.

В результате атаки злоумышленникам удалось получить ключ для доступа к API, применяемому для удалённого оказания услуг технической поддержки клиентам SaaS-сервисов BeyondTrust. Данный API был использован для сброса пароля и компрометации инфраструктуры Министерства финансов США, пользующегося продуктами BeyondTrust. В ходе атаки злоумышленники смогли загрузить конфиденциальные документы и получили доступ к рабочим станциям сотрудников министерства.

Уязвимость проявляется в библиотеке libpq, предоставляющей API для взаимодействия с СУБД из программ на языке Си (поверх библиотеки также реализованы библиотеки-обвязки для C++, Perl, PHP и Python). Проблема затрагивает приложения, использующие для экранирования спецсимволов и нейтрализации кавычек функции PQescapeLiteral(), PQescapeIdentifier(), PQescapeString() или PQescapeStringConn().

Атакующий может добиться подстановки своего SQL-кода, если получаемый извне текст перед использованием внутри SQL-запроса экранируется при помощи вышеотмеченных функций libpq. В приложениях BeyondTrust экранированные подобным образом запросы передавались через утилиту командной строки psql. Уязвимость вызвана отсутствием проверки корректности Unicode-символов в функциях экранирования, что позволяет обойти нормализацию кавычек через указание некорректных многобайтовых последовательностей UTF-8.

Для эксплуатации уязвимость можно использовать некорректный UTF-8 символ, состоящий из байт 0xC0 и 0x27 ("└'"). Байт 0x27 в ASCII-кодировке соответствует одинарной кавычке ("'"), подлежащей экранированию. В коде экранирования сочетание байтов 0xC0 и 0x27 обрабатывается как один Unicode-символ. Соответственно, байт 0x27 в такой последовательности остаётся не экранирован, при том, что при обработке SQL-запроса в утилите psql он обрабатывается как кавычка.

При запуске SQL-запросов при помощи утилиты psql для организации выполнения произвольного кода можно использовать подстановку в строку команды "\!", предназначенной в psql для запуска произвольных программ. Например, для запуска на сервере утилиты "id" можно передать значение "hax\xC0'; \! id #". В примере ниже для экранирования вызывается PHP-скрипт dbquote, использующий PHP-функцию pg_escape_string, работающую поверх функции PQescapeString из libpq:


   $ echo -e "hello \xC0'world'" | ./dbquote  
   'hello └'world'''

   $ quoted=$(echo -e "hax\xC0'; \! id # " | ./dbquote)

   $ echo "SELECT COUNT(1) FROM gw_sessions WHERE session_key = $quoted AND session_type = 'sdcust' AND (expiration IS NULL OR expiration>NOW())" | psql -e

   SELECT COUNT(1) FROM gw_sessions WHERE session_key = 'hax└';
   ERROR:  invalid byte sequence for encoding "UTF8": 0xc0 0x27

   uid=1000(myexamplecompany) gid=1000(myexamplecompany) 

Дополнение: Внесённое в libpq исправление привело к появлению регрессии (функция PQescapeIdentifier перестала учитывать поле с размером). Для устранения регрессии 20 февраля планируют опубликовать внеплановое обновление.

  1. Главная ссылка к новости (https://www.postgresql.org/abo...)
  2. OpenNews: Уязвимость в PostgreSQL, позволяющая выполнить код с правами рабочего процесса
  3. OpenNews: Релиз СУБД PostgreSQL 17
  4. OpenNews: Уязвимость в PostgreSQL, позволяющая выполнить SQL-код с правами пользователя, запускающего pg_dump
  5. OpenNews: В CVE опубликованы отчёты о ложных уязвимостях в curl, PostgreSQL и других проектах
  6. OpenNews: Оценка изменения производительности СУБД PostgreSQL за последние 15 лет
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/62722-postgresql
Ключевые слова: postgresql
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (23) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.2, Аноним (-), 16:32, 16/02/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    > Соответственно, байт 0x27 в такой последовательности остаётся не экранирован,
    > при том, что при обработке SQL-запроса в утилите psql он обрабатывается как кавычка.

    Сиквель такой сиквель. Bobby Tables наносит ответный удар!

     
  • 1.3, Аноним (3), 16:36, 16/02/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +6 +/
    Чем сильнее удешевляется производство софта, тем больше ошибок будет в нём. Тестирование сейчас вообще переложили на конечных пользователей.
     
  • 1.13, Карлос Сношайтилис (ok), 17:15, 16/02/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Почему в одном продукте используются разные парсеры utf8?
     
     
  • 2.31, филателист (?), 22:17, 16/02/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Много команд. Легаси... причины разные. Слишком большой продукт.
     
     
  • 3.39, EULA (?), 05:22, 17/02/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Это не легаси - это отсутствие архитектора ПО в команде.
    Он должен определять набор инструментария в коде
     
     
  • 4.40, n00by (ok), 09:14, 17/02/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ныне демократия и каждый архитектор.
     

  • 1.17, Аноним (-), 17:59, 16/02/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    > Уязвимость проявляется в библиотеке libpq, предоставляющей
    > API для взаимодействия с СУБД из программ на языке Си
    > Уязвимость вызвана отсутствием в функциях экранирования проверки
    > корректности используемых в тексте Unicode-символов

    Абсолютно неудивительно при отсутствии поддержки utf8 из коробки.
    В итоге в двух либах на одном и том же может быть две разные реализации поддержки utf8. А то и три.

     
     
  • 2.36, Аноним (36), 00:52, 17/02/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Хорошая попытка разобраться в том, что произошло, но вина на пхп, а точнее на факте того, что зачем-то этот пхп там что-то экранирует и код исполняет. Что это за монстр где между двумя сишками проложили скрипт, который тебе код при нужном запросе исполнит.
     

  • 1.20, Аноним (20), 18:16, 16/02/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    Я ничего не понял. Там не использовались подготовленные запросы, вместо этого полагались на внешние функции экранирования?! Подготовленные запросы - стандартная практика: удобно, надёжно, безопасно. Выглядит так, как будто сотрудник, писавший код, специально оставил бэкдор, а потом уволился, и его проэксплуатировал. Либо как если там такой код со времён отсутствия подготовленных запросов в принципе, код был куплен злоумышленниками у инсайдеров, и после этого нашли. Понятно, откуда такая уязвимость в PostgreSQL - экранирование давно никто в здравом уме не использует.
     
     
  • 2.35, anonymos (?), 00:42, 17/02/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    А это - правильный вопрос!
     
  • 2.41, n00by (ok), 09:18, 17/02/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Если кто-то прочёл написанное выше и не понял, что такое "подготовленный запрос", ему следует не лезть в поисковик, а сменить вид деятельности. Если не хочет, значит принудительно. Новость показывает, почему такие деятели опасны для остальных.
     
     
  • 3.42, Аноним (42), 11:38, 17/02/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    А также сменить вид деятельности тем, кто использует "подготовленный запрос" вместо prepared statement.
     
     
  • 4.44, Аноним (44), 15:33, 17/02/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > А также

    с*ечь на костре всех формалистов

     
  • 4.45, n00by (ok), 16:25, 17/02/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Совершенно не важно, как там оно названо: речь о способности размышлять, а не угождать белому господину.
     
  • 2.43, Другой аноним (?), 11:54, 17/02/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Дада конечно. В курсе что например драйвер JDBC будет делать запрос с литералами, даже если вы честный буратино и в своём коде Java используете подготовленные запросы. Параметр prepareThreshold, по умолчанию 5. Только на 5-й повторённый запрос с PreparedStatement это будет действительно PreparedStatement. Предыдущие 4 с литералами.
     
     
  • 3.47, похнапоха. (?), 14:08, 18/02/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    А тебя не смущает, что PreparedStatement - это ИНТЕРФЕЙС и его реализация ложится на поставщика JDBC драйвера?
     

  • 1.34, Аноним (-), 23:06, 16/02/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Интересно, а хедеры всех браузеров от того же защищены?
     
  • 1.37, fidoman (ok), 03:39, 17/02/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    >В приложениях BeyondTrust
    >через утилиту командной строки psql

    В приложениях... или в по-бырому наляпаных на коленке скриптах?

     
     
  • 2.49, нах. (?), 18:00, 18/02/2025 [^] [^^] [^^^] [ответить]  
  • +/
    это приложению такое!
    (я и похужее видал)

     

  • 1.38, Аноним (38), 03:47, 17/02/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Ждем фикс фикса 20го числа, ибо исправляя CVE умудрились влепить регрессию.
     
  • 1.46, Аноним (46), 12:51, 18/02/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    У меня Postgres до сих пор на KOI8.
    Думаете, пора ли переходить на локаль UTF8?
     
     
  • 2.50, нах. (?), 18:08, 18/02/2025 [^] [^^] [^^^] [ответить]  
  • +/
    cp1251 should be enough for all

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

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2025 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру