Uni-X UserScript — это комплексный инструмент для образовательной платформы, работающий непосредственно в браузере. Скрипт автоматизирует рутинные процессы обучения: управляет прохождением видео-лекций через репликацию токенов, помогает с тестированием за счет кэширования правильных ответов и снимает ограничения интерфейса на копирование контента.
Данная уязвимость была выявлена в ходе Reverse Engineering клиентской логики приложения и динамического анализа сетевого трафика.
В процессе исследования взаимодействия Frontend <-> Backend было установлено:
- JWT Implementation: Платформа использует токены (HS256) для валидации прогресса (
/api/validates/watched), содержащие детальную телеметрию (массивmarkers, события плеераvideo-start,reached,video-end, таймстампы и флагisWatched). - Context Detachment: Токен подписывается сервером, но его валидация на эндпоинте сохранения прогресса происходит некорректно.
- Broken Object Level Authorization (BOLA): Сервер не проверяет соответствие
lessonIdвнутри токена иlessonId, передаваемого в URL запроса. - Cross-Lesson Reuse: Экспериментально доказано, что токен, подписанный для урока
ID: 15379, успешно принимается сервером для валидации любого другого урока.
Эксплуатируемый вектор атаки классифицируется как Cross-Lesson Token Replay. Система полагается на криптографическую подпись токена, но игнорирует его семантическое содержимое при смене контекста (IDOR/BOLA).
- Ожидаемое поведение: Токен выданный для Урока А, должен быть невалиден для Урока Б, т.е он должен был быть уникальным "ключом" для пары
User + LessonID. - Реальность: Токен подтверждает лишь факт выполнения работы (Proof of Work) на каком-то уроке. Сервер принимает этот "слепок активности" как универсальное доказательство для любого ресурса, т.е один валидный "слепок" активности (токен от просмотра короткого видео) может быть переиспользован для подтверждения просмотра любых других лекций.
Бэкенд-сервер совершает ошибку валидации Scope при обработке POST /api/lessons/{target_id}/watched.
Процесс валидации на сервере выглядит следующим образом:
- ✅ Signature Check: Подпись верна (токен реально выдан сервером).
- ✅ Telemetry Check: Структура
markersкорректна. - ❌ Context Mismatch: Сервер НЕ сверяет
lessonId, зашитый внутри токена, с{target_id}, передаваемым в URL запроса, и доверяет параметру{target_id}из URL.
Результат: Скрипт генерирует эталонный токен на базе короткого урока и инъектирует его в запросы для остальных лекций. Система принимает "чужой" токен как доказательство просмотра текущего материала.
Для разработчиков платформы. Чтобы закрыть данную уязвимость, необходимо внедрить Strict Scope Validation.
Сервер должен сверять данные внутри токена с запрашиваемым ресурсом.
🔴 Insecure Payload (Current): Текущая реализация. ID урока внутри токена игнорируется при проверке других уроков.
{
"alg": "HS256",
"lessonId": 15379, // <-- ID исходного урока
"videoDuration": 8,
"isWatched": true,
"markers": [...], // Телеметрия плеера
"iat": 1770568288,
"exp": 1771173088
}🟢 Secure Payload (Recommended): Рекомендуемая структура с явным Scope.
{
"sub": "12345",
"scope": {
"target_entity": "lesson",
"target_id": "15379", // <--- Должно строго сверяться с URL
"action": "validate_watch"
},
"jti": "unique-nonce-id" // Protection against replay
}На бэкенде при обработке запроса POST /api/lessons/{target_id}/watched необходимо добавить проверку соответствия ID.
def validate_view(request, target_id):
token = decode_jwt(request.body.token)
# 1. Signature Check
if not token.verify_signature(): raise AuthError()
# 2. CRITICAL FIX: Context Validation
# Сверяем ID внутри токена с ID в URL
if token.payload.get('lessonId') != int(target_id):
raise SecurityError(f"Scope Mismatch: Token for {token.payload.lessonId} used on {target_id}")
save_progress(target_id)
demo.mp4
Для корректной работы перехватчиков требуется Tampermonkey BETA и специфичные настройки прав доступа.
Используйте только Beta-версию, так как она поддерживает более глубокий перехват API (XHR hooking) и работы с LocalStorage.
После установки расширения необходимо разрешить ему инъекцию скриптов в защищенные контексты:
- Откройте меню управления расширениями (
chrome://extensions/). - Найдите карточку Tampermonkey BETA.
- Нажмите кнопку "Сведения" (Details).
- Активируйте галочку: "Разрешить открывать файлы по ссылкам" (Allow access to file URLs) или "Разрешить пользовательские скрипты".
- Без этого пункта модуль "Video Sniffer" не сможет извлечь токен.
Нажмите кнопку ниже для установки последней версии.
Автоматический режим (Основной): Скрипт самостоятельно генерирует необходимые криптографические подписи (токены). Просто открывайте непросмотренные лекции — система автоматически сформирует и отправит валидный запрос на сервер. Страница обновится с зеленой галочкой.
Ручная калибровка (Fallback): Если автоматическая генерация не сработала по каким-либо причинам (например, сервер изменил логику), скрипт перейдет в режим ожидания:
- Посмотрите текущее видео до конца вручную (один раз).
- Скрипт перехватит валидный токен из плеера и сохранит его (
🎬 Новый токен просмотра сохранен!). - После этого автоматический режим восстановится, используя сохраненный токен.
Интеллектуальная система для сдачи тестирования.
- Кэширование: Скрипт автоматически запоминает правильные ответы при просмотре результатов теста или истории попыток.
- Подсветка: При повторном прохождении теста (или работе над ошибками) известные правильные ответы подсвечиваются зеленой рамкой (
✅) прямо в интерфейсе. - Аналитика: Работает в фоне, перехватывая данные из ответов API
/api/quizes/.../check.
- Наведите курсор на область вопроса.
- Блок подсветится зеленой рамкой (
#50C878). - Кликните в любом месте внутри рамки.
- Скрипт скопирует очищенный текст вопроса и вариантов ответов в буфер обмена.
Данный проект разработан в образовательных и исследовательских целях (Security Research & PoC).
- Ответственность: Автор не несет ответственности за любые последствия использования данного ПО, включая блокировку учетных записей.
- Назначение: Проект демонстрирует уязвимости в архитектуре веб-приложений и методы взаимодействия с DOM/API на стороне клиента.
- Use wisely: Используйте данный инструмент только в рамках этических норм и правил вашего учебного заведения.
MIT