безопасность-ии
Как твой ИИ использует ключ Stripe, ни разу его не увидев
Паттерн runtime-инъекции секретов, который позволяет lodos списать деньги с клиента твоим ключом Stripe так, что ключ ни разу не попадает в контекст ИИ-модели.
Вот неприятный компромисс, на который идёт каждый продукт с «ИИ-агентом»: чтобы делать полезную работу, агенту нужны твои учётные данные. Чтобы списать деньги с клиента, ему нужен твой ключ Stripe. Чтобы выкатить деплой, ему нужен твой облачный токен. Обычный ответ на это: отдать эти секреты модели и надеяться, что ничего не утечёт.
Мы не хотели надеяться. Поэтому lodos устроен так, что утечка структурно невозможна, и сборка просто падает, если кто-то когда-нибудь это нарушит.
В чём проблема, когда модели дают секрет
Как только секрет в открытом виде попадает в контекст языковой модели, ты теряешь над ним контроль. Он может всплыть в стенограмме, в вызове инструмента, в логе, в кратком пересказе, который модель напишет позже, или в ответе на хитро сформулированный уточняющий вопрос. Prompt-инъекция, то есть вредоносная инструкция, спрятанная в веб-странице, письме или документе, который читает агент, превращает этот скрытый риск в активный канал утечки.
Честный вывод такой: модель вообще не должна видеть секрет. Всё остальное это лишь латание дыры поверх изъяна в проекте.
Ссылка, инъекция, аудит
lodos прогоняет каждый набор учётных данных через три стадии.
1. Ссылка
Твой ИИ никогда не работает со значением. Он работает с подстановкой:
{{secrets.stripe.sk_live}}
Эта ссылка это всё, что вообще видит модель: в чате, в workflow, в задаче. Она может рассуждать о том, как использовать ключ Stripe, ни разу его не держа.
2. Инъекция
Когда задаче действительно нужны учётные данные, lodos расшифровывает их локально и передаёт изолированному подпроцессу как переменную окружения, вне поля зрения модели, и значение исчезает в тот же момент, как задача завершается.
# The agent asked to run this; lodos resolved the reference and
# injected the real value into the subprocess environment only.
STRIPE_API_KEY={{secrets.stripe.sk_live}} ./charge-customer.sh
Модель видит строку слева. Подпроцесс получает значение справа. Эти двое никогда не встречаются внутри стенограммы.
3. Аудит
Каждый доступ дописывается в защищённую от подделки цепочку HMAC. Лог фиксирует, что секрет был использован, но никогда какое значение. Пути к полям непрозрачны, и любая попытка изменить историю рвёт цепочку.
Почему мы не просто доверяем политике
Было бы легко написать «ИИ настроен не раскрывать секреты» и на этом успокоиться. Мы считаем, что без принудительного контроля это ничего не стоит, поэтому встроили гарантию прямо в процесс релиза.
При каждом релизе запускается проверка инвариантов на этапе сборки, и сборка падает, если хоть что-то из этого когда-либо нарушено:
- Нигде нет инструмента, который возвращал бы значение секрета в открытом виде.
- Нет сырого провайдера model-API, только встроенный Claude Code с твоим собственным логином.
- Нет
eval,Function,vmилиchild_processни на одном пути рендеринга. - Неизвестные инструменты завершаются с отказом по умолчанию, их никогда молча не разрешают.
- Агент работает с явно запрещённым
bash. - Ни один одиночный грант не может собрать «смертельную тройку»: приватные данные + недоверенный контент + утечка.
- Workflow только декларативные, нет пути исполнения кода.
Если будущий коммит добавит инструмент, который передаёт модели секрет, релиз просто не выйдет.
От чего мы отказались и что выпустили взамен
Стена заставила нас делать лучшие проекты, а не меньше функций:
| От чего отказались | Что выпустили взамен |
|---|---|
| Сырой model-API, который ИИ вызывает напрямую | Встроенный Claude Code с твоим собственным логином |
| Разрешать ИИ запускать команды на хосте (bash) | Runtime-инъекция в подпроцесс, слепая к секретам |
eval() в workflow |
Декларативный YAML, без пути исполнения кода |
| Презентации, сгенерированные через картинки (облачный egress) | Офлайновые текстовые презентации, ноль сети |
Отказ от утечек не убрал возможности. Он их сфокусировал.
Итог
Ты можешь поручить ИИ-агенту настоящую работу с учётными данными, не отдавая ему сами учётные данные. Секрет остаётся зашифрованным на твоей машине, попадает в подпроцесс только в момент использования и никогда не пересекает границу в контекст модели.
В этом и состоит вся идея lodos: твой ИИ видит твою работу, а не твои секреты. Прочитай полную архитектуру безопасности или скачай lodos и дай своему агенту задачу вместо ключа.