/api/restore.
Приложение десериализует его и выполняет вредоносный код при readObject().
Body: base64(...serialized payload...)
{ "status":"restored" }
Приложение принимает сериализованный объект (например, Base64),
десериализует его через ObjectInputStream и верит ему.
Атакующий может подсунуть объект с вредоносным кодом и добиться RCE.
/api/restore.
Приложение десериализует его и выполняет вредоносный код при readObject().
Тест отправляет заведомо «левый» сериализованный объект.
Если сервис всё ещё пытается десериализовать через ObjectInputStream
и отвечает 200 — билд стопаем.
Ожидаем 400/403.
#!/bin/bash
# deserialization-check.sh
MALICIOUS=$(cat malicious_payload.base64)
STATUS=$(curl -s -o /tmp/resp.json -w "%{http_code}" \
-X POST \
-H "Content-Type: text/plain" \
--data "$MALICIOUS" \
https://staging.example.internal/api/restore)
if [ "$STATUS" = "200" ]; then
echo "[BLOCK] Небезопасная десериализация всё ещё включена"
exit 1
fi
echo "[OK] Сырая десериализация объектов больше не допускается (HTTP $STATUS)"
exit 0
Это закрывает путь к удалённому выполнению кода внутри вашего сервиса.
Стандарт:мы не принимаем "сырые сериализованные Java-объекты" от клиента. Только валидированные DTO.