flawopen.com/Teardowns/cve-2026-25592-semantic-kernel-agent-file-write
CVE-2026-25592: запись файлов в Semantic Kernel
CVE-2026-25592 открыла модели хостовую функцию загрузки Semantic Kernel и позволила писать на хост. Удалите доступ модели и обновите пакет.[2]
Курьер может перенести посылку из закрытой тестовой комнаты в офис компании. По правилам он должен принимать поручения только от сотрудников, но его пропуск заставлял его слушаться и ИИ-помощника. Вредоносная записка могла убедить помощника выбрать офисный ящик. Исправление убирает пропуск, который позволял модели вызывать эту функцию; для вызовов из приложения всё равно нужно ограничить допустимое место назначения.[1], [2]
Ключевые понятия и термины
KernelFunction- Атрибут Semantic Kernel, который объявляет метод модели как вызываемый инструмент.[1], [2]
Связи со стандартами
- Ссылка CWE для слабого места, описанного в этом руководстве: CWE-22
Анализ первопричины
SessionsPythonPlugin в Semantic Kernel для .NET связывает удалённый сеанс Python с хостом приложения. DownloadFileAsync получает файл из сеанса и может сохранить возвращённые байты на хосте по пути localFilePath. Метод имел атрибут KernelFunction, который показывал его аргументы модели при выборе инструмента. Если злоумышленник мог повлиять на вход агента, он мог попытаться заставить его вызвать эту функцию с нежелательным путём. Это ошибка авторизации инструмента и границы файлового пути, а не дефект языковой модели и не выход из sandbox удалённого Python-сеанса. Исправление Microsoft удаляет KernelFunction из DownloadFileAsync, поэтому модель больше не может вызвать метод. Если код приложения продолжает использовать функцию, настройте и применяйте явную политику разрешённых каталогов; upstream-реализация разрешает любые пути, если список пуст. GHSA-2ww3-72rp-wpp4 указывает версии NuGet Microsoft.SemanticKernel.Plugins.Core ниже 1.71.0, а также версии PyPI semantic-kernel ниже 1.39.3; эта статья разбирает описанную Microsoft цепочку .NET.[1], [2], [3]
Область пакетов и исправленные версии
| Пакет / область | Затронутые и исправленные версии | Что рассматривает статья |
|---|---|---|
.NET Microsoft.SemanticKernel.Plugins.Core | Затронуты версии < 1.71.0; исправлено в 1.71.0 и новее. | Документированная цепочка SessionsPythonPlugin: доступный модели DownloadFileAsync мог записать данные сессии по пути на хосте. |
Python semantic-kernel | Затронуты версии < 1.39.3; исправлено в 1.39.3 и новее. | В рекомендации также указан этот пакет. В статье не разбирается отдельная цепочка эксплуатации Python; обновите пакет Python независимо. |
| Приложения, намеренно сохраняющие файлы сессии на хосте | Ограничьте путь назначения и после удаления доступа модели. | Задайте явный список разрешённых канонических путей в Function Invocation Filter или эквивалентном слое авторизации. Пустой список AllowedDownloadDirectories в upstream-реализации разрешает любой полный путь. |
Пошаговый сценарий атаки
Недоверенное содержимое влияет на агента
Атакующему нужен способ повлиять на входные данные агента, например через обрабатываемое содержимое. В цепочке, описанной Microsoft, первый вызов инструмента помещает файл в изолированную удалённую сессию Python; на этом этапе файл остаётся внутри неё.[1], [2]
Становится возможна запись на хост
Запись на хост возможна, только если модель вызывает этот помощник с localFilePath, на который повлияли недоверенные данные, и путь не ограничен действующим списком разрешённых каталогов. Microsoft описывает контролируемую исследовательскую цепочку, а не массовую эксплуатацию.[1], [2]
Исходный код: Уязвимый vs Защищённый вариант
Upstream-исправление удаляет атрибут KernelFunction из DownloadFileAsync и закрывает доступ модели на уровне регистрации инструментов. Сигнатура остаётся для преднамеренного вызова из кода приложения. Advisory также рекомендует проверять аргументы DownloadFileAsync и UploadFileAsync через Function Invocation Filter и явный список разрешённых путей. Одного Path.GetFullPath недостаточно для авторизации; пустой список AllowedDownloadDirectories в upstream-реализации разрешает любой полный путь.[2], [3]
Фрагмент исходного кода: Исходный метод: `DownloadFileAsync` в `SessionsPythonPlugin`
[KernelFunction, Description("Downloads a file from the current session.")]
public abstract Task<byte[]> DownloadFileAsync(
string remoteFileName,
string? localFilePath = null,
CancellationToken cancellationToken = default);
[Description("Downloads a file from the current session.")]
public abstract Task<byte[]> DownloadFileAsync(
string remoteFileName,
string? localFilePath = null,
CancellationToken cancellationToken = default);
Чек-лист по защите системы для инженеров
- ✓Обновите Microsoft.SemanticKernel.Plugins.Core до версии 1.71.0 или новее; проверьте lock-файл и реально загруженную сборку, а не только файл проекта.[2]
- ✓Составьте список агентов, регистрирующих SessionsPythonPlugin, и убедитесь, что DownloadFileAsync отсутствует в схеме инструментов модели.[1], [2]
- ✓Если код приложения вызывает DownloadFileAsync или UploadFileAsync, применяйте канонический список разрешённых путей в Function Invocation Filter или аналогичном слое авторизации.[2]
- ✓Не оставляйте AllowedDownloadDirectories пустым, если требуется ограничить назначения: upstream-реализация считает пустой список разрешением на любой полный путь.[3]
- ✓Проверьте телеметрию записи файлов на хосте за уязвимый период и исследуйте записи процесса агента вне разрешённых каталогов; меняйте учётные данные только при наличии признаков утечки.
- ✓Проверьте зарегистрированную схему инструментов, доступных модели, и права хоста; убедитесь, что ни один инструмент агента не может писать вне явно разрешённых каталогов.[1]