Skip to content

AdvancedJavaLabs/lab4-security-dmfrpro-1

 
 

Repository files navigation

Review Assignment Due Date

Лабораторная работа №4 — Анализ и тестирование безопасности веб-приложения

Цель

Научиться находить уязвимости в реальном коде, формулировать security test cases, классифицировать проблемы через CWE, оценивать их серьёзность через CVSS и оформлять результаты как профессиональный pentest-отчёт.


Описание приложения

Учебное REST API на Javalin (Java) для аналитики пользовательской активности.

Эндпоинты

Метод Путь Параметры Описание
POST /register userId, userName Регистрация пользователя
POST /recordSession userId, loginTime, logoutTime (ISO 8601) Запись сессии активности
GET /totalActivity userId Суммарное время активности (в минутах)
GET /inactiveUsers days Список неактивных пользователей
GET /monthlyActivity userId, month (yyyy-MM) Активность по дням за месяц
GET /userProfile userId HTML-профиль пользователя
GET /exportReport userId, filename Экспорт отчёта в файл на сервере
POST /notify userId, callbackUrl Уведомление по webhook

Запуск приложения

./gradlew run
# Сервер стартует на http://localhost:7000

Задание

Этап 1 — Asset Inventory (инвентаризация активов)

Перед поиском уязвимостей необходимо понять, что именно защищаем.

Заполните таблицу активов системы:

Актив Тип Ценность Примечание
Данные пользователей (userId, userName) Данные High Имея userId можно смотреть чужие данные
Данные о сессиях (время входа/выхода) Данные Low Тамперинг аналитики входа/выхода
Файловая система сервера Инфраструктура High Path traversal
Внутренняя сеть / метаданные окружения Инфраструктура High SSRF moment

Вопрос для размышления: какие из активов наиболее критичны и почему? (внутренняя сеть)


Этап 2 — Threat Modeling

Проведите базовое моделирование угроз по методологии STRIDE:

Категория угрозы Расшифровка Применимо к этому приложению?
Spoofing Подмена идентификации Да. Источник - внешний. Все эндпоинты.
Tampering Модификация данных Да. Источник - внешний. recordSession, exportData
Repudiation Отказ от авторства Да. Источник - внешний и внутренний. Везде где нет логов.
Information Disclosure Утечка данных Да. Источник - внешний. totalActivity, userProfile
Denial of Service Отказ в обслуживании Да. Источник - внешний. register, recordSession
Elevation of Privilege Повышение привилегий Да. Источник - внешний. notify, exportReport

Для каждой применимой угрозы укажите:

  • Источник угрозы (кто/что может её реализовать)
  • Поверхность атаки (через какой эндпоинт/параметр)
  • Потенциальный ущерб

Этап 3 — Ручное тестирование

Исследуйте каждый эндпоинт вручную — с помощью curl, Postman, Burp Suite или браузера.

Что проверять:

  • Как приложение обрабатывает неожиданные значения параметров?
  • Что происходит при передаче спецсимволов (<, >, ", ', /, ..)?
  • Что возвращается в теле ответа при ошибках?
  • Что происходит с параметрами-путями к файлам или URL?
  • Есть ли ограничения на количество запросов или размер данных?

Пример — начало исследования /userProfile:

# 1. Зарегистрировать тестового пользователя
curl -X POST "http://localhost:7000/register?userId=test&userName=Alice"

# 2. Посмотреть, как отображается профиль
curl "http://localhost:7000/userProfile?userId=test"

# 3. Попробовать имя со спецсимволами
curl -X POST "http://localhost:7000/register?userId=evil&userName=%3Cscript%3Ealert(1)%3C%2Fscript%3E"
curl "http://localhost:7000/userProfile?userId=evil"
# → Что вернёт сервер? Что отрендерит браузер?

Данный пример — лишь отправная точка. Исследуйте все эндпоинты самостоятельно.


Этап 4 — Статический анализ с Semgrep

Semgrep — инструмент статического анализа кода, который ищет паттерны уязвимостей без запуска приложения.

Установка

# Linux / macOS (через pip)
pip install semgrep

# macOS (через Homebrew)
brew install semgrep

# Проверка установки
semgrep --version

Запуск на проекте

# Перейти в корень проекта
cd /path/to/software_testing_lab_4

# Базовый запуск — встроенные правила для Java
semgrep --config "p/java" src/

# Расширенный запуск — правила безопасности OWASP
semgrep --config "p/owasp-top-ten" src/

# Сохранить отчёт в формате SARIF
semgrep --config "p/java" --sarif -o semgrep-report.sarif src/

Что такое SARIF?

SARIF (Static Analysis Results Interchange Format) — стандартный формат обмена результатами статического анализа (ISO/IEC 5055). Используется в GitHub Actions, GitLab CI, VS Code и IDE для отображения findings прямо в интерфейсе.

Откройте semgrep-report.sarif и изучите структуру:

{
  "$schema": "https://json.schemastore.org/sarif-2.1.0.json",
  "version": "2.1.0",
  "runs": [{
    "tool": { "driver": { "name": "Semgrep", "rules": [ ... ] } },
    "results": [{
      "ruleId": "java.lang.security.audit.xss.no-direct-response-writer",
      "level": "warning",
      "message": { "text": "..." },
      "locations": [{
        "physicalLocation": {
          "artifactLocation": { "uri": "src/..." },
          "region": { "startLine": 42 }
        }
      }]
    }]
  }]
}

Ключевые поля для отчёта:

Поле SARIF Что означает
ruleId Идентификатор правила / уязвимости
level Серьёзность: error, warning, note
message.text Описание проблемы
locations[].region.startLine Строка в исходном коде
relatedLocations Связанные места (data flow)

Что делать с результатами

  1. Изучите каждый finding в выводе и в .sarif-файле
  2. Определите, является ли он реальной уязвимостью или ложным срабатыванием (false positive)
  3. Для каждого finding сопоставьте ruleId с соответствующим CWE
  4. Включите результаты Semgrep в финальный отчёт с пометкой о верификации

Важно: Semgrep — вспомогательный инструмент. Статический анализ не заменяет ручное тестирование. Некоторые уязвимости он найдёт, некоторые — нет.


Этап 5 — Оформление отчёта

Для каждой найденной уязвимости заполните карточку по следующему шаблону:


🔴 Finding #N — [Название уязвимости]

Поле Значение
Компонент Эндпоинт или класс, где обнаружена уязвимость
Тип Краткое название (например: Reflected XSS)
CWE CWE-XXX — название
CVSS v3.1 Числовой балл (0.0–10.0) и вектор, например: 7.5 HIGH (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N)
Статус Confirmed / Suspected / False Positive

Описание:

Что происходит и почему это проблема.

Шаги воспроизведения:

1. ...
2. ...
3. Ожидаемый результат: ...
   Фактический результат: ...

Влияние:

Что может сделать атакующий, если воспользуется уязвимостью.

Рекомендации по исправлению:

Конкретные меры: какой метод/библиотеку использовать, какую проверку добавить.

Security Test Case:

@Test
@DisplayName("[SECURITY] ...")
void testName() {
    // Arrange
    // Act
    // Assert — проверить, что уязвимость закрыта
}

Пример оформленного finding

В качестве образца изучите файл:

src/test/java/ru/itmo/testing/lab4/pentest/XssPentestTest.java

Он демонстрирует структуру pentest-теста для одной из уязвимостей приложения.
Ваша задача — найти остальные, описать их по шаблону выше и написать аналогичные тесты.


🔴 Finding #1 — Hardcoded World-Readable Path

Поле Значение
Компонент UserAnalyticsController.java (константа класса)
Тип Hardcoded Sensitive Path
CWE CWE-552
CVSS v3.1 4.0 MEDIUM (AV:L/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N)
Статус Confirmed

Описание: Путь экспорта отчётов жёстко задан как /tmp/reports/ — общедоступная директория.

Влияние: Локальный пользователь или процесс может прочитать или изменить отчёты, содержащие пользовательские данные.

Рекомендации по исправлению: Заменить путь на защищённую директорию внутри домашнего каталога приложения, например System.getProperty("user.home") + "/.app/reports".

Шаги воспроизведения:

  1. Открыть UserAnalyticsController.java:39.
  2. REPORTS_BASE_DIR = "/tmp/reports/".
  3. Ожидаемый результат: защищённая директория.
  4. Фактический результат: общедоступная временная папка.

🔴 Finding #2 — Information Disclosure via Exception Messages

Поле Значение
Компонент /recordSession, /monthlyActivity
Тип Information Disclosure
CWE CWE-209
CVSS v3.1 5.3 MEDIUM (AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N)
Статус Confirmed

Описание: Сообщения исключений напрямую возвращаются клиенту.

Влияние: Атакующий получает информацию о внутренней структуре приложения, что облегчает дальнейшие атаки.

Рекомендации по исправлению: Возвращать общее сообщение об ошибке, а детали логировать на сервере.

Шаги воспроизведения:

  1. POST /recordSession с loginTime=invalid.
  2. Ответ содержит "Invalid data: Text 'invalid' could not be parsed...".
  3. Ожидаемый результат: "Invalid data format".
  4. Фактический результат: утечка деталей парсинга.

🔴 Finding #3 — Path Traversal in Report Export

Поле Значение
Компонент /exportReport
Тип Path Traversal
CWE CWE-22
CVSS v3.1 7.5 HIGH (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:H)
Статус Confirmed

Описание: filename конкатенируется без проверки, позволяя выход за пределы /tmp/reports/.

Влияние: Атакующий может перезаписать системные файлы или записать вредоносные данные в произвольные директории.

Рекомендации по исправлению: Использовать Paths.get(baseDir).resolve(filename).normalize() и проверять, что результат начинается с baseDir.

Шаги воспроизведения:

  1. GET /exportReport?userId=x&filename=../../../etc/passwd
  2. Файл создаётся вне разрешённой директории.
  3. Ожидаемый результат: отклонение запроса.
  4. Фактический результат: запись в произвольную локацию.

🔴 Finding #4 — Server-Side Request Forgery (SSRF)

Поле Значение
Компонент /notify
Тип SSRF
CWE CWE-918
CVSS v3.1 8.6 HIGH (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N)
Статус Confirmed

Описание: Сервер выполняет запросы по переданному URL без валидации.

Влияние: Атакующий может сканировать внутреннюю сеть, получать метаданные облака или атаковать внутренние сервисы.

Рекомендации по исправлению: Реализовать allowlist разрешённых доменов и блокировать внутренние IP-адреса (localhost, 169.254.169.254, 10.0.0.0/8 и т.д.).

Шаги воспроизведения:

  1. POST /notify?userId=x&callbackUrl=http://169.254.169.254/latest/meta-data/
  2. Сервер обращается к внутреннему адресу.
  3. Ожидаемый результат: запросы только к разрешённым хостам.
  4. Фактический результат: доступ к внутренним ресурсам.

🔴 Finding #5 — Reflected XSS

Поле Значение
Компонент /userProfile
Тип Reflected XSS
CWE CWE-79
CVSS v3.1 6.1 MEDIUM (AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N)
Статус Suspected

Описание: Имя пользователя вставляется в HTML без экранирования.

Влияние: Атакующий может выполнить произвольный JavaScript в браузере жертвы, что приводит к краже сессий или фишингу.

Рекомендации по исправлению: Использовать StringEscapeUtils.escapeHtml4() или шаблонизатор (JTE, Thymeleaf) с автоматическим экранированием.

Шаги воспроизведения:

  1. Зарегистрировать пользователя с именем: <script>alert(1)</script>
  2. Открыть /userProfile?userId=...
  3. Ожидаемый результат: отображение как текст.
  4. Фактический результат: выполнение скрипта.

Полезные ресурсы

About

software_testing_spring_2026-lab4-security-lab4-security created by GitHub Classroom

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Java 98.7%
  • Nix 1.3%