Эфир 18.11 · Поток 318 ноября в 19:00 МСК — бесплатный практический эфир по ИИ-агентам · Живой Поток 3 стартует 23.11Эфир 18 ноября →Поток 3 (23.11)
Безопасность и правоAPI / Продукт · В работуSimon Willison→ оригинал

llm 0.37.2 закрыл утечку: ключ OpenAI мог уйти стороннему провайдеру

В CLI-утилите llm Саймона Уиллисона нашли две уязвимости: ключ OpenAI мог уйти стороннему провайдеру, подключённому как OpenAI-совместимый эндпоинт. О проблеме сообщил исследователь Daniel de Araujo. Выпуск 0.37.2 закрывает обе дыры. Если вы гоняете через llm и OpenAI, и чужие API, обновитесь и подумайте о ротации ключа.

AI-обработка оригинала Simon Willison; редакция Hamidun News
llm 0.37.2 закрыл утечку: ключ OpenAI мог уйти стороннему провайдеру
Источник: Simon Willison. Коллаж: Hamidun News.
Слушать статью
Паспорт материала и цифры
ПараметрДанные
ПервоисточникSimon Willison ↗
Главный редактор
Случай 1ключ из api_key_name ни разу не сохраняли
Случай 2модель с responses: true и флагом -o chat_completions 1
Лечениеобновиться до llm 0.37.2 и проверить ключи

Утилита llm Саймона Уиллисона давно стала для многих разработчиков швейцарским ножом для общения с языковыми моделями из терминала. Она умеет ходить не только в OpenAI, но и к любым провайдерам с OpenAI-совместимым API. Именно на этой гибкости и нашли проблему: в версии 0.37.2 закрыли уязвимость, из-за которой секретный ключ OpenAI мог отправиться не тому адресату.

Что случилось

В llm есть механизм подключения чужих эндпоинтов через файл extra-openai-models.yaml. Начиная с версии 0.37 им управляет отдельная команда llm openai endpoint add. Идея простая: многие провайдеры и локальные серверы повторяют формат API OpenAI, так что их можно описать в конфиге и работать с ними как с обычными моделями.

Исследователь Daniel de Araujo обнаружил два способа, при которых ваш ключ OpenAI мог уйти на такой сторонний эндпоинт. По теме заведены две security-рекомендации на GitHub: GHSA-v9h7-jj4g-f862 и GHSA-r639-rr7r-x72w.

  • Ключ по api_key_name не был сохранён. Для стороннего эндпоинта вы указываете, под каким именем хранится его ключ. Если такой ключ ни разу не сохраняли, утилита не должна была подставлять вместо него ничего другого. Судя по описанию уязвимости, подставляла настроенный ключ OpenAI.
  • Модель с responses: true запустили с -o chat_completions 1. Эта комбинация переключала запрос на другой режим работы, и ключ тоже мог уехать не туда.

В обоих случаях никакого злого умысла не нужно. Достаточно забыть добавить ключ или передать опцию, и секрет окажется у третьей стороны.

Почему это неприятно

Представьте типичную настройку. У вас в llm сохранён ключ OpenAI для рабочих задач. Вы подключили эндпоинт небольшого провайдера или чужой прокси, чтобы сравнить модели. Вписали имя ключа в конфиг, но сам ключ добавить не успели. Запускаете команду, а запрос с вашим ключом OpenAI уходит на сервер, который вы не контролируете.

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

Что делать

  1. Обновиться до llm 0.37.2. Это основной шаг, и он закрывает оба сценария.
  2. Открыть extra-openai-models.yaml и посмотреть, какие эндпоинты там описаны. Проверьте, что для каждого указан api_key_name и что соответствующий ключ действительно сохранён.
  3. Вспомнить, не запускали ли вы модели с responses: true вместе с -o chat_completions 1. Если да, а эндпоинт не принадлежит OpenAI, лучше считать ключ скомпрометированным.
  4. При малейшем сомнении перевыпустить ключ OpenAI. Это дёшево, а лишний риск не нужен.

Есть и общий урок. Ключи для разных провайдеров нужно разделять жёстко. Если у вас несколько эндпоинтов, ключ OpenAI не должен быть тем значением, которое инструмент подставляет по умолчанию. Для экспериментов с чужими API разумно заводить отдельные ключи с ограниченными лимитами.

Ограничения

В релиз-заметке нет подробностей о том, как именно эксплуатируется уязвимость, и нет данных о реальных случаях утечек. Автор описывает проблему как случайную отправку ключа, а не как атаку, которую можно запустить удалённо. Это снижает остроту, но не отменяет необходимости обновиться: ошибки конфигурации случаются у всех.

Похожий класс багов встречается и в других инструментах, где один клиент работает с несколькими провайдерами. Всё, что принимает «OpenAI-совместимый» адрес и при этом хранит ключ OpenAI, стоит проверить на то же поведение: что подставляется, когда ключ для адреса не найден.

Практический вывод

Если вы используете llm только с OpenAI, вас это почти не касается. Если подключали сторонние эндпоинты, обновитесь сейчас и сверьте конфиг. А при любой подозрительной комбинации опций перевыпустите ключ.

Сюжет

Вопросы и ответы по материалу

Что известно по теме: что случилось?

В llm есть механизм подключения чужих эндпоинтов через файл extra-openai-models.yaml. Начиная с версии 0.37 им управляет отдельная команда llm openai endpoint add. Идея простая: многие провайдеры и локальные серверы повторяют формат API OpenAI, так что их можно описать в конфиге и работать с ними как с обычными моделями. Исследователь Daniel de Araujo обнаружил два способа, при которых ваш ключ OpenAI мог уйти на такой сторонний эндпоинт.

Что известно по теме: почему это неприятно?

Представьте типичную настройку. У вас в llm сохранён ключ OpenAI для рабочих задач. Вы подключили эндпоинт небольшого провайдера или чужой прокси, чтобы сравнить модели. Вписали имя ключа в конфиг, но сам ключ добавить не успели. Запускаете команду, а запрос с вашим ключом OpenAI уходит на сервер, который вы не контролируете. У такого провайдера окажется рабочий ключ с вашим лимитом и биллингом. Любой сторонний эндпоинт, особенно самодельный или экспериментальный, потенциально может его логировать.

Что известно по теме: что делать?

Обновиться до llm 0.37.2. Это основной шаг, и он закрывает оба сценария. Открыть extra-openai-models.yaml и посмотреть, какие эндпоинты там описаны. Проверьте, что для каждого указан api_key_name и что соответствующий ключ действительно сохранён. Вспомнить, не запускали ли вы модели с responses: true вместе с -o chat_completions 1. Если да, а эндпоинт не принадлежит OpenAI, лучше считать ключ скомпрометированным. При малейшем сомнении перевыпустить ключ OpenAI. Это дёшево, а лишний риск не нужен.

ЖХ
Жемал Хамидун — CPO Alpina Digital, продакт-менеджер AlpinaGPT. Делает AI-продукты с 2019 года. Hamidun News — pet project, который вырос в production-агрегатор с 6000+ читателей.
✦ Единое AI-пространство · Nomad

Протестируйте новые LLM и мультимодальные модели в одном окне

Платформа Nomad AI (nomadnet.ai) даёт прямой доступ к Claude Opus 5.5, GPT-6, Gemini 3.1, DeepSeek и автономным агентам без VPN, зарубежных карт и зоопарка подписок.

Открыть Nomad AI →Автономный Nomad Agent
Что вы думаете?
Загружаем комментарии…