🙈 Когда работаешь с ML-кодом, думаешь про модели, данные и метрики. А вот про безопасность — не всегда. И иногда это выливается в забавные (и не очень) истории. А вот как одна «безобидная» строчка SQL внезапно открывает дверь ко всем экспериментам и моделям проекта.
Мини-история
В OSS-трекере экспериментов добавили поиск по имени 💁. Быстро, «наколенке», через f-string — и поехали на прод. Дальше кто-то закинул в параметр имени "' OR '1'='1", и эндпоинт радостно вернул все записи. Классический SQLi.
def find_experiment(name: str):
# ⚠️ конкатенация параметра прямо в SQL
query = f"SELECT * FROM experiments WHERE name = '{name}'" # <---уязвимость здесь
return cursor.execute(query).fetchall()
Как нужно было
python
python
def find_experiment(name: str):
return cursor.execute(
"SELECT * FROM experiments WHERE name = ?",
(name,)
).fetchall()
К чему это приводит (по OWASP и практике)
- вытащить и массово слить данные (эксперименты, метрики, привязанные токены/секреты);
- менять или удалять записи (ломая историю экспериментов и артефактов);
- эскалировать привилегии и в отдельных конфигурациях захватывать контроль над БД/сервисом.
Почему это не «теория»
JFrog последовательно показывает, что open-source ML-стек и MLOps-платформы нередко уязвимы. начиная с серверной части и до клиентов и пайплайнов. Их серия исследований фиксирует десятки багов в популярных ML-проектах и сервисах вокруг них — отличный разбор attack-surface и ошибок реализации. Вы все еще не настороже? Тогда злоумышленники идут к вам🧍🏻♂️🫵🚶🏻♂️➡️🚶🏻♂️➡️🚶🏻♂️➡️
Что делать прямо сегодня? Ваши варианты. Я начну
1.
2.
3.
4. Негативные тесты. Пробуем "' OR '1'='1" и прочие пэйлоады.