📚 Теория: JWT и секреты (раскрыть)
Как работает JWT?
JWT подписывается симметричным ключом. Если секрет попадает в руки злоумышленника, он может выпускать валидные токены.
⚠️ Любой, кто знает секрет, авторизуется как любой пользователь.
Почему нельзя хранить в коде?
Сборки, дампы памяти, Git — всё это источники утечек. Секреты должны быть ротационными и управляться через Secret Manager.
🔄 Регулярно обновляйте ключи и держите их вне репозитория.
Секрет попадает в GitHub или CI логи.
Атакующий выпускает токены с любой ролью.
Необходима срочная ротация всех сессий.
Best practice: секрет хранится в Secret Manager или ENV (Kubernetes Secret). На старте приложения валидируйте наличие ключа, ротуйте и версионируйте его.
Контекст
Команда написала простую авторизацию: класс TokenService подписывает JWT и проверяет их. Чтобы «упростить», секрет зашили прямо в код. Наша задача — остановить такую практику.
- Внимательно посмотри на константы и вспомогательные методы.
- Подумай, кто ещё увидит ключ (QA, подрядчик, злоумышленник).
- Предложи безопасное хранение и процесс ротации.
Сниппет
Code Review
Референс-фигура
JWT секрет должен приходить из секрета окружения, а не храниться в коде. Также важно добавить механизм ротации.
Флаг ревью: FLAG{java-hardcoded-jwt-secret}
@Service
public class TokenService {
private final SecretKey signingKey;
public TokenService(@Value("${security.jwt.secret}") String secret) {
this.signingKey = Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8));
}
public String issueToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(Date.from(Instant.now().plus(Duration.ofHours(4))))
.signWith(signingKey, SignatureAlgorithm.HS256)
.compact();
}
}
Подключи Secret Manager, настрой ротацию и blacklisting токенов при компрометации. Никогда не коммить секреты в Git.
Проверка флага
Отправь флаг, чтобы лаборатория появилась в прогрессе.