惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Schneier on Security
Schneier on Security
A
About on SuperTechFans
月光博客
月光博客
WordPress大学
WordPress大学
小众软件
小众软件
H
Help Net Security
云风的 BLOG
云风的 BLOG
C
Cybersecurity and Infrastructure Security Agency CISA
U
Unit 42
Y
Y Combinator Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Hacker News
The Hacker News
T
The Exploit Database - CXSecurity.com
AI
AI
Recent Commits to openclaw:main
Recent Commits to openclaw:main
P
Palo Alto Networks Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园 - Franky
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
N
News and Events Feed by Topic
Google DeepMind News
Google DeepMind News
T
Threat Research - Cisco Blogs
www.infosecurity-magazine.com
www.infosecurity-magazine.com
S
Security Affairs
腾讯CDC
B
Blog
O
OpenAI News
美团技术团队
Blog — PlanetScale
Blog — PlanetScale
Vercel News
Vercel News
Spread Privacy
Spread Privacy
Cyberwarzone
Cyberwarzone
Hacker News - Newest:
Hacker News - Newest: "LLM"
G
Google Developers Blog
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
Tenable Blog
有赞技术团队
有赞技术团队
L
Lohrmann on Cybersecurity
Attack and Defense Labs
Attack and Defense Labs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
I
InfoQ
Application and Cybersecurity Blog
Application and Cybersecurity Blog
博客园 - 三生石上(FineUI控件)
C
Cyber Attacks, Cyber Crime and Cyber Security
酷 壳 – CoolShell
酷 壳 – CoolShell
Project Zero
Project Zero
Martin Fowler
Martin Fowler

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Безопасная песочница
antonkrylov · 2026-05-22 · via Все публикации подряд на Хабре

Безопасная песочница

Время на прочтение5 мин

Охват и читатели372

Каждую неделю появляется новая песочница для агентов. Большинство таких решений опирается на встроенные механизмы Linux: namespaces, seccomp, cgroups и Landlock. Эти инструменты полезны, но они делят одно ядро с хостом и оставляют оператора внутри модели политик хоста. Полная microVM дает более четкую границу: ядро, которое вы сами выбрали, корневой диск, который можно проверить, сетевой линк, который можно записать, и отказ, который не становится состоянием хоста.

https://github.com/ingresslabs/firecracker-sandbox.git

Firecracker полезен именно тогда, когда граница видна. В этой сборке граница состоит из собственного ядра Linux, ext4 диска, процесса Firecracker и tap интерфейса tap0 на хосте. Виртуальная машина не прячется за большой облачной панелью. У хоста адрес 192.168.1.1. У гостя адрес 192.168.1.2. Каждый пакет проходит через этот короткий маршрут.

Я проверил весь путь на root@121.115.45.227. Это Ubuntu 22.04 с /dev/kvm, 16 CPU, Firecracker 1.15.1, make, gcc, screen и iptables. Собранное ядро было Linux 7.0.9. Итоговый vmlinux занял 49 MB. ВМ загрузила Debian 11 до multi user режима и вошла как root через ttyS0.

Это минимальное полезное доказательство: ядро загружается, корневой диск монтируется, serial console работает, сеть можно наблюдать с хоста.

Сборка ядра

В репозитории песочницы уже есть цель Makefile:

make build-kernel

Скрипт сборки скачивает текущий stable исходный код Linux, начинает с make defconfig и включает драйверы, которые нужны Firecracker: virtio block, virtio net, virtio PCI, virtio MMIO, ext4, devtmpfs и serial console. Serial console здесь не украшение. Если гость падает до готовой сети, ttyS0 и firecracker-console.log остаются самым простым способом увидеть причину.

Базовый config широкий, поэтому сборка не маленькая. На тестовом хосте скрипт собрал полный x86 kernel и только потом скопировал vmlinux в каталог песочницы. Для строгой production сборки лучше держать небольшой проверенный kernel config и запускать make olddefconfig перед компиляцией. Для лабораторного доказательства скрипта репозитория достаточно.

Сборка корневого диска

Обычный путь такой:

make build-simple-rootfs

Эта цель создает firecracker-rootfs.ext4, ставит Debian с systemd, включает автоматический вход root через serial console и пишет статическую сетевую конфигурацию для eth0. Тестовый запуск показал две практические правки. Цель пыталась записать mnt/etc/network/interfaces до создания mnt/etc/network. Еще в rootfs был обязательный mount virtiofs, хотя в ядре не было соответствующей поддержки гостя. Нужно создать каталог до записи interface file. Общий mount стоит сделать необязательным или убрать, пока не включен CONFIG_VIRTIO_FS.

Аргументы загрузки в vm-config.json простые:

"kernel_image_path": "./vmlinux",
"boot_args": "console=ttyS0 reboot=k panic=1 pci=off root=/dev/vda rw rootfstype=ext4 init=/lib/systemd/systemd"

Это контракт между ядром и диском. Firecracker загружает vmlinux, подключает root image как /dev/vda и отправляет вывод консоли в screen log.

Подъем сети

Makefile создает tap0, назначает 192.168.1.1/24, включает forwarding и добавляет NAT. На хостах с несколькими default route наивная команда iptables может сломаться, потому что выражение interface разворачивается в несколько имен. Интерфейс лучше выбрать явно:

WAN=$(ip route | awk '/^default/ {print $5; exit}')
ip tuntap add tap0 mode tap
ip addr add 192.168.1.1/24 dev tap0
ip link set tap0 up
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o "$WAN" -j MASQUERADE
iptables -A FORWARD -i tap0 -j ACCEPT
iptables -A FORWARD -o tap0 -j ACCEPT

Внутри гостя нужна такая же сеть с другой стороны:

ip link set eth0 up
ip addr replace 192.168.1.2/24 dev eth0
ip route replace default via 192.168.1.1
printf 'nameserver 8.8.8.8\n' > /etc/resolv.conf

Перевод строки в resolv.conf важен. В одном запуске я получил сломанное значение nameserver 8.8.8.8n, и curl не мог разрешить opencode.ai.

Загрузка ВМ

Запуск в отдельной screen сессии:

make up-detached
make login

На удаленном хосте после исправления NAT я запускал напрямую:

screen -L -Logfile firecracker-console.log -dmS firecracker-vm \
  firecracker --api-sock /tmp/firecracker.socket --config-file vm-config.json

Консоль показала, что Debian 11 дошел до multi user режима. Prompt сообщил Linux 7.0.9 на x86_64 и вход root через ttyS0. Это сделало ВМ реальной целью для теста, а не JSON файлом, который просто парсится без ошибки.

Запуск opencode с DeepSeek внутри ВМ

Запрос агента должен идти из гостя, а не с хоста. Я использовал /Users/antonvkrylov/work/blade/.AI как локальный источник provider credentials и скопировал только строку DEEPSEEK_API_KEY во временный файл на удаленном хосте. Этот файл был смонтирован в root disk как /root/.deepseek.env. Guest service прочитал его, записал auth для opencode в /root/.local/share/opencode/auth.json, выполнил запрос и затем удалил оба secret файла.

Гостю нужны curl и ca-certificates:

apt-get update
apt-get install -y curl ca-certificates

Запрос внутри ВМ использовал opencode 1.15.5:

export OPENCODE_MODEL=deepseek/deepseek-v4-flash
curl -fsSL https://opencode.ai/install -o /tmp/opencode-install.sh
VERSION=1.15.5 bash /tmp/opencode-install.sh --no-modify-path

opencode run \
  --model "$OPENCODE_MODEL" \
  --agent build \
  --format json \
  --dir /root/opencode-proof \
  "Reply with exactly BLADE_FIRECRACKER_OPENCODE_DEEPSEEK_OK"

Тестовый запуск завершился со статусом 0. В логе opencode были строки llm.provider=deepseek и llm.model=deepseek-v4-flash. Secret file и auth.json исчезли после завершения сервиса. Это правильная форма: credential material живет коротко, provider log конкретный, ключ не остается в guest image.

Наблюдение за трафиком opencode

Простая сеть нужна не только для загрузки. Она делает агентный вызов наблюдаемым. Перед загрузкой ВМ запустите capture на хосте:

tcpdump -n -i tap0 'host 192.168.1.2 or arp'

Первый smoke test поймал ARP и ICMP между 192.168.1.2 и 192.168.1.1, что доказало сетевой путь гостя. Повторный запуск opencode показал путь модели: DNS запрос от 192.168.1.2 к 8.8.8.8 для api.deepseek.com, ответ CloudFront, затем TLS сессии от 192.168.1.2 к 3.173.21.63:443. В той же трассе был служебный трафик к models.dev и registry.npmjs.org.

Через tcpdump нельзя прочитать prompt или ответ, потому что HTTPS скрывает payload. Зато можно доказать время, направление, объем байтов и source address. Для проверки песочницы этого часто достаточно: вызов вышел из ВМ, прошел через tap0 и использовал ожидаемый provider модели.

Запуск в других средах

На bare metal Linux Firecracker можно запускать напрямую с KVM. На удаленном лабораторном сервере лучше копировать репозиторий по SSH и собирать там, потому что KVM находится на самом хосте. В CI имеет смысл кешировать vmlinux и ext4 rootfs, а в job выполнять только network setup, VM boot, opencode и packet capture. На macOS или Windows нужен Linux VM с nested virtualization, либо Firecracker стоит считать удаленной целью и управлять им через SSH.

Полезный инвариант небольшой: собрать именно то ядро, которое вы будете загружать, загрузить именно тот диск, который вы будете проверять, отправить agent request изнутри гостя и смотреть на tap interface, пока песочница говорит с внешним миром.