X Tutup
Skip to content

I3eka/uni-x-userscript

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Uni-X Logo

Uni-X UserScript

JavaScript Tampermonkey Security Research License: MIT

Uni-X UserScript — это комплексный инструмент для образовательной платформы, работающий непосредственно в браузере. Скрипт автоматизирует рутинные процессы обучения: управляет прохождением видео-лекций через репликацию токенов, помогает с тестированием за счет кэширования правильных ответов и снимает ограничения интерфейса на копирование контента.


🛡️ Security Analysis: Анатомия уязвимости

🕵️ Discovery Methodology: Reverse Engineering

Данная уязвимость была выявлена в ходе Reverse Engineering клиентской логики приложения и динамического анализа сетевого трафика.

В процессе исследования взаимодействия Frontend <-> Backend было установлено:

  1. JWT Implementation: Платформа использует токены (HS256) для валидации прогресса (/api/validates/watched), содержащие детальную телеметрию (массив markers, события плеера video-start, reached, video-end, таймстампы и флаг isWatched).
  2. Context Detachment: Токен подписывается сервером, но его валидация на эндпоинте сохранения прогресса происходит некорректно.
  3. Broken Object Level Authorization (BOLA): Сервер не проверяет соответствие lessonId внутри токена и lessonId, передаваемого в URL запроса.
  4. Cross-Lesson Reuse: Экспериментально доказано, что токен, подписанный для урока ID: 15379, успешно принимается сервером для валидации любого другого урока.

1. Механизм уязвимости (The Mechanism)

Эксплуатируемый вектор атаки классифицируется как Cross-Lesson Token Replay. Система полагается на криптографическую подпись токена, но игнорирует его семантическое содержимое при смене контекста (IDOR/BOLA).

  • Ожидаемое поведение: Токен выданный для Урока А, должен быть невалиден для Урока Б, т.е он должен был быть уникальным "ключом" для пары User + LessonID.
  • Реальность: Токен подтверждает лишь факт выполнения работы (Proof of Work) на каком-то уроке. Сервер принимает этот "слепок активности" как универсальное доказательство для любого ресурса, т.е один валидный "слепок" активности (токен от просмотра короткого видео) может быть переиспользован для подтверждения просмотра любых других лекций.

2. Why It Works (Root Cause)

Бэкенд-сервер совершает ошибку валидации Scope при обработке POST /api/lessons/{target_id}/watched.

Процесс валидации на сервере выглядит следующим образом:

  1. Signature Check: Подпись верна (токен реально выдан сервером).
  2. Telemetry Check: Структура markers корректна.
  3. Context Mismatch: Сервер НЕ сверяет lessonId, зашитый внутри токена, с {target_id}, передаваемым в URL запроса, и доверяет параметру {target_id} из URL.

Результат: Скрипт генерирует эталонный токен на базе короткого урока и инъектирует его в запросы для остальных лекций. Система принимает "чужой" токен как доказательство просмотра текущего материала.


🔧 Mitigation Strategies (Как это исправить?)

Для разработчиков платформы. Чтобы закрыть данную уязвимость, необходимо внедрить Strict Scope Validation.

Шаг 1: Привязка к контексту (Payload Binding)

Сервер должен сверять данные внутри токена с запрашиваемым ресурсом.

🔴 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
}

Шаг 2: Строгая валидация (Backend Code Fix)

На бэкенде при обработке запроса 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 и специфичные настройки прав доступа.

Шаг 1. Установка менеджера

Используйте только Beta-версию, так как она поддерживает более глубокий перехват API (XHR hooking) и работы с LocalStorage.

Шаг 2. Настройка прав доступа

После установки расширения необходимо разрешить ему инъекцию скриптов в защищенные контексты:

  1. Откройте меню управления расширениями (chrome://extensions/).
  2. Найдите карточку Tampermonkey BETA.
  3. Нажмите кнопку "Сведения" (Details).
  4. Активируйте галочку: "Разрешить открывать файлы по ссылкам" (Allow access to file URLs) или "Разрешить пользовательские скрипты".
  5. Без этого пункта модуль "Video Sniffer" не сможет извлечь токен.

Шаг 3. Инсталляция

Нажмите кнопку ниже для установки последней версии.

Install Script


Руководство по использованию

🎓 Авто-просмотр лекций

Автоматический режим (Основной): Скрипт самостоятельно генерирует необходимые криптографические подписи (токены). Просто открывайте непросмотренные лекции — система автоматически сформирует и отправит валидный запрос на сервер. Страница обновится с зеленой галочкой.

Ручная калибровка (Fallback): Если автоматическая генерация не сработала по каким-либо причинам (например, сервер изменил логику), скрипт перейдет в режим ожидания:

  1. Посмотрите текущее видео до конца вручную (один раз).
  2. Скрипт перехватит валидный токен из плеера и сохранит его (🎬 Новый токен просмотра сохранен!).
  3. После этого автоматический режим восстановится, используя сохраненный токен.

🧠 Quiz Assistant (Помощник в тестах)

Интеллектуальная система для сдачи тестирования.

  1. Кэширование: Скрипт автоматически запоминает правильные ответы при просмотре результатов теста или истории попыток.
  2. Подсветка: При повторном прохождении теста (или работе над ошибками) известные правильные ответы подсвечиваются зеленой рамкой () прямо в интерфейсе.
  3. Аналитика: Работает в фоне, перехватывая данные из ответов API /api/quizes/.../check.

📋 Smart Copy (Тесты)

  1. Наведите курсор на область вопроса.
  2. Блок подсветится зеленой рамкой (#50C878).
  3. Кликните в любом месте внутри рамки.
  4. Скрипт скопирует очищенный текст вопроса и вариантов ответов в буфер обмена.

Disclaimer

Данный проект разработан в образовательных и исследовательских целях (Security Research & PoC).

  1. Ответственность: Автор не несет ответственности за любые последствия использования данного ПО, включая блокировку учетных записей.
  2. Назначение: Проект демонстрирует уязвимости в архитектуре веб-приложений и методы взаимодействия с DOM/API на стороне клиента.
  3. Use wisely: Используйте данный инструмент только в рамках этических норм и правил вашего учебного заведения.

License

MIT

About

Отмечает видео (авто-генерация или ручной перехват), копирует вопросы, кэширует ответы.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Contributors

X Tutup