Existe uma vulnerabilidade conhecida para wp-cron.php?


9

Estou usando o WordPress v.4.1 e todos os plugins e o tema estão atualizados.

Vejo nos meus arquivos de log muitos desses ...

xxx.xxx.xxx.xxx - - [02/Jan/2015:13:30:27 +0200] "POST /wp-cron.php?doing_wp_cron=1420198227.5184459686279296875000 HTTP/1.0" 200 - "-" "WordPress/217; http://www.example.com"

onde xxx.xxx.xxx.xxx é o endereço IP do servidor em que o site está hospedado e " http://www.example.com " é o meu site.

Existe uma vulnerabilidade conhecida (exploração) que afeta o wp-cron.php?
Existe uma maneira de "proteger" o arquivo?

Obrigado!

Respostas:


4

Em wp-includes/default-filters.phppodemos encontrar um registro de retorno de chamada:

// WP Cron
if ( !defined( 'DOING_CRON' ) )
    add_action( 'init', 'wp_cron' );

Se formos a função wp_cron()agora, vemos o seguinte:

$schedules = wp_get_schedules();
foreach ( $crons as $timestamp => $cronhooks ) {
    if ( $timestamp > $gmt_time ) break;
    foreach ( (array) $cronhooks as $hook => $args ) {
        if ( isset($schedules[$hook]['callback']) && !call_user_func( $schedules[$hook]['callback'] ) )
            continue;
        spawn_cron( $gmt_time );
        break 2;
    }
}

spawn_cron() envia a solicitação POST que você está vendo em seus logs:

$doing_wp_cron = sprintf( '%.22F', $gmt_time );
set_transient( 'doing_cron', $doing_wp_cron );

/**
 * Filter the cron request arguments.
 *
 * @since 3.5.0
 *
 * @param array $cron_request_array {
 *     An array of cron request URL arguments.
 *
 *     @type string $url  The cron request URL.
 *     @type int    $key  The 22 digit GMT microtime.
 *     @type array  $args {
 *         An array of cron request arguments.
 *
 *         @type int  $timeout   The request timeout in seconds. Default .01 seconds.
 *         @type bool $blocking  Whether to set blocking for the request. Default false.
 *         @type bool $sslverify Whether SSL should be verified for the request. Default false.
 *     }
 * }
 */
$cron_request = apply_filters( 'cron_request', array(
    'url'  => add_query_arg( 'doing_wp_cron', $doing_wp_cron, site_url( 'wp-cron.php' ) ),
    'key'  => $doing_wp_cron,
    'args' => array(
        'timeout'   => 0.01,
        'blocking'  => false,
        /** This filter is documented in wp-includes/class-http.php */
        'sslverify' => apply_filters( 'https_local_ssl_verify', false )
    )
) );

wp_remote_post( $cron_request['url'], $cron_request['args'] );

Aqui você também pode ver de onde vem o número flutuante: Ele é passado como argumento para identificar o transitório.

Nada para se preocupar.


-1

Se você deseja proteger o arquivo, pode restringir o acesso ao arquivo através do seu httpd.conf (arquivo de configuração global do Apache).

# Wordpress wp-cron.php file
<Files "wp-cron.php">
  Require ip 1.2.3.4
</Files>

Substitua o IP no exemplo pelo IP do seu servidor. Isso ainda lhe dará acesso ao arquivo do servidor usando um comando como:

wget -q -O - domain.com/wp-cron.php?doing_wp_cron

E retornará um 403 (acesso negado a solicitações de qualquer outro IP). Se você usar uma regra adicional como a abaixo, redirecionará solicitações externas de 403 Forbiddenpara outra página (como a página inicial) que não é realmente necessária.

ErrorDocument 403 https://www.domain.ca

Mesmo melhor, você pode usar Require ip 127.0.0.1com o exemplo acima e usar o pedido wget: wget -q -O - 127.0.0.1/wp-cron.php?doing_wp_cron. Isso usará o controlador de rede de loopback e sua solicitação não será encaminhada para a Internet pública e vice-versa.


1
que irá bloquear invocações do cron OS que se realiza utilizando wget
— Mark Kaplun

Você pode me indicar onde o wget é chamado no código-fonte. A pesquisa rápida não me ajudou a encontrá-la rapidamente. Encontrei referências de servidor para o wget, mas apenas nos plugins WordFence e BulletProof.
— 22619 jonnyjandles # 0636

Wordpress não usa crons de SO. Além disso, usando a regra acima, consegui wget-cron.php usando o wget localhost / wp-cron.php e o wget 127.0.0.1/wp-cron.php . No entanto, ao tentar acessar de fora, faça o seguinte em access_log "GET /wp-cron.php HTTP / 1.1" 302 (redirecionamento). Porque também tenho um ErrorDocument 403 domain.com/index.php que direciona todo o acesso negado à página inicial.
— 22619 jonnyjandles

cron é http solicitado do núcleo wordpress. Todos os tutoriais disponíveis na rede sugerem que você use o wget para acionar o cron do WP a partir do cron do sistema operacional como uma substituição do acionamento nativo do WP. Além filtragem por IP whih é lways uma estratégia perdedora é ainda pior neste caso, como quando você mover seu site, quer cron irá parar de funcionar e você não sabe por que ou essas linhas vai parar de ter qualquer efeito
— Mark Kaplun

Use 127.0.0.1 em vez do IP público do servidor, como mencionei na minha resposta.
— jonnyjandles
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.