🛠 Обзор OWASP Top 10 2025 для Java
Салют,
Мы тут с тобой недавно начали смотреть в сторону OWASP TOP 10 (тут) для правил Semgrep.
Я думаю, что будет классно сделать обзор по OWASP c конкретикой для Java, где я дальше смогу показать почему это прикольно в кастоме для данного языка. Тем более я готовлю сейчас сурсный проект для Semgrep, поэтому давай его сделаем вместе полезнее если ты в JAVA, либо работаешь с ним как-то смежно (да и в целом ты сможешь переиспользовать конструкты для других языков).
А на сейчас давай посмотрим основные типы с примерами
A01:2025 – Broken Access Control
Нарушение доступа — отсутствует ограничение действия пользователей за пределами их полномочий - действия без авторизации
// Отсутствует проверка владельца, следовательно пользователь `id=123` изменяется на `id=124` и получает информацию без каких-либо проверок
public Order getOrder(@PathVariable Long id) {
return orderRepository.findById(id)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
}
A02:2025 – Security Misconfiguration
Неправильная конфигурация — небезопасные настройки по умолчанию, открытые Actuator-endpoints, отключённые security-заголовки
A03:2025 – Software Supply Chain Failures
Сбои цепочки поставок — уязвимые зависимости, пайплайны без проверок и верификации артефактов, скомпрометированные репозитории, Maven/ Gradle репозитории по прямому HTTP, отсутствие проверки контрольных сумм, snapshot в prod
A04:2025 – Cryptographic Failures
Криптографические сбои — слабые алгоритмы, примитивное хеширование, недостаточная длина ключей
// MD5 без соли, взламывается rainbow tables
String hash = DigestUtils.md5Hex(password);
userRepository.save(new User(username, hash));
A05:2025 – Injection
Инъекции - ввод без санитизации типа FreeMarker, Velocity, Thymeleaf, JNDI
// Конкатенация строк в SQL
String query = "SELECT * FROM users WHERE username = '" + username + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
A06:2025 – Insecure Design
Небезопасный дизайн — проблемы заложены на уровне архитектуры: отсутствие rate limit, нет проверок логики, не предусмотрен fail-safe
// Отсутствуют rate limit на пароль и атакующий перебирает OTP без ограничений
public ResponseEntity<?> resetPassword(@RequestBody ResetRequest req){
return passwordService.reset(req.getEmail(), req.getOtp());
}
A07:2025 – Authentication Failures
Сбои аутентификации — слабые пароли, отсутствие MFA, небезопасные сессии, отсутствие защиты от брутфорса, небезопасное хранение учётных данных
// JWT принимается без проверки подписи
Claims claims = Jwts.parser()
.parse(token)
.getBody();
String role = claims.get("role", String.class);
A08:2025 – Software or Data Integrity Failures
Сбои целостности — десериализация объектов без обьявления ограничений, отсутствие проверки подписи, отключённая верификация TLS-сертификатов, JNDI injection, обновления по HTTP без проверки хеша
// Десериализация без фильтра типов, возможен RCE через gadget-цепочки
ObjectInputStream ois = new ObjectInputStream(request.getInputStream());
Object obj = ois.readObject();
A09:2025 – Security Logging & Alerting Failures
Сбои логирования — отсутствие записи событий инфобеза, типа failed logins, access denied, privilege escalation, логирование паролей и токенов в открытом виде, отсутствие алертов для SIEM
A10:2025 – Mishandling of Exceptional Conditions
Неправильная обработка исключений - пустые catch-блоки, stacktrace в HTTP-ответах, fail-open поведение, то есть возврат true при исключении, потеря исключений в async-коде, некорректные HTTP-статус коды ошибок
public boolean isAuthorized(String token) {
try {
return jwtService.verify(token);
} catch (Exception e) {
return true; // получение доступа
}
}
#devsecops #toolchain #sast #dast #secretmanagement #specialty #appsec
