flawopen.com/AI Security/ghostjacking-ai-agent-poisoned-observability-logs-august-2026
GhostJacking: логи и ИИ-агенты
Исследование показывает, как поддельная телеметрия влияет на агента. CVE и подтверждённых жертв нет.[1], [2]
Представьте, что сотрудник на ресепшене блокирует подозрительную доставку, но копирует записку отправителя в журнал инцидентов. Позже диспетчер проверяет настоящий номер заявки и реальный пробел в 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]
Связи со стандартами
- Концептуальное соответствие FlawOpen для MITRE CWE; ни поставщик, ни запись CVE не присваивали этот идентификатор слабого места данной исследовательской демонстрации. CWE-1427
- OWASP GenAI 2025 — LLM01:2025 Инъекция промпта
- OWASP GenAI 2025 — LLM06:2025 Чрезмерные полномочия агента
Пошаговый сценарий атаки
Агент получает доступ для расследования
В исследовании Tenet описаны агенты разработки и эксплуатации, подключённые к таким инструментам, как Cloudflare, Datadog и Sentry. Важное условие: агент может читать внешнее содержимое событий и выполнять значимые действия с уже имеющимися у него правами.[1]
Правдоподобная телеметрия обходит защиту от явных команд
Tenet сообщает, что в ходе тестирования явные команды отклонялись. В успешной демонстрации с Cloudflare использовалась структурированная телеметрия, похожая на результаты сканера: номер обращения, ссылка на требование соответствия и метрика. Агент проверил часть утверждений, а затем доверился непроверенным DNS-значениям, контролируемым атакующим. Это описанная исследователями демонстрация косвенной prompt injection, а не свидетельство реальной компрометации жертвы.[1], [2]
Имеющиеся права превращают влияние в последствия
Tenet сообщает, что в контролируемой демонстрации агент изменил DNS через подключённый инструмент Cloudflare. Результат зависит от прав и конфигурации агента; это не доказывает компрометацию Cloudflare или атаки на системы клиентов.[1]
Отдельная политика может остановить изменение
Приложение должно считать предложение модели недоверенным. Серверная служба авторизации должна независимо проверить точный ресурс и изменение, при необходимости потребовать подтверждение уполномоченного человека и записать решение до вызова 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' });
}
Чек-лист по защите системы для инженеров
- ✓Помечайте все поля журналов, оповещений, трассировок, ошибок и заявок, на которые может повлиять внешний ввод, как недоверенные при добавлении в контекст агента; сохраняйте сведения об их происхождении при преобразованиях.[1], [2]
- ✓По умолчанию выдавайте агентам расследования учётные данные только для чтения. Изменения DNS, облака, репозиториев и развёртывания пропускайте через отдельную службу проверки политик.[1], [5]
- ✓Авторизуйте каждое действие вне модели по аутентифицированному субъекту, tenant, ресурсу, точному изменению и текущей политике; не считайте доверие к модели или наличие инструмента разрешением.[2], [5]
- ✓Для важных изменений требуйте подтверждение человека, привязанное к точному diff, ресурсу, субъекту и короткому сроку действия; используйте его один раз и отклоняйте повторное использование или изменённые предложения.[2], [5]
- ✓Добавьте регрессионные тесты с недоверенной телеметрией, содержащей правдоподобные ссылки и факты, а также противоречивое непроверенное предложение об изменении. Проверьте, что агент может кратко изложить событие, но без независимой авторизации не вызывает API изменения.[1]
- ✓Настройте оповещения о попытках записи из рабочих процессов расследования и храните исходное событие, предложение модели, решение политики, сведения об утвердившем лице и ответ поставщика для разбора инцидента.[1]
- ✓Проверяйте реальные права каждой интеграции и область действия токена. Публичный идентификатор клиента не обязательно является привилегированным секретом; проверьте действия конкретного токена, прежде чем называть его учётными данными, попавшими в открытый доступ.[1], [2]
Источники
- Tenet Security — исследование GhostJacking и границы раскрытой демонстрации
- ngCERT — предупреждение GhostJacking, опубликовано 6 октября 2026 года
- SecurityWeek — Ghostjacking: поддельные журналы влияют на ИИ-агентов
- MITRE CWE-1427 — недостаточная нейтрализация входных данных в запросах к LLM
- Tenet Security — защитные примеры agent-jackstop