Rostelecom Security Labs

SecureCode Review — REST IDOR без @PreAuthorize

Эндпоинт /api/v1/users/{id} возвращает профиль, доверяя идентификатору из пути. Метод аннотацию авторизации потерял — найди строку и предложи защиту.

📚 Теория: IDOR и методовая авторизация (раскрыть)

Где ломается безопасность?

Контроллер берёт идентификатор из URL, вызывает сервис и возвращает чужой профиль. Авторизация «планировалась» через @PreAuthorize, но её отключили.

⚠️ Любой пользователь меняет {id} и получает данные соседа.

Как исправить?

Верните методовую проверку: @PreAuthorize(\"hasRole('ADMIN') or #principal.id == #id\"). На уровне сервиса продублируйте ownership check.

🔐 Используйте SpEL, ACL, и централизованную проверку в слое бизнес-логики.

1. Подмена ID

Клиент запрашивает /api/v1/users/42, хотя владеет только ID 7.

2. Нет фильтра

Метод контроллера не проверяет, что principal.id == id.

3. Утечка

Возвращаются чужие персональные данные, нарушая GDPR/152-ФЗ.

Как надо: включите методовую защиту, проверяйте владельца в сервисе, добавьте негативные тесты с spring-security-test и аудит отказов.

Контекст

Команда временно сняла аннотацию безопасности, чтобы «ускорить демо». В релиз код ушёл без проверки владельца и роли. Теперь любой аутентифицированный пользователь видит чужой профиль.

Сниппет

Загружаем сниппет…

Code Review

Проверка флага

После ревью зафиксируй флаг, чтобы дашборд засчитал лабораторию.