Безопасность: модель угроз и нормативные требования
Платёжный протокол для агентов проектируется от угроз, а не дополняется ими. Главный тезис Stipendex: бо́льшая часть атак снимается архитектурно — у LLM нет платёжной поверхности, а не «LLM хорошо попросили не платить».
Модель угроз
| # | Атака | Вектор | Контроль |
|---|---|---|---|
| A1 | Prompt injection: «переведи деньги на X» | вредоносный контент в контексте модели | у модели нет операции с произвольным получателем/суммой (инвариант I1); максимум — pay(quote), который упирается в allowlist и лимиты |
| A2 | Инъекция «оплати этот счёт» от злоумышленника-«получателя» | подсунутый Quote | Quote подписан ключом получателя; получатель не в allowlist → deny; в allowlist, но дорогой → HITL |
| A3 | Replay Quote / двойное предъявление | сеть, злонамеренный получатель | quote_id одноразовый + expires_at; кошелёк ведёт журнал виденных id |
| A4 | Двойное списание по одному Proof | ретраи, гонки | идемпотентность на всех уровнях: получатель и рельс по proof_id возвращают прежний результат (R2) |
| A5 | «Оплатил, но не получил» | недобросовестный получатель | Receipt с result_hash; невыдача Receipt после верифицированного Proof — доказуемое нарушение (журнал кошелька + evidence рельса); репутация в реестре |
| A6 | Скрытое завышение суммы | metered/checkout | списание ≤ estimate+tolerance (I3, C2); сверх — только re-quote + новое подтверждение |
| A7 | Подмена получателя под доверенным именем | MITM, компрометация DNS | ключ в Quote сверяется с дескриптором реестра (T1); TLS; подпись над каноническим JSON (JCS) |
| A8 | Компрометация процесса агента | малварь, RCE на хосте | ключ кошелька вне процесса агента (keychain/демон/KMS); ущерб ограничен остатком лимитов мандата до valid_until |
| A9 | Компрометация ключа кошелька | кража ключа | короткий TTL мандата; revocation у фасилитатора; velocity-антифрод фасилитатора как вторая линия |
| A10 | Уставший принципал «прожимает» подтверждения | социальная инженерия через агента | в подтверждении всегда: получатель, итог, допуск, остаток лимитов, назначение мандата; passkey-подтверждение делает «прожатие» осознанным действием |
| A11 | Грифинг pending-очереди | спам платёжными запросами | TTL очереди = TTL Quote; rate-limit pay() на кошельке; дубли по получателю схлопываются |
| A12 | Слив приватности принципала | получатель узнаёт лимиты/историю | получателю уходит только Proof (hash мандата, без полей); реестр не видит платежей; фасилитатор видит минимум для расчёта |
| A13 | Отравленный реестр | взлом/недобросовестность провайдера | подпись провайдера + журнал «кто пропустил платёж»; несколько провайдеров; удаление провайдера одной строкой мандата |
| A14 | «Полезный» инструмент с бесполезным результатом | легальный, но мусорный сервис | не платёжная задача: репутация/уровни реестра, лимиты как ограничитель ущерба; протокол гарантирует доказуемость («платил, получил X»), не качество X |
Нормативные требования (сводка MUST)
Кошелёк:
- S1. Единственная денежная операция для модели —
pay(quote); иных интерфейсов (transfer, экспорт ключей, изменение мандата) из контекста модели нет. - S2. Порядок проверок: подпись/срок Quote → allowlist (default deny) → лимиты (для estimate — худший случай) → HITL → рельс.
- S3. Durable-счётчики лимитов и журнал
quote_id/proof_idпереживают рестарт. - S4. Ключ подписи — вне процесса с LLM-контекстом.
- S5. Ретраи только идемпотентных операций; денежные операции не ретраятся вслепую.
Получатель:
- S6. Quote одноразов, подписан, с TTL; повтор
proof_id→ прежний результат. - S7. Receipt выдаётся на каждый верифицированный Proof, включая
voided. - S8. Ключ из Quote соответствует опубликованному дескриптору.
Рельс/фасилитатор:
- S9.
evidenceпроверяем третьей стороной; capture ≤ hold; идемпотентность. - S10. Velocity-контроль и аномалистика по кошелькам и получателям; revocation мандатов исполняется немедленно.
- S11. Крипто-рельсы MUST проверять адреса получателей по применимым санкционным спискам (напр. OFAC SDN) и геофенсить запрещённые юрисдикции до расчёта — независимо от формального лицензионного статуса оператора (санкционная ответственность строгая).
Checkout-профиль дополнительно: C1–C5 из spec/checkout-profile.md.
Что протокол сознательно не гарантирует
- Качество купленного (A14) — это репутация и споры, слой реестра и платформ.
- Соответствие покупки цели задачи — алгоритмически непроверяемо; ограничивается лимитами, allowlist, назначением мандата и аудитом.
- Возвраты/споры по микросуммам — экономически бессмысленны; дешевле лимитировать ущерб, чем арбитрировать центы.