ApostropheCMS: Carga multipart no autenticada e ilimitada provoca DoS por agotamiento de disco
Resumen
El endpoint de envío de formularios ejecuta multer({ dest: os.tmpdir() }).any() antes de la autenticación, clave de API, lógica equivalente a CSRF o comprobación de existencia del formulario, sin límites de tamaño, recuento ni tasa. Los usuarios no autenticados pueden transmitir cuerpos sin límite al disco por solicitud; la limpieza ocurre solo tras recibir el cuerpo completo.
Detalles
packages/form/index.js apiRoutes.post.submit (L274–296): [ multer({ dest: os.tmpdir() }).any(), self.normalizeFiles, async function (req) { try { submitForm } finally { unlink files } } ]. Sin limits, sin limitación de tasa y sin validación previa. "CSRF" es una cookie de doble envío de valor fijo (vulnlab.csrf=csrf, establecida en cualquier GET, express/index.js L694–703), fácilmente obtenible de forma anónima.
PoC
$ curl -s -c csrfjar.cookies http://localhost:3100/ # get vulnlab.csrf=csrf (any GET)
$ df -P /tmp # before: used=1105212
$ curl -b csrfjar.cookies -X POST http://localhost:3100/api/v1/@apostrophecms/form/submit \
-F "file=@/tmp/opencode/big.bin;type=application/octet-stream" &
DURING transfer: used=1148668
still transferring: used=1226936 # +121MB mid-transfer on disk
http=500 time=1.78s sent=209715411B # generic error AFTER full staging
# Anonymous, zero credentials. 200MB written to /tmp pre-validation.
Impacto
Cualquier cliente no autenticado puede forzar al servidor a persistir cuerpos completos de solicitudes en el sistema de archivos temporal y decodificarlos con la CPU; las solicitudes paralelas agotan el disco /tmp (caída del proceso/host) y saturan el bucle de eventos, constituyendo un DoS remoto trivial. Las transferencias canceladas conllevan el riesgo de dejar archivos huérfanos (sin limpieza de req.aborted).
Mitigación
Qué hacer
Actualice @apostrophecms/form a la versión 1.5.5 o posterior.
Asimismo, configure multer limits (fileSize, fields, parts, fieldSize); realice comprobaciones de autenticación, rol y existencia antes del montaje de multer o dentro del controlador validado; elimine los archivos temporales en la primera lectura y en caso de req.aborted/error; e implemente limitación de tasa por IP.
Software afectado
Haz clic en una tecnología para ver todas sus vulnerabilidades.
| Plataforma | Paquete | Versiones vulnerables | Corregida en |
|---|---|---|---|
| Paquete de npm | @apostrophecms/form | < 1.5.5 | 1.5.5 |
Referencias
- https://github.com/apostrophecms/apostrophe/security/advisories/GHSA-89mh-mm8c-mv7f
- https://github.com/apostrophecms/apostrophe/commit/9500b8b0e1d630d5e07fbb5fd2c25ed0943845ce
- https://github.com/apostrophecms/apostrophe/commit/f84fd41cbf6c22eb8d0008fc9c25df1f7130b350
- https://github.com/apostrophecms/apostrophe
- https://github.com/apostrophecms/apostrophe/releases/tag/@apostrophecms/form@1.5.5
- Vector CVSS
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L- Debilidad (CWE)
CWE-770- Plataforma
- npm
- Paquete
@apostrophecms/form- Publicada
- 20.10.2026
- Actualizado
- 20.10.2026 21:23
Fuentes y licencias · Editado o traducido por DockRay; se mantienen los derechos y las licencias de las fuentes.
OSV / GitHub Advisory Database - GHSA-89mh-mm8c-mv7f - CC BY 4.0
Historial de vulnerabilidades: @apostrophecms/form
Todas las vulnerabilidades publicadas de este paquete (Paquete de npm), de la más reciente a la más antigua. Muestra si es un fallo aislado o un paquete que hay que vigilar.
- Entradas en total
- 2
- Primera → última
- 10.2026 10.2026
- Sin corrección
- 0
- Explotada en ataques
- 0
Distribución por gravedad
- Media 2
Divulgaciones por año
- 2026: 2
-
ApostropheCMS: Carga multipart no autenticada e ilimitada provoca DoS por agotamiento de disco esta entrada
Identifica las vulnerabilidades de tu aplicación
Con la integración de DockRay y el inventario de software activado, DockRay compara las versiones notificadas de los componentes con las vulnerabilidades conocidas y avisa de las coincidencias confirmadas. La cobertura depende de la tecnología compatible y de los avisos disponibles.