FlawOpen

flawopen.com/AI Security/ghostjacking-ai-agent-poisoned-observability-logs-august-2026

● Соответствие FlawOpen: CWE-1427 · Редакционная оценка: Средний
Исследования · FlawOpen

GhostJacking: логи и ИИ-агенты

Исследование показывает, как поддельная телеметрия влияет на агента. CVE и подтверждённых жертв нет.[1], [2]

💡 Простыми словами (ELI5)

Представьте, что сотрудник на ресепшене блокирует подозрительную доставку, но копирует записку отправителя в журнал инцидентов. Позже диспетчер проверяет настоящий номер заявки и реальный пробел в DNS-политике тестовой конфигурации, а затем доверяет адресу, который указал злоумышленник в той же записке, и меняет общедоступный справочник, указывающий браузерам и почтовым системам путь к сервисам компании. Журнал был свидетельством, а не разрешением на такое изменение; его должны контролировать отдельная проверка политики и согласование.[1]

Ключевые понятия и термины

GhostJacking
Название Tenet Security для демонстраций, в которых контролируемое атакующим содержимое событий наблюдаемости влияет на подключённого к этим инструментам ИИ-агента. Это исследовательский термин, а не CVE.[1], [2]
Indirect prompt injection
Инструкции, внедрённые в данные, которые модель должна изучить, а не переданные пользователем напрямую.[1], [2], [4]
Событие наблюдаемости
Журнал, оповещение, трассировка или запись об ошибке, описывающая работу системы. Некоторые поля могут содержать текст из внешнего запроса.[1], [2]
Независимая авторизация
Проверка политики вне модели: она проверяет субъекта, цель, запрошенное изменение и подтверждение до того, как инструмент выполнит значимое действие.[2], [5]
CWE-1427
Класс слабых мест MITRE для недостаточной нейтрализации данных, используемых в запросах к LLM. Это концептуальная классификация FlawOpen; Tenet, ngCERT и записи CVE не присваивали её GhostJacking.[4], [1], [2]
Редакционная оценка
ngCERT оценивает риск и ущерб в предупреждении как высокие. FlawOpen присваивает этому обзору средний уровень, поскольку демонстрации требуют агента с соответствующими интеграциями и правами на изменение; подтверждённых пострадавших нет. Это редакционная оценка, а не рейтинг поставщика.[2], [1]

Связи со стандартами

Пошаговый сценарий атаки

Шаг 1

Агент получает доступ для расследования

В исследовании Tenet описаны агенты разработки и эксплуатации, подключённые к таким инструментам, как Cloudflare, Datadog и Sentry. Важное условие: агент может читать внешнее содержимое событий и выполнять значимые действия с уже имеющимися у него правами.[1]

Шаг 2

Запрос сохраняется как свидетельство

В демонстрации Tenet с Cloudflare WAF блокирует запрос, но текст из контролируемого атакующим поля сохраняется в записи события. Даже заблокированный запрос может оставить недоверенный текст, который агент прочитает позже.[1], [2]

Шаг 3

Правдоподобная телеметрия обходит защиту от явных команд

Tenet сообщает, что в ходе тестирования явные команды отклонялись. В успешной демонстрации с Cloudflare использовалась структурированная телеметрия, похожая на результаты сканера: номер обращения, ссылка на требование соответствия и метрика. Агент проверил часть утверждений, а затем доверился непроверенным DNS-значениям, контролируемым атакующим. Это описанная исследователями демонстрация косвенной prompt injection, а не свидетельство реальной компрометации жертвы.[1], [2]

Шаг 4

Имеющиеся права превращают влияние в последствия

Tenet сообщает, что в контролируемой демонстрации агент изменил DNS через подключённый инструмент Cloudflare. Результат зависит от прав и конфигурации агента; это не доказывает компрометацию Cloudflare или атаки на системы клиентов.[1]

Шаг 5

Отдельная политика может остановить изменение

Приложение должно считать предложение модели недоверенным. Серверная служба авторизации должна независимо проверить точный ресурс и изменение, при необходимости потребовать подтверждение уполномоченного человека и записать решение до вызова API поставщика.[2], [5]

Исходный код: Уязвимый vs Защищённый вариант

Это иллюстративные фрагменты приложения, а не уязвимый или исправленный исходный код упомянутых продуктов. Небезопасная схема предоставляет инструмент изменения агенту, который читает недоверенный текст события. Защищённая схема разделяет предложение и выполнение: независимая служба использует одноразовое подтверждение, привязанное к субъекту и точному изменению, а затем проверяет политику перед вызовом API поставщика. Идентификатор субъекта берётся из аутентифицированного контекста сервера, а не из поля, заданного вызывающей стороной; модель не может его выбрать. Одной инструкции в prompt недостаточно для авторизации. В рабочем коде также нужно проверять схемы данных, принадлежность tenant и ресурса, срок действия подтверждения, защиту от повторного использования, сохранность аудита и ошибки API поставщика.[1], [2], [5]

УЯЗВИМАЯ РЕАЛИЗАЦИЯ
// Иллюстрация небезопасной интеграции; это не исходный код Cloudflare, Datadog, Sentry или Tenet.
async function investigate(event: EventRecord) {
  return agent.run({
    context: event.message,
    tools: [cloudflare.updateDnsRecord]
  });
}
БЕЗОПАСНЫЙ ИСПРАВЛЕННЫЙ ВАРИАНТ
// Иллюстрация границы контроля; модель может предложить изменение, но не авторизовать и не применить его.
type DnsProposal = { zoneId: string; name: string; value: string };

async function proposeDnsChange(event: EventRecord): Promise<DnsProposal> {
  return agent.propose({ evidence: markUntrusted(event.message) });
}

async function applyDnsChange(
  proposal: DnsProposal,
  approvalId: string
) {
  const actorId = auth.requireAuthenticatedActorId();
  const validatedProposal = DnsProposalSchema.parse(proposal);
  const approval = await approvals.consumeOnce(approvalId, { actorId });
  if (!approval || approval.actorId !== actorId ||
      approval.zoneId !== validatedProposal.zoneId ||
      approval.name !== validatedProposal.name ||
      approval.value !== validatedProposal.value ||
      !policy.canChangeDns(actorId, validatedProposal.zoneId, validatedProposal.name)) {
    throw new Error('DNS change is not independently authorized');
  }
  // Запрещайте операцию, если решение об авторизации не удалось записать до изменения.
  await audit.record({ actorId, approvalId, action: 'dns-change', decision: 'authorized' });
  try {
    await cloudflare.updateDnsRecord(validatedProposal);
  } catch (error) {
    await audit.record({ actorId, approvalId, action: 'dns-change', outcome: 'provider-failed' });
    throw error;
  }
  await audit.record({ actorId, approvalId, action: 'dns-change', outcome: 'succeeded' });
}

Чек-лист по защите системы для инженеров

Источники

← AI Security Directory →