flawopen.com/Teardowns/cve-2026-77244-mcp-atlassian-http-auth-bypass
CVE-2026-77244: неаутентифицированный HTTP-доступ к инструментам mcp-atlassian
CVE-2026-77244 позволяла неаутентифицированным вызывающим сторонам обращаться к HTTP-обработчикам инструментов проекта сообщества mcp-atlassian, которые могли использовать учётные данные Jira или Confluence из окружения оператора. Основное исправление вышло в 0.22.0; пользователям SSE нужна версия 0.23.1 или новее из-за отдельной связанной ошибки транспорта.[1], [4], [5], [6]
На стойке регистрации должны проверять пропуск посетителя, прежде чем открыть дверь для сотрудников. В прежнем процессе при отсутствии пропуска сотрудник стойки одалживал посетителю мастер-ключ. Ошибка объединила две проблемы: HTTP-запрос мог попасть к инструментам без проверенной личности, а инструменты могли использовать общие учётные данные Atlassian оператора. Исправление отклоняет неаутентифицированные HTTP-запросы и требует явного разрешения такого fallback учётных данных.[1], [3]
Ключевые понятия и термины
Транспорт MCP- Канал передачи запросов Model Context Protocol между клиентом и сервером. Эта CVE касается HTTP-транспорта mcp-atlassian; stdio по этому бюллетеню не затронут.[1], [4]
Fallback глобальных учётных данных- Использование учётных данных Jira или Confluence из окружения сервера, если у запроса нет собственной личности. При удалённо доступном HTTP это может превратить анонимный запрос в действие от имени оператора.[1], [4]
Граница аутентификации- Серверная проверка, устанавливающая личность до передачи запроса защищённым обработчикам инструментов. Сетевой доступ, непустой токен или предполагаемое доверие к прокси сами по себе личность не подтверждают.[1], [7]
CWE-287- Неправильная аутентификация: приложение недостаточно подтверждает заявленную личность перед предоставлением доступа.[1], [7]
Связи со стандартами
Анализ первопричины
Уведомление GitHub описывает цепочку в проекте сообщества mcp-atlassian, а не уязвимость продукта Atlassian. До версии 0.22.0 HTTP-middleware могла пропустить запрос без пользовательской личности к обработчикам инструментов. Если развёртывание использовало учётные данные оператора из переменных окружения, JiraFetcher или ConfluenceFetcher мог перейти на эти глобальные учётные данные. В уведомлении также описан верификатор непрозрачных токенов, принимавший любую непустую строку; это не доказывает реальную личность вызывающего. Защита должна одновременно проверять личность запроса и выбор учётных данных: отсутствующий или непроверенный пользователь не должен наследовать привилегированные данные оператора. Исправление 0.22.0 возвращает HTTP 401 для неаутентифицированных streamable-HTTP POST MCP и запрещает глобальный fallback в HTTP-контексте, если ALLOW_GLOBAL_CRED_FALLBACK=true явно не задан для однопользовательского развёртывания. Поведение stdio не изменилось. Отдельно GHSA-5j8j-256g-vvp5 описывает несовпадение путей SSE-middleware, исправленное в 0.23.1; это не CVE-2026-77244. Обновите SSE до 0.23.1 или новее и не считайте, что патч CVE в 0.22.0 исправляет и это отдельное уведомление. Уведомление не подтверждает эксплуатацию; статья не утверждает, что произошёл реальный взлом. В уведомлении CVE для этой цепочки указаны CWE-287, CWE-303 и CWE-862 — ошибки аутентификации, проверки токена и авторизации. В уведомлении репортёром указан crazydude123.[1], [3], [4], [5], [6], [7], [9], [10]
Пошаговый сценарий атаки
HTTP-endpoint MCP доступен по сети
В развёртывании работает сервер сообщества mcp-atlassian через HTTP, и неаутентифицированная сторона может обратиться к транспорту. Развёртывания только со stdio находятся вне затронутого этой CVE пути.[1]
Инструмент выбирает общие учётные данные оператора
Если собственной личности нет, а в окружении сервера заданы данные Jira или Confluence, fetcher может использовать глобальные учётные данные. Запрос получает права включённых инструментов оператора; точный эффект зависит от его привилегий и конфигурации.[1], [3]
Отклонять на транспорте и безопасно отказывать при выборе учётных данных
Версия 0.22.0 возвращает HTTP 401 для неаутентифицированных streamable-HTTP запросов и блокирует глобальный fallback в HTTP-контексте без явного разрешения. Для SSE установите 0.23.1 или новее: там исправлена отдельная ошибка путей.[1], [4], [5], [6]
Исходный код: Уязвимый vs Защищённый вариант
Это сокращённое представление потока, а не дословная копия функций. В upstream-патче добавлен HTTP 401 на транспортной границе и второй запрет перед возвратом глобального fetcher в HTTP-контексте; оба обхода требуют явного ALLOW_GLOBAL_CRED_FALLBACK.[1], [3], [4]
# Упрощенное представление затронутого потока управления.
async def handle_request(scope, ctx):
user_identity = scope.get("state", {}).get("user_atlassian_auth_type")
# Отсутствие идентификатора не отклонялось на границе HTTP.
return await call_tool_handler(ctx, user_identity=user_identity)
def get_fetcher(user_identity, global_config):
if user_identity:
return fetcher_for_user(user_identity)
# В качестве запасного варианта используются учетные данные оператора из окружения.
return fetcher_from_config(global_config)
# Краткое представление защитных мер, объединенных в версии 0.22.0.
async def handle_request(scope, ctx):
user_identity = scope.get("state", {}).get("user_atlassian_auth_type")
if is_mcp_http_post(scope) and not user_identity and not allow_global_fallback():
return http_401("Authentication required")
return await call_tool_handler(ctx, user_identity=user_identity)
def get_fetcher(user_identity, global_config, *, in_http_context):
if user_identity:
return fetcher_for_user(user_identity)
if in_http_context and not allow_global_fallback():
raise PermissionError("Refusing operator credentials for an unauthenticated HTTP request")
return fetcher_from_config(global_config)
Чек-лист по защите системы для инженеров
- ✓Обновите
mcp-atlassianс версий до 0.22.0 как минимум до 0.22.0 дляCVE-2026-77244; если используется--transport sse, обновитесь до 0.23.1 или новее из-за отдельного GHSA-5j8j-256g-vvp5.[1], [4], [5], [6] - ✓Найдите все пути доступа к HTTP: прямая привязка, порт контейнера, ingress, балансировщик, VPN или туннель разработки. Ограничьте доступ до обновления.[1]
- ✓Оставьте
ALLOW_GLOBAL_CRED_FALLBACKнезаданным или равным false для многопользовательских и удалённо доступных HTTP-развёртываний. Включайте только для намеренно однопользовательской установки с документированной границей.[1], [4] - ✓Требуйте и проверяйте реальную пользовательскую личность до вызова инструмента. Непустой токен, расположение в сети или заголовок прокси без явной проверки личность не подтверждают.[1], [7]
- ✓Добавьте тесты, подтверждающие HTTP 401 до любого обработчика инструмента при отсутствии личности и отказ HTTP-fetcher использовать учётные данные окружения без явного разрешения.[3], [4]
- ✓Проверяйте streamable HTTP и SSE отдельно: ошибка аутентификации путей SSE относится к отдельному уведомлению и исправлена в 0.23.1, а не только в патче CVE 0.22.0.[5], [6]
- ✓Если уязвимый экземпляр был доступен недоверенным сторонам, проверьте операции Jira и Confluence от имени сервисной учётной записи и смените её секреты, если раскрытие возможно.[1]
Источники
- Уведомление безопасности GitHub GHSA-wrhw-j3f9-8vc6 — CVE-2026-77244
- Запись CVE.org CVE-2026-77244
- Upstream PR #1448 и коммит f500f5b
- Релиз mcp-atlassian v0.22.0
- Отдельное SSE-уведомление GHSA-5j8j-256g-vvp5
- Релиз mcp-atlassian v0.23.1 (исправление аутентификации SSE)
- MITRE CWE-287: Improper Authentication
- Материал ThreatFrontier от 2 октября 2026 года
- MITRE CWE-303: Incorrect Implementation of Authentication Algorithm
- MITRE CWE-862: Missing Authorization