Esta é uma vulnerabilidade direcionada a aplicativos CGI em PHP, Go, Python e outras linguagens.
httpoxy é o nome de uma família de vulnerabilidades que afetam aplicativos executados em CGI ou semelhante a CGI. Simplificando, é um problema de conflito de namespace.
- RFC 3875 (CGI) define como
Proxy
preencher diretamente variáveis de ambiente a partir do cabeçalho da solicitação HTTPHTTP_PROXY
HTTP_PROXY
É uma variável de ambiente comumente usada para configurar agentes de saída
Esta falha permite ataques remotos. Se você estiver executando um programa PHP ou CGI, deverá bloquear o cabeçalho do Proxy imediatamente! imediatamente! Veja abaixo instruções específicas. httpoxy é uma vulnerabilidade de aplicativo da web do lado do servidor. Se você não implantar esse código no lado do servidor, não precisa se preocupar.
O que acontece se meu aplicativo web tiver essa vulnerabilidade?
Quando um cliente HTTP que explora esta vulnerabilidade faz uma solicitação, ele pode:
- Solicitações de proxy para outros URLs por meio de seu aplicativo da web
- Peça diretamente ao seu servidor para abrir o endereço remoto e a porta especificados
- Desperdice recursos do servidor e acesse recursos especificados para invasores
A vulnerabilidade httpoxy é muito fácil de explorar. Esperamos que o pessoal de segurança verifique esta vulnerabilidade o mais rápido possível e a corrija rapidamente.
Quais são afetados?
Vulnerabilidades de segurança podem existir nas seguintes situações:
- O código é executado em um contexto CGI, que
HTTP_PROXY
se torna uma variável de ambiente real ou simulada - Um cliente HTTP confiável
HTTP_PROXY
que suporta funcionalidade de proxy - O cliente iniciará uma solicitação HTTP (ou HTTPS) dentro da solicitação
As seguintes situações são ambientes onde esta falha foi encontrada:
linguagem | ambiente | Cliente HTTP |
---|---|---|
PHP | php-fpm mod_php | Beba 4+ Artax |
Pitão | wsgiref.handlers.CGIHandler twisted.web.twcgi.CGIScript | solicitações de |
Ir | net/http/cgi | rede/http |
Certamente existem muitas linguagens e ambientes que não identificamos quanto a defeitos.
PHP
- A existência da falha depende do código do seu aplicativo e da biblioteca PHP, mas o impacto parece ser muito difundido
- Desde que uma biblioteca com esta falha seja utilizada no processo de processamento de solicitações de usuários, ela poderá ser explorada
- Se você usa uma biblioteca com esta falha, a falha afeta qualquer versão do PHP
- Pode até afetar ambientes de execução PHP alternativos, como HHVM implantado no modo FastCGI
- Está confirmado que bibliotecas como Guzzle e Artax foram afetadas, e pode haver muitas mais bibliotecas que também foram afetadas.
- Guzzle 4.0.0rc2 e versões posteriores são afetadas, Guzzle 3 e versões inferiores não são afetadas
- Outros exemplos incluem a classe de utilitário StreamContextBuilder do Composer
Por exemplo, se você usar o módulo Guzzle 6 no Drupal para iniciar solicitações de saída (como solicitar uma API meteorológica), as solicitações iniciadas pelo módulo terão essa falha httpoxy.
Pitão
- O código Python só apresenta defeito quando implantado no modo CGI. De modo geral, o código defeituoso usa
wsgiref.handlers.CGIHandler
um controlador CGI como.- Os aplicativos da web Python implantados da maneira normal não são afetados (a maioria das pessoas usa WSGI ou FastCGI, esses dois não são afetados), portanto, há muito menos aplicativos Python afetados do que PHP
- wsgi não é afetado porque os.environ não está contaminado por dados CGI
- A biblioteca de solicitações defeituosas deve ser confiável e usada
os.environ['HTTP_PROXY']
e não faz verificação de conteúdo
Ir
- O código Go deve ser implantado em CGI para ser afetado. O código geralmente afetado usará
net/http/cgi
o pacote- Assim como o Python, esta não é a maneira usual de implantar o Go como um aplicativo da web. Portanto, há muito poucos casos de serem afetados
- Em comparação, o pacote Go
net/http/fcgi
não define variáveis de ambiente reais, portanto não é afetado
- A versão defeituosa
net/http
precisa ser confiável e usada em solicitações de saídaHTTP_PROXY
, sem verificação de conteúdo
Corrija agora
Proxy
A melhor solução é bloquear os cabeçalhos de solicitação antes que eles ataquem seu aplicativo . É fácil e seguro.
- Diz-se que é seguro porque
Proxy
o cabeçalho da solicitação não é definido pela IETF e não está listado no registro de cabeçalho de mensagem da IANA . Isso indica que o uso deste cabeçalho não é padrão e nem mesmo é usado ad hoc - Clientes e servidores HTTP em conformidade com os padrões nunca devem ler ou enviar este cabeçalho
- Você pode remover esse cabeçalho da solicitação ou bloquear solicitações usando-o inteiramente.
- Você pode consertar isso sozinho se o upstream não lançar um patch
- Verificar as solicitações HTTP à medida que elas chegam pode corrigir muitos aplicativos defeituosos de uma só vez
- A seleção de aplicativos por trás de proxies reversos e firewalls de aplicativos
Proxy
Os cabeçalhos de solicitação são seguros
Como bloquear Proxy
cabeçalhos de solicitação depende da sua configuração. A maneira mais fácil é bloquear esse cabeçalho no firewall do seu aplicativo web ou diretamente no Apache e Nginx. Aqui estão algumas dicas sobre como fazer isso:
Nginx/FastCGI
Use a seguinte instrução para bloquear os cabeçalhos de solicitação passados para PHP-FPM e PHP-PM. Esta instrução pode ser colocada em fastcgi.conf ou fastcgi_param (dependendo de qual arquivo de configuração você usa):
fastcgi_param HTTP_PROXY "";
O PHP apresenta defeito no modo FastCGI (mas a maioria das outras linguagens que usam Nginx FastCGI não são afetadas).
Apache
Para saber a extensão específica do impacto no Apache, bem como em outros projetos de software Apache, como o Tomcat, é recomendável consultar o anúncio oficial da Apache Software Foundation . Aqui estão algumas mensagens principais:
Se você usar o servidor Apache HTTP mod_cgi
para executar scripts escritos em Go ou Python, eles serão afetados (onde HTTP_PROXY
as variáveis de ambiente são "reais"). Por mod_php
ser usado em scripts PHP, essa falha também existe.
Se você usar o módulo mod_headers , poderá cancelar a definição Proxy
dos cabeçalhos da solicitação antes de processar a solicitação com a seguinte configuração:
RequestHeader unset Proxy early
Se você usar o módulo mod_security , poderá usar uma SecRule
regra para negar Proxy
solicitações com cabeçalhos de solicitação. Aqui está um exemplo, certifique-se de SecRuleEngine
que esteja ativado. Você pode ajustá-lo de acordo com sua situação.
SecRule &REQUEST_HEADERS:Proxy "@gt 0" "id:1000005,log,deny,msg:'httpoxy denied'"
Finalmente, se você usar o Apache Traffic Server, ele não será afetado. No entanto, você pode usá-lo para remover o cabeçalho da solicitação de proxy para proteger outros serviços por trás dele. Consulte as orientações da ASF para obter detalhes .
HAProxy
Remova o cabeçalho da solicitação por meio da seguinte configuração:
http-request del-header Proxy
Verniz
Para cancelar este cabeçalho, coloque-o na seção vcl_recv existente:
sub vcl_recv {
[...]
unset req.http.proxy;
[...]
}
OpenBSD retransmitido
Use a instrução a seguir para remover esse cabeçalho. Coloque-o dentro de um filtro existente:
http protocol httpfilter {
match request header remove "Proxy"
}
lighttpd (<= 1.4.40)
Retorna Proxy
solicitações contendo cabeçalhos.
- Crie um
/path/to/deny-proxy.lua
arquivo e torne-o somente leitura para lighttpd com o seguinte conteúdo:
if (lighty.request["Proxy"] == nil) then return 0 else return 403 end
- Modifique
lighttpd.conf
para carregarmod_magnet
o módulo e execute o código lua acima:
server.modules += ( "mod_magnet" )
magnet.attract-raw-url-to = ( "/path/to/deny-proxy.lua" )
lighttpd2 (em desenvolvimento)
Proxy
Retire os cabeçalhos das solicitações . Adicione a seguinte declaração a lighttpd.conf
ele:
req_header.remove "Proxy";
A correção do PHP do lado do cliente não tem efeito
Não há soluções do lado do usuário para resolver a falha, então não se preocupe:
- Usar
unset($_SERVER['HTTP_PROXY'])
não afetarágetenv()
o valor retornado, portanto é inútil - O uso
putenv('HTTP_PROXY=')
não tem efeito (putenv só pode afetar valores de variáveis de ambiente reais, não de cabeçalhos de solicitação)
História do httpoxy
A vulnerabilidade foi descoberta pela primeira vez há 15 anos.
Em março de 2001, Randal L. Schwartz descobriu esse defeito no libwww-perl e o corrigiu.
Em abril de 2001, Cris Bailiff descobriu essa falha no curl e a corrigiu.
A falha foi descoberta por Akira Tanaka da equipe Ruby em julho de 2012 na implementação Net::HTTP
doHTTP_PROXY
A falha foi mencionada na lista de discussão nginx em novembro de 2013. O descobridor Jonathan Matthews não tinha tanta certeza, mas descobriu que estava certo.
Stefan Fritsch mencionou isso em fevereiro de 2015 na lista de discussão Apache httpd-dev.
A falha foi descoberta por Scott Geary, da equipe de segurança da Vend, em julho de 2016 e afeta muitas linguagens de programação e bibliotecas modernas, como PHP.
Portanto, essa falha está adormecida há muitos anos, e muitas pessoas descobriram sua existência em diversos aspectos, mas não consideraram seu impacto em outras linguagens e bibliotecas. Os pesquisadores de segurança criaram um site especificamente para esse fim: https://httpoxy.org/ onde você pode saber mais.
Os recursos piratas de "Celebrating More Than Years 2" foram carregados no npm, fazendo com que o npmmirror tivesse que suspender o serviço unpkg da Microsoft na China fez as malas coletivamente e foi para os Estados Unidos, envolvendo centenas de pessoas . biblioteca de visualização front-end e o conhecido projeto de código aberto ECharts do Baidu - "indo para o mar" para apoiar os golpistas de peixes usaram o TeamViewer para transferir 3,98 milhões! O que os fornecedores de desktop remoto devem fazer? Zhou Hongyi: Não resta muito tempo para o Google. Recomenda-se que todos os produtos sejam de código aberto. Um ex-funcionário de uma conhecida empresa de código aberto deu a notícia: Após ser desafiado por seus subordinados, o líder técnico ficou furioso e. demitiu a funcionária grávida. O Google mostrou como executar o ChromeOS em uma máquina virtual Android. Por favor, me dê alguns conselhos: qual é o papel do time.sleep(6) aqui? A Microsoft responde aos rumores de que a equipe de IA da China está "fazendo as malas para os Estados Unidos" Comentários do People's Daily Online sobre a cobrança semelhante a matryoshka do software de escritório: Somente resolvendo ativamente "conjuntos" podemos ter um futuro