Vercel Sandboxes GA: изолированный рантайм для недоверенного кода

#vercel#security#serverless#sandbox#cloud-compute

TL;DR

Vercel Sandboxes вышли в GA как изолированная среда для выполнения недоверенного кода — AI-аутпутов, user uploads и third-party скриптов. Решение использует Firecracker microVMs с hardware isolation и zero trust политиками. Интеграция через SDK/CLI, подходит для AI-agents и low-code платформ.

Введение: зачем нужны sandbox-решения

Современные frontend-экосистемы всё чаще сталкиваются с необходимостью выполнения динамического кода:

Традиционные подходы типа eval() или vm2 не обеспечивают достаточной изоляции. Vercel Sandboxes предлагают production-grade решение с:

Архитектура и security model

// Пример создания sandbox через SDK
import { createSandbox } from '@vercel/sandbox';

const sandbox = await createSandbox({
  files: {
    'index.js': `
      export default async function handler(request) {
        return new Response('Hello from sandbox!');
      }
    `,
  },
  environment: 'nodejs18',
});

const response = await sandbox.fetch('https://sandbox-xyz.vercel.app');
console.log(await response.text()); // Hello from sandbox!

Ключевые особенности:

  1. Firecracker microVMs — изоляция на уровне KVM (Kernel-based Virtual Machine)
  2. Ephemeral by design — автоматическое уничтожение после выполнения
  3. Network policies:
    • Deny-all по умолчанию
    • Whitelist для external endpoints
  4. Resource constraints:
    vercel sandbox create --memory=512 --timeout=30s
    

Практическое применение

Сценарий 1: AI-generated компоненты

// Next.js API Route для генерации UI
export default async function generateComponent(req, res) {
  const aiOutput = await generateWithGPT(`
    Create a React component that renders a dashboard card
  `);

  const sandbox = await createSandbox({
    files: {
      'Card.jsx': aiOutput.code,
    },
  });

  // SSR внутри sandbox
  const { html } = await sandbox.render('/Card.jsx');
  res.send(html);
}

Сценарий 2: Плагинная система

// Типизированный интерфейс для плагинов
interface Plugin {
  process(input: string): Promise<string>;
}

// Загрузка third-party плагина
async function loadPlugin(url: string): Promise<Plugin> {
  const sandbox = await createSandbox({
    files: {
      'plugin.js': await fetch(url).then(r => r.text()),
    },
    environment: 'nodejs18',
  });

  return {
    async process(input) {
      const response = await sandbox.fetch('/plugin.js', {
        method: 'POST',
        body: input,
      });
      return response.text();
    },
  };
}

Ограничения и best practices

  1. Cold start: ~300-500ms на инициализацию microVM
  2. Resource limits:
    • Max memory: 2GB
    • Max duration: 5 minutes
  3. Security policies:
    vercel sandbox policy set \
      --deny-env \
      --deny-net \
      --allow-path=/tmp
    

Заключение

Vercel Sandboxes — это значительный шаг в безопасном выполнении динамического кода. Решение особенно актуально для:

Для старта достаточно:

npm install @vercel/sandbox
vercel sandbox init

Рекомендую изучить документацию и примеры использования для более глубокого погружения.


Источник: https://vercel.com/changelog/vercel-sandboxes-ga