Китайские хакеры взломали Минфин США через уязвимость PostgreSQL, связанную с Unicode. SQL-инъекция оставалась незамеченной 9 лет и позволила атакующим захватить контроль над сервером
30 декабря, пока большинство людей готовилось к встрече Нового года, Министерство финансов США столкнулось с куда менее праздничным событием — китайские хакеры проникли в их системы.
Согласно уведомлению, направленному в Конгресс, за атакой стояла группировка, спонсируемая государством (Advanced Persistent Threat, APT).
Однако самым удивительным стало то, каким именно способом взломщики проникли в защищённые серверы: всё произошло из-за SQL-инъекции, связанной с особенностями Unicode в PostgreSQL.
SQL-инъекция в PostgreSQL, которая оставалась незамеченной 9 лет
Критическая уязвимость была найдена в программе управления привилегированным доступом (PAM) от компании BeyondTrust, которая использовала PostgreSQL.
Около 3 млн iOS- и macOS-приложений могли быть атакованы через 10-летнюю «дыру»tproger.ru
Проблема заключалась в функции pg_escape_string
, отвечающей за экранирование пользовательского ввода, и её вызове внутри PostgreSQL-библиотеки libpq
.
Хакеры использовали два байта (c0 27), которые PostgreSQL ошибочно интерпретировал как часть валидного Unicode-символа. В результате этот механизм позволил атакующим внедрить неэкранированный одиночный апостроф (‘), открывший путь для SQL-инъекции.
Этот апостроф позволил хакерам захватить контроль над psql (CLI-интерфейсом PostgreSQL), а оттуда использовать команду !
для выполнения произвольного кода на серверах Минфина США.
Как такую уязвимость могли не заметить?
SQL-инъекции — одна из старейших и самых известных атак, которую разбирают в каждом учебнике по кибербезопасности. Однако эта конкретная уязвимость:
- Скрывалась на уровне Unicode — у PostgreSQL не было встроенной валидации корректности Unicode-символов в PQescapeStringInternal.
- Не представляла угрозы, пока не использовалась в командной строке psql — а это не самый частый сценарий.
- Оставалась незамеченной более 9 лет в одном из самых популярных open-source проектов.
Теперь, после раскрытия проблемы, PostgreSQL выпустил обновление, исправляющее баг в pg_utf_mblen
.
Выводы: строки сложны, Unicode ещё сложнее
Эта история ещё раз доказывает, что обработка строк и кодировки — источник огромного количества неожиданных уязвимостей.
Простая ошибка в обработке Unicode могла оставить PostgreSQL уязвимым на протяжении почти десятилетия.
И напоследок забавный факт: вы можете стать владельцем собственного символа Unicode — например, Buffalo Wild Wings уже «усыновили» эмодзи 🍗, а бейсбольная команда Oakland A’s владеет ⚾, 🐘 и 🌳.