Найдите небезопасную десериализацию недоверенных данных
Этот Java-эндпоинт читает сериализованный объект прямо из тела HTTP-запроса. Определите уязвимость и как она ведёт к выполнению кода, затем опишите исправление.
Ограничения:
- входной поток — сырое, контролируемое атакующим тело HTTP
- нет белого списка классов, которые разрешено десериализовать
ObjectInputStream ois = new ObjectInputStream(request.getInputStream());
Object invocation = ois.readObject(); // принимается любой класс
Определите причину.
Небезопасная десериализация — readObject создаёт произвольные выбранные атакующим классы из недоверенных байтов, поэтому цепочка гаджетов выполняет код при десериализации (RCE). Фикс: не десериализовать недоверенный ввод; JSON со схемой или белый список.
- ✗Считать десериализацию Java типобезопасной и неспособной к RCE
- ✗Думать, что try/catch вокруг readObject устраняет угрозу
- ✗Путать это с XXE или с утечкой через логирование
- →Что такое цепочка гаджетов и почему её хватает для RCE без своего класса?
- →Чем безопасный формат данных (JSON) надёжнее нативной сериализации объектов?
Уязвимость
readObject восстанавливает любой класс из недоверенного потока:
ObjectInputStream ois = new ObjectInputStream(request.getInputStream());
Object invocation = ois.readObject();
Если в classpath есть подходящие библиотеки, атакующий собирает цепочку гаджетов — связку существующих классов, чьи побочные эффекты при десериализации (readObject, readResolve, методы при сборке) выполняют код. Результат — RCE без единого собственного класса атакующего.
Исправление
Лучше всего вовсе не десериализовать недоверенный ввод. Используйте безопасный формат с явной схемой:
// JSON с явным целевым типом — никакой произвольной инстанциации классов
RemoteInvocation inv = objectMapper.readValue(request.getInputStream(),
RemoteInvocation.class);
Если нативная сериализация неизбежна — ограничьте классы белым списком через look-ahead ObjectInputStream (resolveClass). ⚠️ try/catch вокруг readObject не помогает: код выполняется во время десериализации, до возврата.