Предоставление автономным кодинг-агентам доступа к файловой системе, сетевым сокетам и командной строке радикально расширяет поверхность атаки. В распределенных системах агенты подвержены двум фундаментальным угрозам: непрямым инъекциям промптов (Indirect Prompt Injection через данные репозитория, PR или Issue) и галлюцинациям зависимостей (Slopsquatting), при которых агент выдумывает несуществующие пакеты, зарегистрированные атакующими.
Архитектурная безопасность агентных систем строится на принципах наименьших привилегий (Principle of Least Privilege, PoLP), детерминированной изоляции сред исполнения (Sandboxing на базе MicroVM или V8 Isolates) и шлюзах подтверждения человека (Human-in-the-Loop, HITL) перед выполнением необратимых мутирующих операций.
Система безопасности функционирует как многоуровневый эшелонированный фильтр перехвата вызовов инструментов (Tool Calls). Никакой код агента не имеет права исполняться напрямую в хостовой операционной системе.
Изолированная среда выполнения (MicroVMs Firecracker, gVisor, WebAssembly), ограничивающая доступ процесса к системным вызовам ядра, хостовой файловой системе и внешним сетевым интерфейсам. Вектор атаки на цепочку поставок (Supply Chain), при котором злоумышленник публикует вредоносный пакет в NPM/PyPI с именем, статистически часто галлюцинируемым языковыми моделями. Архитектурный шаблон координации, при котором конвейер приостанавливает выполнение (Suspend) и ожидает криптографически подписанного подтверждения от оператора-человека перед выполнением деструктивных действий.[ Agent Tool Call: pnpm add @company/fast-json-validator ]
│
▼
(Security Gateway Interceptor)
│
[ Проверка реестра NPM / Safe Names ] ──(Hallucination)──► [ Блокировка & Alert ]
│ (Valid Package)
▼
[ Требуется мутация / Deploy / Push? ] ──(Yes)────────────► (HITL: Webhook в Slack/UI)
│ (No / Approved)
▼
[ Исполнение в Ephemeral MicroVM Sandbox ] ──► (Уничтожение песочницы после теста)Перехват вызова инструмента, синтаксический анализ аргументов по белому списку разрешенных утилит.
Проверка упомянутых библиотек в официальных реестрах, блокировка свежесозданных пакетов.
При обнаружении критических действий стейт-машина сериализует контекст и ждет подтверждения человека.
Запуск команды в изолированной песочнице со сброшенными правами root и отключенной сетью.
Почему стандартные контейнеры Docker со стандартным рантаймом runc считаются недостаточными для исполнения непроверенного кода, сгенерированного AI-агентами?
DROP, ALTER, TRUNCATE) шлюз прерывает операцию и запрашивает одобрение администратора БД через интерфейс HITL.Пример архитектуры шлюза безопасности (Security Gateway) с перехватом Tool Calls, проверкой зависимостей и вызовом HITL:
import { z } from 'zod';
export const ToolCallSchema = z.object({
command: z.string(),
intent: z.string()
});
async function verifyNpmPackageLegitimacy(pkgName: string): Promise<boolean> {
try {
const res = await fetch(`https://registry.npmjs.org/${encodeURIComponent(pkgName)}`, {
headers: { 'Accept': 'application/json' }
});
if (!res.ok) return false;
const data = await res.json() as { time?: Record<string, string> };
const createdAt = data.time?.created ? new Date(data.time.created) : null;
// Блокируем пакеты моложе 14 дней для предотвращения атак нулевого дня
if (createdAt && (Date.now() - createdAt.getTime()) < 14 * 24 * 3600 * 1000) {
return false;
}
return true;
} catch {
return false;
}
}
export class AgentSecurityGateway {
async execute(call: z.infer<typeof ToolCallSchema>): Promise<{ success: boolean; output: string }> {
const { command, intent } = call;
// 1. Блокировка деструктивных паттернов
if (/(rm\s+-rf|chmod\s+777|curl.*\|\s*sh|mkfs)/i.test(command)) {
throw new Error(`[Security Violation] Деструктивная команда отклонена: ${command}`);
}
// 2. Аудит устанавливаемых пакетов (защита от Slopsquatting)
if (/^(pnpm|npm|yarn)\s+(add|install)/.test(command)) {
const parts = command.split(/\s+/).slice(2).filter(p => !p.startsWith('-'));
for (const pkg of parts) {
const cleanName = pkg.replace(/@[\^~]?[\d.]+$/, '');
const isLegit = await verifyNpmPackageLegitimacy(cleanName);
if (!isLegit) {
throw new Error(`[Slopsquatting Detected] Подозрительный или несуществующий пакет: ${cleanName}`);
}
}
}
// 3. Human-in-the-Loop для мутаций репозитория и деплоя
if (/git\s+push|publish|deploy/i.test(command)) {
const approved = await this.awaitHumanSignature(command, intent);
if (!approved) {
return { success: false, output: 'Операция отклонена системным архитектором.' };
}
}
return { success: true, output: 'Команда успешно исполнена в изолированной песочнице.' };
}
private async awaitHumanSignature(command: string, intent: string): Promise<boolean> {
// В реальной системе: сохранение Checkpoint в Redis/Postgres и ожидание вебхука
console.warn(`[HITL Alert] Требуется подтверждение: ${command} (${intent})`);
return true;
}
}Какой подход к Human-in-the-Loop позволяет сохранить максимальную безопасность без возникновения усталости от алертов (Alert Fatigue) у дежурных инженеров?
Передача переменных окружения хоста (.env с токенами AWS, Supabase, Stripe) внутрь песочницы агента. При непрямой атаке Indirect Prompt Injection (например, чтение злонамеренно оформленного pull request) агент может выполнить эксфильтрацию секретов через сетевой сокет.
Запрос ручного подтверждения на тривиальные операции чтения (pnpm test, git status). Инженеры начинают машинально нажимать «Одобрить», полностью обесценивая контроль безопасности в критический момент.
Отсутствие валидации зависимостей по реестру. Агенты с высокой вероятностью галлюцинируют правдоподобно звучащие утилиты. Злоумышленники заранее регистрируют типовые галлюцинации в открытых реестрах для атаки на цепочки поставок.