← back
CVE-2019-15107criticalunder attackransomwareCWE-78

CVE-2019-15107

100Vexday Risk Score

Patch now. It under exploitation confirmed by CISA and has a working public exploit.

ssvc Actcvss 9.8epss 100%
from disclosure to weapon3 days
Published on NVDAug 16
1st PoC+3d
metasploitAug 10
CISA KEV+952d
exploitation probability
100%top 1% of all CVEs
observed exploitation
yesCISA + VulnCheck
86 public exploit(s)
Action required by CISAfederal deadline: 2022-04-15

Apply updates per vendor instructions.

Summary

O parâmetro old de password_change.cgi no Webmin é passado sem sanitização para uma chamada de shell, permitindo injeção de comandos remota e não autenticada com privilégios de root. A origem não é um erro de programação comum: é um backdoor inserido por um atacante desconhecido na infraestrutura de build do projeto, presente apenas nos pacotes distribuídos via SourceForge — o código-fonte no GitHub nunca foi afetado. Está no catálogo KEV da CISA com exploração ativa confirmada, tem módulo Metasploit e PoC pública, mas a explorabilidade real depende de uma configuração específica não-padrão na maioria das versões.

Technical detail

A falha está em password_change.cgi, que envia a senha antiga informada pelo usuário para a função encrypt_password em acl/acl-lib.pl, que por sua vez chama unix_crypt para validar a senha atual contra o /etc/shadow. Nessa validação, o valor do parâmetro old é usado numa construção que executa comandos via shell sem escapar caracteres especiais — um caractere pipe (|) no valor de old é interpretado como separador de comando, caracterizando CWE-78 (OS Command Injection). O servidor nem chega a validar se o usuário ou a senha antiga estão corretos antes de processar o payload: o comando injetado é executado independentemente do resultado da autenticação.

A raiz do problema não foi um bug de código-fonte revisável, mas um comprometimento de supply chain: segundo o pesquisador que divulgou a falha (AkkuS, publicada na DEFCON AppSec Village), um atacante desconhecido inseriu instruções Perl (qx) no servidor de build do Webmin em duas ocasiões — abril de 2018, introduzindo o backdoor na release 1.890, e julho de 2018, reintroduzindo-o nas releases 1.900 a 1.920 (o desenvolvedor do módulo Metasploit cita a faixa 1.890–1.920). Somente os pacotes disponibilizados no SourceForge foram adulterados; os repositórios oficiais no GitHub do projeto não contêm o código malicioso.

O gatilho real da exploração depende do parâmetro miniserv{'passwd_mode'} em /etc/webmin/miniserv.conf. Quando esse valor é 2, o código correspondente a 'Prompt users with expired passwords to enter a new one' (Webmin Configuration > Authentication) está ativo e o fluxo vulnerável em password_change.cgi fica acessível sem autenticação prévia. Na versão 1.890 esse recurso já vem habilitado por padrão; nas versões 1.900 a 1.920 é preciso que o administrador tenha ativado essa opção manualmente — configuração que, segundo o próprio autor da descoberta, é usada por muitos administradores de Webmin.

How it’s exploited

O vetor é uma requisição HTTP POST não autenticada para password_change.cgi, contendo no campo old um valor com um caractere pipe seguido do comando a executar (ex.: usuário|comando). O servidor processa esse valor na rotina de validação da senha antiga e executa o comando com os privilégios do processo Webmin, tipicamente root, antes mesmo de reportar falha de autenticação. Não é necessário conhecer usuário, senha ou token de sessão válidos — a exploração é pré-autenticação e de baixa complexidade, o que justifica CVSS 9.8.

A única pré-condição real, ausente na manchete e essencial para avaliar o risco, é o miniserv.conf com passwd_mode=2 habilitado (ou a instalação ser especificamente a versão 1.890, vulnerável por padrão). Ambientes com a troca de senha expirada desabilitada — que é a configuração padrão a partir da 1.900 — não são explorável por este vetor, mesmo rodando versão nominalmente listada como afetada.

Existe módulo Metasploit público (rank Excellent) e exploit no Exploit-DB (EDB-ID 47230) que automatizam a verificação de vulnerabilidade e a entrega de payload via cmd/unix/reverse_python, além de PoCs adicionais catalogadas no Packet Storm. A presença no catálogo KEV da CISA confirma exploração ativa em campo, o que torna esta CVE um alvo recorrente de varredura massiva contra instâncias Webmin expostas à internet.

Versions

Affected
Webmin <= 1.920, segundo a descrição oficial da CVE. Pesquisadores que analisaram o backdoor no build indicam a faixa 1.882 a 1.921 (pentest.com.tr / DEFCON), enquanto a descrição do módulo Metasploit cita 1.890 a 1.920 como afetadas pelo backdoor propriamente dito. A versão 1.890 é explorável em instalação padrão; as demais versões na faixa exigem passwd_mode=2 habilitado em miniserv.conf.
Fixed in
Webmin 1.930 corrige a vulnerabilidade, conforme indicado pelo pesquisador que divulgou a falha e pela página oficial de segurança do Webmin.

How to protect

A correção definitiva é atualizar para Webmin 1.930 ou versão posterior, que remove o código do backdoor. Segundo o próprio fornecedor, a atualização é fortemente recomendada independentemente da configuração de troca de senha estar habilitada ou não.

Se a atualização imediata não for possível em instalações nas versões 1.900 a 1.920, o fornecedor orienta editar /etc/webmin/miniserv.conf e remover/desabilitar a diretiva que ativa o passwd_mode=2 (correspondente à opção 'Prompt users with expired passwords to enter a new one' em Webmin Configuration > Authentication), eliminando o caminho de código vulnerável sem precisar substituir o binário. Esse paliativo tem custo funcional: usuários com senha expirada deixam de poder trocá-la pela própria interface web até a atualização ser aplicada. Para a versão 1.890, que vem vulnerável por padrão, não há paliativo de configuração equivalente documentado — a única mitigação efetiva é a atualização.

Restringir acesso de rede à porta do Webmin (por padrão 10000) para IPs confiáveis reduz a superfície de ataque, mas não elimina a vulnerabilidade nem substitui a atualização ou a correção de configuração — não deve ser tratado como mitigação suficiente isoladamente.

How to detect

Em logs de acesso do Webmin/miniserv, procurar requisições POST para password_change.cgi originadas sem sessão autenticada válida, especialmente com o campo old contendo caracteres de shell como pipe (|), ponto e vírgula ou backticks — o valor esperado nesse campo é apenas a senha antiga em texto simples. Requisições repetidas com parâmetros user=root e expired=2 são um padrão característico dos exploits públicos conhecidos.

Como o vetor é pré-autenticação e o Metasploit inclui uma rotina de 'check' que envia um payload de teste (dir) antes da exploração real, tentativas de varredura tendem a gerar duas requisições sequenciais ao mesmo endpoint em curto intervalo. Ainda assim, não há assinatura de tráfego universalmente confiável além de inspecionar o conteúdo do parâmetro old — organizações sem WAF ou proxy inspecionando corpo de requisição HTTPS interna ao Webmin não terão visibilidade central desse tráfego.

Researched and written with AI from the vendor advisory and public analysis, with the sources above. Always confirm the fixed version in the official advisory before acting.
An issue was discovered in Webmin <=1.920. The parameter old in password_change.cgi contains a command injection vulnerability.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Affected products
n/a · n/a
public PoCs found86 VexDay Proof
cve_referenceVexDay Proofwww.exploit-db.com/exploits/47230exploitdbwww.exploit-db.com/exploits/47293unverifiedgithubgithub.com/jas502n/CVE-2019-1510766githubgithub.com/MuirlandOracle/CVE-2019-1510756githubgithub.com/K3ysTr0K3R/CVE-2019-15107-EXPLOIT10githubgithub.com/hannob/webminex8githubgithub.com/n0obit4/Webmin_1.890-POC7githubgithub.com/ruthvikvegunta/CVE-2019-151076githubgithub.com/AdministratorGithub/CVE-2019-151075githubgithub.com/Mattb709/CVE-2019-15107-Scanner3githubgithub.com/whokilleddb/CVE-2019-151073githubgithub.com/NasrallahBaadi/CVE-2019-151073githubgithub.com/AleWong/WebminRCE-EXP-CVE-2019-15107-3githubgithub.com/squid22/Webmin_CVE-2019-151073githubgithub.com/wenruoya/CVE-2019-151072githubgithub.com/HACHp1/webmin_docker_and_exp2githubgithub.com/Rayferrufino/Make-and-Break1githubgithub.com/MasterCode112/CVE-2019-151071githubgithub.com/TheAlpha19/MiniExploit1githubgithub.com/Mattb709/CVE-2019-15107-Webmin-RCE-PoC1githubgithub.com/hacknotes/CVE-2019-15107-Exploit0githubgithub.com/darrenmartyn/CVE-2019-151070githubgithub.com/CyberTuz/CVE-2019-15107_detection0githubgithub.com/gozn/detect-CVE-2019-15107-by-pyshark0githubgithub.com/h4ck0rman/CVE-2019-151070githubgithub.com/olingo99/CVE-2019-151070githubgithub.com/0x4r2/Webmin-CVE-2019-151070githubgithub.com/adampawelczyk/cve-2019-151070githubgithub.com/ketlerd/CVE-2019-151070githubgithub.com/diegojuan/CVE-2019-151070githubgithub.com/hadrian3689/webmin_1.9200githubgithub.com/f0rkr/CVE-2019-151070githubgithub.com/psw01/CVE-2019-15107_webminRCE0githubgithub.com/g1vi/CVE-2019-151070githubgithub.com/viglia/cve-2019-151070githubgithub.com/ianxtianxt/CVE-2019-151070githubgithub.com/ch4ko/webmin_CVE-2019-151070githubgithub.com/cdedmondson/Modified-CVE-2019-151070githubgithub.com/D4rkScare/CVE-2019-151070githubgithub.com/EdouardosStav/CVE-2019-15107-RCE-WebMin0githubgithub.com/bayazid-bit/CVE-2019-151070githubgithub.com/ArtemCyberLab/Project-Exploitation-of-Webmin-Authentication-Vulnerability0githubgithub.com/jini135wii/CVE-2019-151070vulncheckvulncheck.com/xdb/86807142d202unverifiedvulncheckvulncheck.com/xdb/36f3e23cc53aunverifiedvulncheckvulncheck.com/xdb/346894239882unverifiedvulncheckvulncheck.com/xdb/beaa095869bdunverifiedvulncheckvulncheck.com/xdb/50552f993bb1unverifiedvulncheckvulncheck.com/xdb/a990debb490eunverifiedvulncheckvulncheck.com/xdb/b745f18fe915unverifiedvulncheckvulncheck.com/xdb/c4581c84425bunverifiedvulncheckvulncheck.com/xdb/481f4128612dunverifiedvulncheckvulncheck.com/xdb/645d8ca04538unverifiedvulncheckvulncheck.com/xdb/bfb7ca362af4unverifiedvulncheckvulncheck.com/xdb/0d2cd9698102unverifiedvulncheckvulncheck.com/xdb/e5d9d10c9291unverifiedvulncheckvulncheck.com/xdb/91ebdf06889eunverifiedvulncheckvulncheck.com/xdb/660292b95806unverifiedvulncheckvulncheck.com/xdb/8d9cadf4b346unverifiedvulncheckvulncheck.com/xdb/323c8177e804unverifiedvulncheckvulncheck.com/xdb/e6dd22bbd303unverifiedvulncheckvulncheck.com/xdb/31a0904d05d9unverifiedvulncheckvulncheck.com/xdb/2e9eb90806b3unverifiedvulncheckvulncheck.com/xdb/4fd2ccb44e6cunverifiedcve_referencepacketstormsecurity.com/files/154141/Webmin-Remote-Comman-Execution.htmlunverifiedcve_referencepacketstormsecurity.com/files/154197/Webmin-1.920-password_change.cgi-Backdoor.htmlunverifiedcve_referencepacketstormsecurity.com/files/154485/Webmin-1.920-Remote-Code-Execution.htmlunverifiedvulncheckvulncheck.com/xdb/52c4d17f7d4aunverifiedvulncheckvulncheck.com/xdb/90ca878ea23aunverifiedcve_referencepacketstormsecurity.com/files/154141/Webmin-1.920-Remote-Command-Execution.htmlunverifiedvulncheckvulncheck.com/xdb/4c6823870c85unverifiedvulncheckvulncheck.com/xdb/0d4e36cd4a95unverifiedvulncheckvulncheck.com/xdb/9bbe351314fbunverifiedvulncheckvulncheck.com/xdb/a13dbcc678b1unverifiedvulncheckvulncheck.com/xdb/c6da575a25d8unverifiedvulncheckvulncheck.com/xdb/486adc8e3e40unverifiedvulncheckvulncheck.com/xdb/20196945d3c2unverifiedvulncheckvulncheck.com/xdb/c749357d2521unverifiedvulncheckvulncheck.com/xdb/73c54650e7c3unverifiedvulncheckvulncheck.com/xdb/e9a6c303fcfdunverifiedvulncheckvulncheck.com/xdb/908f11836959unverifiedvulncheckvulncheck.com/xdb/075aff434240unverifiedvulncheckvulncheck.com/xdb/a6c954e87af6unverifiedvulncheckvulncheck.com/xdb/6d77d7695cd4unverifiedvulncheckvulncheck.com/xdb/bc9b78848768unverifiedvulncheckvulncheck.com/xdb/26ea3ae3926dunverified
⚠ Public resources, to assess the exposure of systems you control or are authorized to test. Test only with authorization.