Абстрактная техническая иллюстрация на глубоком грифельно-сером поле: узкая колонка сервера документации слева передаёт небольшие прямоугольные карточки по освещённому каналу к единственному узлу агента справа, который держит кольцо из небольших объектов в форме ключей. Одна из карточек обведена янтарным контуром и несёт слабый силуэт ключа, зеркально отражённый в кольце агента. Позади колонки расположена свободная сетка библиотечных записей, одна из которых затенена темнее остальных. Тонкие бирюзовые линии разделяют канал на сегменты доставки. Без людей, без логотипов, без каких-либо надписей. Логотип OrcaRouter совмещён в правом нижнем углу.
AI Safety Incidents

CVE-2026-75130: сервер документации MCP Context7 оценён в 9,0 балла, а в записи не указана исправленная версия

Автор

Alistair Wren

Дата публикации

Новые модели · 20Все модели →
Бенчмарки: Artificial Analysis · обновляется ежедневно
Назад ко всем статьям

18 августа 2026 года VulnCheck опубликовала CVE-2026-75130 в отношении Context7 — сервера документации библиотек, который Upstash запускает для Model Context Protocol и который агенты по программированию запрашивают для получения документации по конкретным версиям. Уязвимость находится в функции, которую Upstash называет Custom AI Instructions: владелец библиотеки прикрепляет указания к записи документации, Context7 передаёт эти указания в контекстное окно каждого агента, который обращается к библиотеке, и ничто на этом пути их не очищает. Noma Security, в которой Эли Айнхорн, старший исследователь уязвимостей ИИ, указан как обнаруживший уязвимость, продемонстрировала, что отравленная запись может заставить подключённого агента читать .env-файлы в корне проекта, отправлять их содержимое в GitHub-репозиторий, контролируемый злоумышленником, в виде issue, и удалять локальные папки под предлогом «очистки» — и всё это из обычного запроса документации. Пострадавших не зафиксировано. Остальные документированные инциденты с агентами, каждый со своим уровнем серьёзности, степенью уверенности и отметкой об оспаривании, находятся в архиве инцидентов ИИ, где можно прочитать соседние с этой записью записи рядом с ней.

Сервер Context7 невелик, и именно это стоит понять в первую очередь. В заметке Noma отмечается, что он предоставляет два инструмента, resolve-library-id и query-docs, и что он не может выполнять код, записывать файлы или самостоятельно обращаться к сети. Все описанные воздействия выполняет агент на другой стороне, у которого действительно есть доступ к файловой системе, оболочке и сети на машине разработчика. Реестр npm показывает, насколько велика база установок: @upstash/context7-mcp был скачан 4,064,176 раз за тридцать дней с 22 июля по 20 августа 2026 года — в период вокруг публикации.

Механизм: одна отравленная библиотека — каждый агент, который обращается к ней

Демонстрация Noma, описанная в её отчёте ContextCrush от 5 марта 2026 года, состояла из трёх шагов, которые выполняет агент, а не сервер. Она регистрировала библиотеку в реестре Context7 с прикреплёнными отравленными правилами. Инструкции в этих правилах предписывали агенту искать и читать каждый файл .env в корне проекта; дальнейшие инструкции предписывали ему опубликовать содержимое в виде issue в контролируемом злоумышленником репозитории GitHub; заключительный набор инструкций говорил ему удалить локальные папки и файлы для «очистки». Запрос, который втягивает всё это в контекст, — самый обычный: просьба к помощнику по программированию помочь с библиотекой.

То, что это проблема цепочки поставок, а не обычная инъекция промптов, объясняется тем, где находится полезная нагрузка. Атакующий никогда не добирается до машины жертвы и ему не нужно внедрять текст в документ, который открывает пользователь. Отравленные инструкции находятся в собственном реестре Context7, размещаются и обслуживаются собственной инфраструктурой Context7 и приходят по тому же доверенному каналу, что и легитимная документация, неотличимо от неё. Noma отмечает, что рейтинг доверия Context7, который оценивает библиотеки по истории GitHub за ними, не защищает от этого, потому что давно существующую учётную запись можно купить, захватить или создать. Собственное резюме компании о структурной сути звучит прямо: «Поверхность атаки — не то, что может делать сервер MCP. Она в том, что он может заставить делать ИИ-агента».

Два счёта за один баг

В уведомлении указаны CVSS 3.1 9.0 (критический) и CVSS 4.0 6.4 (средний). Оба вектора были предоставлены VulnCheck как CNA, присвоившим оценку, и NVD приводит оба без изменений, указывая источником VulnCheck для каждого. Расхождение не является ошибкой; это два фреймворка оценивают один и тот же ущерб применительно к разным машинам. CVSS 3.1 помечает Scope как Changed — инъекция переходит с сервера на машину разработчика и далее — и поэтому засчитывает полное высокое воздействие на конфиденциальность, целостность и доступность возможностей агента в полную силу. CVSS 4.0 заменяет Scope отдельными метриками для уязвимой системы и последующей системы: он фиксирует отсутствие воздействия на конфиденциальность, целостность или доступность для самого Context7 (VC:N/VI:N/VA:N) и высокое воздействие на нижестоящие системы (SC:H/SI:H/SA:H), которое его формула взвешивает менее сильно. Сервер — это курьер, а не жертва.

Расхождение распространяется на базы данных. Бюллетень GitHub, GHSA-97r6-3rgm-v39r, был опубликован в 18:32 UTC 18 августа, через полчаса после CVE, и его сводная оценка серьёзности указана как средняя, хотя вектор CVSS 3.1 в той же записи оценивается в 9.0. База данных уязвимостей ЕС ENISA дублирует запись как EUVD-2026-61099 и хранит базовую оценку 6.4 только по версии 4.0. Запись архива, на которую опирается эта статья, оценивает инцидент как высокий — что не совпадает ни с одной из двух опубликованных оценок — и это оценка архива, а не его собственное измерение.

HTML card titled 'One advisory, two scores', kicked 'OrcaRouter · AI incident archive · 2026-08-18', with the subtitle 'Identical facts, two severity bands apart. Both vectors were supplied by VulnCheck as the assigning CNA; NVD carries both unchanged and attributes each to VulnCheck'. Four chips read CVSS 3.1 9.0 critical, CVSS 4.0 6.4 medium, archive grade high and EPSS 0.49%. Three columns. 'Where the vectors agree' lists attack vector network with low complexity, privileges required low because the attacker needs a registry entry rather than the victim's machine, a routine documentation request as the trigger, and high confidentiality, integrity and availability impact in both frameworks. 'Where they diverge' lists CVSS 3.1 setting Scope to Changed and booking the jump to the developer's machine at full weight, CVSS 4.0 recording the vulnerable system as unharmed at VC:N, VI:N and VA:N, the same harms booked downstream at SC:H, SI:H and SA:H with less weight, and user interaction at required in 3.1 against passive in 4.0. 'How the databases record it' lists NVD keeping both vectors each tagged disclosure@vulncheck.com, GHSA-97r6-3rgm-v39r carrying a summary severity of medium while its own v3 vector reads 9.0, ENISA EUVD-2026-61099 storing 6.4 under version 4.0 only, and the archive grading the record high, which is neither score. A footer reads 'Sources: CVE-2026-75130 in the MITRE CVE Services record, 18 August 2026; NVD API; GitHub Advisory API; ENISA EUVD API. EPSS as recorded in ENISA's mirror.'

CVE, опубликованный в августе, о раскрытии в марте

Идентификатор CVE был зарезервирован 17 августа 2026 года и опубликован 18 августа в 18:02 UTC — именно эта дата указана в записи. Контейнер CNA также содержит вторую дату, которая не отображается на страницах агрегатора: datePublic, 5 марта 2026 г. — за пять с половиной месяцев до появления идентификатора и в тот же день, когда Noma опубликовала ContextCrush. Единственная техническая ссылка в бюллетене — это та мартовская публикация, которую VulnCheck помечает и как техническое описание, и как эксплойт.

Хронология раскрытия Noma объясняет этот разрыв. В ней сообщается, что об уязвимости было заявлено в Upstash 18 февраля 2026 года вместе с полным отчётом и доказательством концепции; отмечается, что Upstash приняла выводы и начала устранение 19 февраля; говорится, что исправление было «развёрнуто в производственной среде с санитизацией правил и защитными механизмами» 23 февраля; а публичное раскрытие и окончательная проверка со стороны Noma датированы 5 марта. По версии Noma, февральская ошибка была устранена за несколько дней.

Даты в реестре npm соотносятся с этой хронологией так, что затронутый диапазон выглядит странно. @upstash/context7-mcp 2.1.2 был опубликован 23 февраля 2026 года в 10:06 UTC — в день, когда, по словам Noma, исправление вышло в продакшене; в его changelog указано: «Удалить ненужное предупреждение и обновить описания инструментов». 2.1.3 вышла 4 марта 2026 года — за день до публикации Noma — с примечаниями об отклонении GET-запросов на эндпоинтах MCP и добавлении поля source в результаты поиска. Ни в одном из примечаний к релизу не упоминаются санитизация, защитные механизмы или инъекция. Диапазон затронутых версий по CNA заканчивается на 2.1.2, поэтому 2.1.3 становится первой версией за его пределами.

Этим датам соответствуют три трактовки, и ни VulnCheck, ни Noma не указывают, какая из них верна. Первая, которую Digital Applied приводит в своей статье от 18 августа и которую повторил AI Security Wire 22 августа, состоит в том, что исправление регрессировало: сборка, в которой был февральский патч, попадает в затронутый диапазон августа. Вторая — что диапазон просто привязан к сборке, которую тестировал исследователь, а настоящая граница — это 2.1.3, выпущенная за день до раскрытия; такой вывод механически делают несколько агрегаторов, включая Feedly, который указывает «обновление до версии 2.1.3 или более поздней» в качестве меры защиты. Третья — что февральское исправление было применено там, где обслуживаются правила, а не в клиентском пакете, и в этом случае диапазон версий npm вообще не описывает исправление. Тихие исправления безопасности встречаются достаточно часто, так что отсутствие соответствующей записи в журнале изменений ничего не решает ни в ту, ни в другую сторону.

HTML card titled 'Six months, one affected range', kicked '2026-08-18-context7-mcp-ti-shi-zhu · dates', subtitled 'Times UTC. Noma's disclosure timeline and the npm registry dates do not say what the 23 February fix changed, and no release note mentions sanitisation'. Four chips read 18 Feb 2026 reported to Upstash, 23 Feb 2026 fix live and npm 2.1.2, 5 Mar 2026 datePublic, and 18 Aug 2026 CVE published. Three columns. 'Noma's February timeline' lists 18 February discovery with the report and proof of concept delivered to Upstash, 19 February acceptance and remediation, 23 February deployment of a fix with rule sanitization and guardrails, and 23 February at 10:06 UTC the npm publication of 2.1.2 with a changelog reading 'Remove unnecessary warning and update tool descriptions'. 'The March boundary' lists 4 March at 12:51 UTC the npm publication of 2.1.3 whose changelog covers 405 handling for GET requests and a source field, 5 March publication of Noma's ContextCrush writeup with final verification, 5 March as the CNA's datePublic for the CVE, and the affected range ending at 2.1.2, which makes 2.1.3 the first build outside it. 'The August record' lists 17 August reservation of the identifier, 18 August at 18:02 UTC publication by VulnCheck as CNA, 18 August at 18:32 UTC the appearance of GHSA-97r6-3rgm-v39r with no version ranges, no fixed version in the CVE, the VulnCheck advisory or the GHSA, and NVD last modified 22 October at status Deferred with no CPE configurations. A footer reads 'Sources: MITRE CVE Services record for CVE-2026-75130; Noma Security, ContextCrush, 5 March 2026; npm registry version times; GitHub Advisory API; NVD API, read 29 October 2026.'

Что установлено, а что — нет

• Установлено по первичной записи.Идентификатор CVE, его публикация 18 августа, VulnCheck в роли CNA, классификация CWE-1427 для ненадлежащей нейтрализации входных данных, используемых для промптинга LLM, благодарность Eli Ainhorn из Noma Security и диапазон затронутых версий Context7 по 2.1.2 включительно.

• Установлено исследованием Noma. Путь внедрения через Custom AI Instructions, трёхэтапное доказательство концепции, наблюдение о том, что сервер предоставляет только resolve-library-id и query-docs, и утверждение о том, что для февральской ошибки не было замечено свидетельств эксплуатации в реальных условиях.

• Установлено реестром. Дата публикации версии 2.1.2 — 23 февраля 2026 г., дата публикации версии 2.1.3 — 4 марта 2026 г., а линейка пакетов с тех пор преодолела 4.0 и достигла 4.4.4 19 октября 2026 г.

• Не установлено: затронуты ли текущие сборки. Ни один источник не утверждает, что ветка 4.x уязвима, и ни один не утверждает, что она безопасна. Запись CVE, рекомендация VulnCheck и рекомендация GitHub не указывают исправленную версию, а список уязвимых диапазонов версий в рекомендации GitHub пуст.

• Не установлено: ни пострадавших, ни использования в реальных условиях. В архиве реальный ущерб отмечен как ложный. При обогащении записи CISA 19 августа метрики Exploitation, Automatable и Technical Impact получили значения «отсутствует», «нет» и «полное» соответственно; уязвимость отсутствует в каталоге KEV; зеркало ENISA фиксирует EPSS 0,49 процента. Исследование Noma — это демонстрация, а не отчёт об инциденте.

• Не установлено: сама трактовка как регрессии. Она опирается на совпадение дат между временной шкалой исправления и публикацией в npm, и ни один первоисточник не утверждает, что один и тот же путь кода отказал дважды.

HTML card titled 'What the record establishes, and what it does not', kicked 'Evidence ledger · CVE-2026-75130', subtitled 'The archive grades this record confidence A, disputed false, real harm false, AI involvement confirmed. Those are its fields; this is what they rest on'. Four chips read confidence A, disputed false, real harm false, AI involvement confirmed. Three columns. 'Established by primary sources' lists CVE-2026-75130 published 18 August 2026 with VulnCheck as CNA and CWE-1427, credit to Eli Ainhorn of Noma Security, an affected range of Context7 through 2.1.2, the injection path and three-step proof of concept as Noma describes them, and npm dates of 2.1.2 on 23 February, 2.1.3 on 4 March and latest 4.4.4 on 19 October 2026. 'Not established' lists whether the 4.x line is vulnerable or clear with no source saying either way, whether February's fix regressed or was never in the client package, any victim or in-the-wild use with CISA's SSVC recording exploitation none and the flaw absent from KEV, and a fixed version, which the CVE, the VulnCheck advisory and the GHSA all leave unnamed. 'What corroborates it' lists VulnCheck's advisory restating the CVE and adding the weakness class and credit, GHSA-97r6-3rgm-v39r as an alias of the same submission thirty minutes later, ENISA EUVD-2026-61099 mirroring the record along with the CVE aggregator pages, and two secondary write-ups restating it with no newsroom coverage found on 29 October 2026. A footer reads 'Sources agree because the GitHub and ENISA entries derive from the same VulnCheck submission, not because a second party measured the flaw.'

Подтверждение: повторение и молчание там, где это важно

Документы, согласующиеся с записью, в основном производны от неё. Бюллетень VulnCheck повторяет текст CVE и добавляет классификацию слабости и указание на исследователя. Бюллетень GitHub представляет собой алиас той же заявки, опубликованный тем же вечером, без диапазонов версий и без независимой проверки. Запись ENISA — зеркало. Digital Applied, один из двух источников, на которые ссылается архив, опубликовал свой анализ 18 августа и обновил его 22 августа новыми выгрузками из реестра; AI Security Wire опубликовал второй материал 22 августа. Оба повторяют бюллетень и передают вывод о регрессии, и ни один не утверждает, что проверил его независимо.

Мы не нашли освещения CVE в новостных редакциях на 29 октября 2026 года — ни материала BleepingComputer, The Register или SecurityWeek — а результаты представляли собой страницы агрегаторов CVE, а не репортажи. Это отсутствие важно для того, как следует читать эту запись: архив оценивает её на A — она хорошо документирована первичными источниками, которые согласуются, и первичные источники действительно согласуются, но согласование здесь — между записью CNA и исследованием, на которое она ссылается, а не между двумя независимыми измерениями. Несколько страниц агрегаторов добавляют утверждения, которые их источники не поддерживают; запись Feedly, например, утверждает, что патч доступен, и называет 2.1.3, чего не делает ни один бюллетень, тогда как страница VulDB вернула проверку на бота вместо содержимого и вообще не могла быть прочитана.

Что изменилось, а что нет

Что касается февральской ошибки, Upstash отреагировала за считанные дни: по данным Noma, 19 февраля ошибка была принята, а 23 февраля — исправлена. Что касается августовской записи, единственное заявление поставщика, на которое ссылается CVE, — это публикация Upstash в LinkedIn, помеченная там как рекомендация производителя, содержание которой мы не смогли прочитать без входа в систему. Ни один рекомендательный документ по безопасности GitHub, относящийся к репозиторию, не содержит исправленной версии, а запись NVD имеет статус Deferred без конфигураций CPE и с датой последнего изменения 22 октября 2026 года, поэтому собственный анализ NVD в записи отсутствует.

Сам пакет продолжал выпускаться. В период с 20 апреля 2025 года по 23 октября 2026 года репозиторий upstash/context7 опубликовал 163 релиза, и ни в одних из их примечаний к релизам не упоминается эта CVE и не описывается очистка пользовательских инструкций, содержащих инъекцию. Это лишь запись того, что мейнтейнеры решили записать, а не доказательство того, что ничего не было исправлено.

Что запись оставляет оператору — это управление экспозицией, а не конвейер патчей. Рекомендации Noma сосредоточены на проверке интеграций MCP и инспектировании того, что передаётся между агентом и сервером во время выполнения; OpenCVE предлагает обновиться, отключить или ограничить функцию Custom AI Instructions и добавить проверку входных данных на сервере. Практическая реализация всего этого сводится к одним и тем же трём действиям: закрепить версию сервера MCP вместо использования плавающей latest, не хранить рабочие учётные данные в открытых текстовых файлах окружения, которые агент может прочитать, и рассматривать ответы инструментов как недоверенные входные данные, а не как документацию, которой агент может следовать.

Спустя десять недель после публикации публичная запись всё ещё заканчивается там же, где и 18 августа: идентификатор, две оценки, отличающиеся на две категории, диапазон затронутых версий, верхняя граница которого — сборка, выпущенная в феврале, и ни одного названного исправления. Тот, кто занимается триажем CVE-2026-75130, должен принимать решение, опираясь на то, к чему имеют доступ его агенты, потому что запись не сообщает, какую версию устанавливать.