flawopen.com/Teardowns/cve-2026-21589-atlassian-arbitrary-file-access
CVE-2026-21589: acceso a archivos en Atlassian Data Center
El aviso de Atlassian y el informe del MS-ISAC del 12 de octubre confirman el riesgo y la urgencia, pero no demuestran explotación en una instancia concreta de un cliente.[1], [4], [5], [10]
Imagina una biblioteca que acepta de un visitante la ubicación de una estantería. No puede recorrerlas todas, pero si ya conoce dónde está un libro concreto, un control de límites defectuoso puede hacer que el empleado lo busque fuera del área pública. La corrección mantiene cada ruta dentro del área permitida e instala el parche específico del producto.[1], [4]
Conceptos Clave y Términos
Acceso arbitrario a archivos- Una solicitud accede a archivos fuera del alcance previsto. Atlassian describe acceso a archivos específicos bajo la raíz web, no a todo el sistema de archivos.[1], [4]
Path traversal- Los componentes de una ruta cruzan el límite del directorio esperado. La mitigación de Atlassian aborda marcadores de traversal y variantes codificadas en URL.[1], [4]
Data Center- Modelo autogestionado de despliegue de Atlassian. El aviso enumera ocho productos afectados; Atlassian afirma que sus productos Cloud ya están parcheados.[1]
Ruta conocida- Hay que conocer de antemano el nombre y la ruta exactos del archivo; el aviso indica que la falla no enumera directorios.[1]
CVSS 4.0- Atlassian clasifica la falla como Crítica, CVSS 4.0 9,3, según su propia evaluación.[1]
Router.unescapeSlashes()- La biblioteca compartida convierte el separador codificado
::de nuevo en/antes de procesar el recurso; ese límite de decodificación es clave en el análisis de watchTowr.[1], [4] ResourceServingHelpers- El helper resuelve el nombre del recurso y pasa la ruta relativa restante a
createResourceWithRelativePath().[1], [4] Cadena de credenciales de Crowd- Posible paso posterior condicionado por la configuración: un archivo de propiedades Crowd legible puede revelar una contraseña de aplicación; la red y los permisos determinan si sirve.[4], [5]
CWE-22- Clasificación editorial de FlawOpen para la debilidad de path traversal: la ruta no queda limitada adecuadamente al directorio previsto. El aviso de Atlassian no asigna un CWE.[6]
Mapeos de marcos
- Mapeo conceptual de FlawOpen a MITRE CWE; ningún proveedor ni registro CVE asignó este identificador de debilidad a esta demostración de investigación. CWE-22
Análisis de Causa Raíz
El análisis de watchTowr de la biblioteca compartida atlassian-plugins-webresource identifica el límite de decodificación de rutas. Router.unescapeSlashes() convierte :: en /; las rutas de recursos aplican la función a componentes controlados por la solicitud antes de llamar a los controladores de recursos. La búsqueda posterior divide el nombre del recurso y entrega la ruta restante a createResourceWithRelativePath(), donde la representación alternativa del separador puede eludir la comprobación de traversal. Los investigadores demostraron lecturas de archivos dentro del contexto de la aplicación Tomcat en Jira, Confluence y Bitbucket; Atlassian enumera ocho productos afectados. El informe dice que sus pruebas no salieron del contexto Tomcat. En una cadena condicional, un WEB-INF/classes/crowd.properties legible puede revelar en texto claro la contraseña de aplicación de Crowd; el impacto depende de la configuración y de que Crowd sea accesible. BleepingComputer informa que sensores de Previdian observaron intentos horas después de publicarse el análisis técnico y el PoC. Son intentos en honeypots, no prueba de acceso exitoso a sistemas de clientes. Los fragmentos Java vulnerables que siguen fueron publicados por watchTowr. La defensa inferior es un patrón general, no el parche Atlassian, cuyo código completo no se publicó; instala la corrección oficial de cada producto.[1], [4], [5]
Flujo de Ataque Paso a Paso
La búsqueda recibe la ruta decodificada
El helper recorre los componentes y entrega la ruta relativa restante a la fábrica de recursos. El separador alternativo puede eludir las suposiciones de la comprobación de traversal.[4]
Los intentos observados elevan la urgencia, no prueban una intrusión
El 12 de octubre, el aviso del MS-ISAC del Center for Internet Security indicó que había informes de explotación de CVE-2026-21589 en el entorno real. No identificó víctimas ni publicó pruebas del incidente; por eso, debe tratarse como un indicio de explotación comunicado por el MS-ISAC, no como acceso confirmado a un cliente concreto. El aviso de Atlassian del 5 de octubre dijo que su investigación no había encontrado indicios de explotación en sus productos Cloud, que ya estaban parcheados. Esa conclusión se limitaba a Cloud y no contradice el informe del MS-ISAC sobre la explotación de la vulnerabilidad; ninguna de las declaraciones determina qué ocurrió en una instancia concreta.[1], [10]
Código Fuente: Vulnerable vs. Seguro
El fragmento vulnerable muestra la transformación de ruta en el código fuente publicada por watchTowr para la biblioteca web-resource afectada; no es una solicitud de explotación. El ejemplo inferior es una defensa general en Java, no el parche de Atlassian: recorre desde una raíz confiable mediante handles SecureDirectoryStream, rechaza enlaces simbólicos en cada componente y limita los bytes leídos. Quien lo invoque debe proporcionar una ruta relativa decodificada una sola vez y un SecureDirectoryStream con raíz en un directorio confiable. Algunos proveedores de sistemas de archivos pueden no admitir SecureDirectoryStream; en ese caso, falle de forma segura. Instale la corrección específica del producto del proveedor. Este ejemplo requiere un árbol de recursos confiable, cuyos directorios y archivos no puedan ser modificados por usuarios no confiables y que contenga solo archivos regulares; no verifica el tipo de archivo por sí mismo. El límite de bytes y el tratamiento acotado de lecturas sin progreso limitan la lectura, pero no constituyen una rutina universal para servir archivos. Quien lo invoque debe proporcionar la ruta relativa decodificada una sola vez y conservar un flujo raíz confiable. La compatibilidad del proveedor del sistema de archivos es opcional; falle de forma segura si SecureDirectoryStream no está disponible.[4], [7]
public static String unescapeSlashes(String string) {
return string.replaceAll("::", "/");
}
static byte[] readUnder(SecureDirectoryStream<Path> root, Path relative, int maxBytes) throws IOException {
if (relative.isAbsolute() || relative.getNameCount() == 0 || maxBytes < 0) {
throw new SecurityException("Expected a relative path and non-negative limit");
}
List<SecureDirectoryStream<Path>> opened = new ArrayList<>();
SecureDirectoryStream<Path> parent = root;
try {
for (int i = 0; i < relative.getNameCount() - 1; i++) {
Path part = relative.getName(i);
if (part.toString().isEmpty() || part.toString().equals(".") || part.toString().equals("..")) {
throw new SecurityException("Invalid path component");
}
parent = parent.newDirectoryStream(part, LinkOption.NOFOLLOW_LINKS);
opened.add(parent);
}
Path leaf = relative.getFileName();
if (leaf.toString().isEmpty() || leaf.toString().equals(".") || leaf.toString().equals("..")) {
throw new SecurityException("Invalid file name");
}
try (SeekableByteChannel channel = parent.newByteChannel(
leaf, Set.of(StandardOpenOption.READ, LinkOption.NOFOLLOW_LINKS))) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteBuffer buffer = ByteBuffer.allocate(8192);
int total = 0;
int zeroReads = 0;
while (true) {
int count = channel.read(buffer);
if (count == -1) break;
if (count == 0) {
if (++zeroReads >= 3) throw new IOException("Resource read made no progress");
continue;
}
zeroReads = 0;
if (count > maxBytes - total) throw new IOException("Resource exceeds size limit");
out.write(buffer.array(), 0, count);
total += count;
buffer.clear();
}
return out.toByteArray();
}
} finally {
for (int i = opened.size() - 1; i >= 0; i--) opened.get(i).close();
}
}
Lista de Verificación de Seguridad para Ingeniería
- ✓Versiones mínimas corregidas: Bitbucket 9.4.26 / 10.2.8 / 10.5.1; Confluence 9.2.26 / 10.2.19; Jira Service Management 5.12.40 / 10.3.26 / 11.3.12; Jira Software 9.12.40 / 10.3.26 / 11.3.12; Bamboo 10.2.24 / 12.1.12; Crowd 6.3.7 / 7.0.3 / 7.1.7 / 7.2.4; Crucible y Fisheye 4.9.15. Consulta la fila del producto.[1]
- ✓Inventaría los ocho productos autogestionados afectados (seis identificados como Data Center, además de Crucible y Fisheye), sus nodos y mirrors, y las instancias expuestas a Internet. Atlassian indica que sus productos Cloud ya están parcheados.[1]
- ✓Actualiza cada instalación afectada a una versión corregida del aviso y verifica la versión activa en cada nodo del clúster.[1]
- ✓Si no puedes parchear de inmediato, restringe el acceso público hasta que la instancia esté parcheada o mitigada. Aplica en todos los nodos pertinentes la regla temporal adecuada al producto (WAF/proxy, Tomcat RewriteValve o urlrewrite.xml de Bitbucket) y prueba variantes codificadas antes de confiar en ella.[1]
- ✓Revisa los registros decodificando las URL como indica Atlassian (hasta dos pasadas) y busca
..junto a/,\o::; conserva los registros sin modificar.[1], [9] - ✓Trata una solicitud coincidente como una señal para investigar, no como prueba de que se devolvió un archivo. Atlassian no puede confirmar el compromiso; evalúa qué archivos sensibles existían y decide las acciones de respuesta según las pruebas disponibles.[1], [9]
- ✓En código propio, define una sola capa de canonicalización, impón el límite de una raíz permitida y contempla enlaces simbólicos, carreras y cada capa de decodificación.[7], [6]
Fuentes
- Aviso de seguridad de Atlassian — CVE-2026-21589
- CERT-EU — vulnerabilidad crítica en productos Atlassian
- Centro Canadiense de Ciberseguridad — aviso Atlassian AV26-1002
- watchTowr Labs — CVE-2026-21589 technical analysis
- BleepingComputer — observed CVE-2026-21589 exploitation attempts
- MITRE CWE-22 — Path Traversal (FlawOpen editorial mapping)
- Oracle Java API — SecureDirectoryStream
- Previdian — sensor telemetry and exploitation methodology
- NIST SP 800-61 Rev. 3 — Recomendaciones de respuesta a incidentes
- Center for Internet Security MS-ISAC — CVE-2026-21589 exploitation report (October 12, 2026)