Telemetría de WordPress

·

Datos Transmitidos

Este documento detalla todos los datos que WordPress 6.9 envía a servicios externos en su configuración por defecto, con análisis de sensibilidad y implicaciones.

Información de Versiones de Software

Versión de WordPress

Valor$wp_version (ej: '6.9')

Enviado a:

  • ✓ Core Update API
  • ✓ Plugin Update API
  • ✓ Theme Update API
  • ✓ Translations API
  • ✓ Plugin Info API
  • ✓ Theme Info API
  • ✓ Browse Happy API
  • ✓ Community Events API
  • ✓ Pattern Directory API

Ubicación en códigowp-includes/version.php línea 19

SensibilidadMEDIA

  • Revela vulnerabilidades conocidas de la versión específica
  • Información públicamente accesible (visible en meta tags, RSS, etc.)

Formato de envío:

GET/POST parameter: version=6.9
User-Agent header: WordPress/6.9; https://example.com/

Versión de PHP

ValorPHP_VERSION (ej: '8.3.0')

Enviado a:

  • ✓ Core Update API

Código:

// wp-includes/update.php:38
$php_version = PHP_VERSION;
$query['php'] = $php_version;

SensibilidadALTA

  • Versiones antiguas de PHP tienen vulnerabilidades conocidas
  • Puede facilitar exploits dirigidos
  • Revela capacidades del servidor

Consideraciones:

  • PHP 7.2.24 es el mínimo requerido por WP 6.9
  • Versiones EOL (End of Life) son especialmente vulnerables

Versión de MySQL/MariaDB

Valor: Ejemplo '8.0.35' o '10.11.6-MariaDB'

Enviado a:

  • ✓ Core Update API

Código:

// wp-includes/update.php:79-85
if ( method_exists( $wpdb, 'db_server_info' ) ) {
    $mysql_version = $wpdb->db_server_info();
} elseif ( method_exists( $wpdb, 'db_version' ) ) {
    $mysql_version = preg_replace( '/[^0-9.].*/', '', $wpdb->db_version() );
} else {
    $mysql_version = 'N/A';
}

SensibilidadMEDIA-ALTA

  • Identifica si es MySQL o MariaDB
  • Versiones antiguas pueden tener vulnerabilidades
  • Mínimo requerido: MySQL 5.5.5

Extensiones PHP Instaladas

Valor: Array completo de extensiones con sus versiones

Enviado a:

  • ✓ Core Update API

Código:

// wp-includes/update.php:97-98
$extensions = get_loaded_extensions();
sort( $extensions, SORT_STRING | SORT_FLAG_CASE );
$query['extensions'] = array_combine( $extensions, array_map( 'phpversion', $extensions ) );

Ejemplo de datos:

array(
    'Core' => false,
    'date' => false,
    'libxml' => '2.9.10',
    'openssl' => '1.1.1k',
    'pcre' => false,
    'zlib' => '1.2.11',
    'bcmath' => false,
    'calendar' => false,
    'ctype' => false,
    'curl' => '7.68.0',
    'dom' => '20031129',
    'hash' => '1.0',
    'fileinfo' => '1.0.5',
    'filter' => '7.4.3',
    'ftp' => false,
    'gd' => false,
    'gettext' => false,
    'gmp' => false,
    'iconv' => false,
    'imagick' => '3.4.4',
    'intl' => '1.1.0',
    'json' => false,
    'ldap' => false,
    'mbstring' => false,
    'mysqli' => false,
    'mysqlnd' => 'mysqlnd 7.4.3',
    'exif' => '7.4.3',
    'pcntl' => false,
    'pdo_mysql' => false,
    'phar' => '7.4.3',
    'posix' => false,
    'redis' => '5.3.4',
    'session' => false,
    'soap' => false,
    'sockets' => false,
    'sodium' => false,
    'spl' => '7.4.3',
    'tokenizer' => '7.4.3',
    'xml' => false,
    'xmlreader' => '7.4.3',
    'xmlwriter' => '7.4.3',
    'zip' => '1.15.6',
    // ... y más
)

SensibilidadMUY ALTA

  • Revela configuración completa del servidor PHP
  • Identifica presencia/ausencia de extensiones de seguridad (sodium, openssl)
  • Puede revelar servicios adicionales (redis, memcached)
  • Información valiosa para ingeniería social y exploits

Justificación de WordPress:

“WordPress necesita saber qué capacidades tiene el servidor para recomendar actualizaciones compatibles”

Extensiones requeridasjsonhash

Información de Sistema Operativo

Plataforma y Arquitectura

Enviado a:

  • ✓ Core Update API

Código:

// wp-includes/update.php:111-114
'platform_flags' => array(
    'os'   => PHP_OS,           // ej: 'Linux', 'Windows', 'Darwin'
    'bits' => PHP_INT_SIZE === 4 ? 32 : 64,
),

Ejemplo:

array(
    'os' => 'Linux',
    'bits' => 64
)

SensibilidadBAJA-MEDIA

  • Información técnica básica
  • Útil para atacantes que buscan exploits específicos del OS

Soporte de Formatos de Imagen

Enviado a:

  • ✓ Core Update API

Código:

// wp-includes/update.php:151-181
if ( function_exists( 'gd_info' ) ) {
    $gd_info = gd_info();
    $query['image_support']['gd'] = array_keys(
        array_filter(
            array(
                'webp' => isset( $gd_info['WebP Support'] ),
                'avif' => isset( $gd_info['AVIF Support'] ),
                'heic' => isset( $gd_info['HEIC Support'] ),
                'jxl'  => isset( $gd_info['JXL Support'] ),
            )
        )
    );
}

if ( class_exists( 'Imagick' ) ) {
    $query['image_support']['imagick'] = array_keys(
        array_filter(
            array(
                'webp' => ! empty( Imagick::queryFormats( 'WEBP' ) ),
                'avif' => ! empty( Imagick::queryFormats( 'AVIF' ) ),
                'heic' => ! empty( Imagick::queryFormats( 'HEIC' ) ),
                'jxl'  => ! empty( Imagick::queryFormats( 'JXL' ) ),
            )
        )
    );
}

Ejemplo:

array(
    'gd' => array('webp'),
    'imagick' => array('webp', 'avif', 'heic')
)

SensibilidadBAJA

  • Información técnica sobre capacidades de procesamiento de imágenes
  • No expone datos personales ni críticos

Información de Base de Datos

Tablas MyISAM

Enviado a:

  • ✓ Core Update API

Código:

// wp-includes/update.php:118-149
$table_names   = implode( "','", $wpdb->tables() );
$myisam_tables = $wpdb->get_results(
    $wpdb->prepare(
        "SELECT TABLE_NAME FROM information_schema.TABLES
         WHERE TABLE_SCHEMA = %s
         AND TABLE_NAME IN ('$table_names')
         AND ENGINE = %s;",
        DB_NAME,
        'MyISAM'
    ),
    OBJECT_K
);

Enviado: Array de nombres de tabla (sin prefijo)

array('posts', 'comments', 'users', 'options')

SensibilidadMEDIA

  • Revela nombres de tablas estándar de WordPress
  • Indica uso de MyISAM (motor antiguo sin transacciones)
  • No incluye nombres de tablas personalizadas de plugins

Contexto: MyISAM está obsoleto, WordPress recomienda InnoDB

Versión Inicial de Base de Datos

Enviado a:

  • ✓ Core Update API

Valorget_site_option( 'initial_db_version' )

SensibilidadBAJA

  • Indica con qué versión de WordPress se creó el sitio
  • Ejemplo: 57155 (WordPress 6.4)

Información del Sitio WordPress

URL del Sitio

Enviado aTODAS LAS APIs

Formatos:

  1. User-Agent headerWordPress/6.9; https://example.com/
  2. Custom headers:
    • wp_install: URL de instalación (multisite: network URL)
    • wp_blog: URL del blog actual

Código:

// wp-includes/update.php:238-242
'user-agent' => 'WordPress/' . wp_get_wp_version() . '; ' . home_url( '/' ),
'headers'    => array(
    'wp_install' => $wp_install,
    'wp_blog'    => home_url( '/' ),
),

SensibilidadMEDIA-ALTA

  • Asocia todas las peticiones con un sitio específico
  • Permite tracking a través de múltiples APIs
  • WordPress.org podría construir perfiles de sitios

Justificación: WordPress necesita identificar el sitio para respuestas apropiadas

Número de Sitios y Usuarios (Multisite)

Enviado a:

  • ✓ Core Update API

Código:

// wp-includes/update.php:87-95
if ( is_multisite() ) {
    $num_blogs         = get_blog_count();
    $wp_install        = network_site_url();
    $multisite_enabled = 1;
} else {
    $multisite_enabled = 0;
    $num_blogs         = 1;
    $wp_install        = home_url( '/' );
}

$query['blogs'] = $num_blogs;
$query['users'] = get_user_count();
$query['multisite_enabled'] = $multisite_enabled;

SensibilidadMEDIA

  • Identifica instalaciones multisite
  • Revela escala del sitio/red
  • Número exacto de usuarios puede ser información estratégica

Locale (Idioma)

Enviado aTODAS LAS APIs

Valoreses_ESen_USfr_FR, etc.

Código:

// wp-includes/update.php:73
$locale = apply_filters( 'core_version_check_locale', get_locale() );

SensibilidadBAJA

  • Información necesaria para traducciones
  • Puede indicar ubicación geográfica aproximada

Inventarios de Software

Lista Completa de Plugins

Enviado a:

  • ✓ Plugin Update Check API

Datos por plugin:

array(
    'Name'        => 'Plugin Name',
    'PluginURI'   => 'https://example.com/plugin',
    'Version'     => '2.1.0',
    'Description' => 'Plugin description...',
    'Author'      => 'Author Name',
    'AuthorURI'   => 'https://author.com',
    'TextDomain'  => 'plugin-slug',
    'DomainPath'  => '/languages',
    'Network'     => false,
    'RequiresWP'  => '5.9',
    'RequiresPHP' => '7.4',
    'UpdateURI'   => '',              // Si usa repositorio custom
    'Title'       => 'Plugin Name',
    'AuthorName'  => 'Author Name'
)

SensibilidadMUY ALTA

Riesgos:

  1. Identificación de vulnerabilidades conocidas: Plugins desactualizados son objetivos primarios
  2. Huella digital única: La combinación específica de plugins puede identificar el sitio de forma única
  3. Información estratégica: Revela funcionalidad del sitio (e-commerce, membresías, etc.)
  4. Metadata sensible: Versiones exactas facilitan exploits específicos
  5. Reconocimiento: Atacantes pueden identificar la pila completa de software

Ejemplo de datos enviados:

{
  "akismet/akismet.php": {
    "Name": "Akismet Anti-spam",
    "Version": "5.3"
  },
  "woocommerce/woocommerce.php": {
    "Name": "WooCommerce",
    "Version": "8.5.1"
  },
  "wordfence/wordfence.php": {
    "Name": "Wordfence Security",
    "Version": "7.11.3"
  }
}

Plugins inactivos: También se envían, revelando plugins instalados pero no utilizados

Lista Completa de Temas

Enviado a:

  • ✓ Theme Update Check API

Datos por tema:

array(
    'Name'        => 'Twenty Twenty-Five',
    'ThemeURI'    => 'https://wordpress.org/themes/twentytwentyfive/',
    'Description' => 'Theme description...',
    'Author'      => 'the WordPress team',
    'AuthorURI'   => 'https://wordpress.org/',
    'Version'     => '1.0',
    'Template'    => '',                    // Tema padre (si es tema hijo)
    'Status'      => 'publish',
    'Tags'        => 'blog, one-column...',
    'TextDomain'  => 'twentytwentyfive',
    'DomainPath'  => '',
    'RequiresWP'  => '6.7',
    'RequiresPHP' => '7.2.24',
    'UpdateURI'   => '',
    'Title'       => 'Twenty Twenty-Five',
    'AuthorName'  => 'the WordPress team'
)

SensibilidadMEDIA-ALTA

  • Revela tema activo y temas inactivos
  • Temas desactualizados pueden tener vulnerabilidades
  • Tema hijo (Template) revela personalización

Traducciones Instaladas

Enviado a:

  • ✓ Core Update API
  • ✓ Plugin Update API
  • ✓ Theme Update API

Código:

$translations = wp_get_installed_translations( 'core' );  // o 'plugins', 'themes'

Formato:

array(
    'es_ES' => array(
        'PO-Revision-Date' => '2026-01-15 10:30:00+0000',
        'MIME-Version' => '1.0',
        'Content-Type' => 'text/plain; charset=UTF-8',
        'Content-Transfer-Encoding' => '8bit',
        'Plural-Forms' => 'nplurals=2; plural=n != 1;',
        'X-Generator' => 'GlotPress/...',
        'Language' => 'es',
        'Project-Id-Version' => 'WordPress 6.9'
    )
)

SensibilidadBAJA

  • Confirma idiomas del sitio
  • No expone información crítica

Datos del Usuario/Navegador

User-Agent del Navegador

Enviado a:

  • ✓ Browse Happy API

Valor completo: Ejemplo

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36

Código:

// wp-admin/includes/dashboard.php:1820
array( 'useragent' => $_SERVER['HTTP_USER_AGENT'] )

SensibilidadALTA

Riesgos de privacidad:

  1. Browser fingerprinting: Identificación única del navegador
  2. Información del sistema: OS, arquitectura, motor de renderizado
  3. Versiones específicas: Identifica vulnerabilidades del navegador
  4. Datos del administrador: Revela información sobre el usuario admin, no el servidor

GDPR: User-Agent puede considerarse dato personal en contexto de identificación única

IP del Usuario (Anonimizada)

Enviado a:

  • ✓ Community Events API (anonimizada)

Código de anonimización:

// wp-admin/includes/class-wp-community-events.php:178-199
protected function get_unsafe_client_ip() {
    $client_ip = false;

    // In order of preference...
    if ( ! empty( $_SERVER['HTTP_CLIENT_IP'] ) ) {
        $client_ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif ( ! empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
        $client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } elseif ( ! empty( $_SERVER['REMOTE_ADDR'] ) ) {
        $client_ip = $_SERVER['REMOTE_ADDR'];
    }

    return $client_ip;
}

// Anonimización: wp_privacy_anonymize_ip()
// IPv4: 192.168.1.100 -> 192.168.1.0
// IPv6: 2001:db8::1 -> 2001:db8::

SensibilidadMEDIA (por anonimización)

  • IP anonimizada no permite identificación precisa
  • Permite geolocalización aproximada (ciudad/región)

Diseño de privacidad: WordPress implementa medidas de protección

Geolocalización (Opcional)

Enviado a:

  • ✓ Community Events API

Datos:

array(
    'location_search' => 'Madrid',      // Opcional: búsqueda manual
    'lat' => '40.4168',                 // Opcional: coordenadas
    'lon' => '-3.7038',                 // Opcional: coordenadas
    'timezone' => 'Europe/Madrid'       // Zona horaria del usuario
)

SensibilidadMEDIA-ALTA (si se proporciona)

  • El usuario debe proporcionar ubicación manualmente
  • No se envía automáticamente sin consentimiento

Búsquedas y Consultas del Usuario

Búsquedas de Plugins

Enviado a:

  • ✓ Plugin Info API

Datos:

array(
    'search' => 'contact form',
    'tag' => 'forms',
    'author' => '',
    'browse' => 'popular',
    'page' => 1,
    'per_page' => 24
)

SensibilidadMEDIA

  • Revela intenciones y necesidades del administrador
  • Puede indicar funcionalidad planificada del sitio
  • WordPress.org puede construir perfiles de comportamiento

Búsquedas de Patrones de Bloques

Enviado a:

  • ✓ Pattern Directory API

Datos:

array(
    'search' => 'hero section',
    'pattern-categories' => 'header',
    'pattern-keywords' => 'CTA'
)

SensibilidadBAJA-MEDIA

  • Revela diseño e intenciones de diseño
  • Proxied por el servidor (no expone IP del usuario final)

Configuración y Estado del Sistema

WP-Cron Status

Enviado indirectamente: Afecta timeout de peticiones

Código:

// wp-includes/update.php:234
$doing_cron = wp_doing_cron();
$options = array(
    'timeout' => $doing_cron ? 30 : 3,
    ...
);

No se envía explícitamente, pero el timing puede inferirlo.

Canales de Actualización

Enviado a:

  • ✓ Core Update API

Valorbetarcdevelopmentbranch-development

Código:

// wp-includes/update.php:220-224
if ( defined( 'WP_AUTO_UPDATE_CORE' )
    && in_array( WP_AUTO_UPDATE_CORE, array( 'beta', 'rc', 'development', 'branch-development' ), true )
) {
    $query['channel'] = WP_AUTO_UPDATE_CORE;
}

SensibilidadBAJA

  • Indica sitios de prueba/desarrollo
  • No expone datos sensibles

Datos NO Enviados (Confirmado)

✗ Contenido de posts/páginas ✗ Usuarios y sus datos personales ✗ Datos de clientes/pedidos ✗ Passwords o salts ✗ Rutas absolutas del servidor ✗ Nombre de base de datos ✗ Credenciales FTP/SSH ✗ Claves API de terceros ✗ Contenido de formularios ✗ Emails de usuarios ✗ Información de pago

Resumen de Sensibilidad

CategoríaSensibilidadJustificación
Versión de WordPressMediaExpone vulnerabilidades conocidas
Versión de PHPAltaFacilita exploits dirigidos
Versión de MySQLMedia-AltaIdentifica vulnerabilidades
Extensiones PHPMuy AltaConfiguración completa del servidor
OS y arquitecturaBaja-MediaInfo técnica básica
Soporte de imágenesBajaCapacidades técnicas
Tablas MyISAMMediaEstructura de BD
URL del sitioMedia-AltaTracking y asociación
Número de sitios/usuariosMediaEscala del sitio
LocaleBajaNecesario para traducciones
Lista de pluginsMuy AltaHuella digital única, vulnerabilidades
Lista de temasMedia-AltaIdentifica personalización
TraduccionesBajaInfo de idiomas
User-Agent navegadorAltaFingerprinting, dato personal
IP (anonimizada)MediaGeolocalización aproximada
GeolocalizaciónMedia-AltaSi se proporciona voluntariamente
BúsquedasMediaRevela intenciones

Conclusiones

Datos Más Sensibles

  1. Lista completa de plugins y versiones – Vulnerabilidades y huella digital
  2. Extensiones PHP completas – Configuración del servidor
  3. User-Agent del navegador – Fingerprinting y dato personal
  4. Versión de PHP – Facilita exploits
  5. URL del sitio en todas las peticiones – Tracking

Justificación de WordPress.org

WordPress argumenta que estos datos son necesarios para:

  • Proporcionar actualizaciones compatibles
  • Mejorar la experiencia del usuario
  • Ofrecer recomendaciones relevantes
  • Estadísticas del ecosistema

Recomendaciones

  1. Revisar necesidad: ¿Necesita el sitio todas estas comunicaciones?
  2. Implementar filtros: WordPress permite filtrar datos enviados
  3. Usar plugins de privacidad: Herramientas para gestionar llamadas externas
  4. Considerar proxy: Centralizar peticiones a través de proxy propio
  5. Documentar: Incluir en política de privacidad del sitio

Páginas: 1 2 3 4 5 6

Comments

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *