Como convencer meu administrador de que o Java ON A SERVER não é inseguro por si só?

13

A aplicação

Temos um pequeno aplicativo Java que usa algumas rotas do Camel para coletar arquivos enviados de um servidor da web, processá-los e enviar alguns e-mails com os resultados.

O servidor no qual este aplicativo estava sendo executado foi descomissionado. Por enquanto, temos que executá-lo em hardware com pouca potência, porque não consigo convencer o administrador a instalar um JRE no servidor da web (que na verdade é um servidor multiuso).

O medo

Sou engenheiro de aplicativos Java, escrevo código JEE para viver, lidando com transações B2B no valor de dezenas de milhares de euros por semana. Mas tenho problemas para encontrar fontes confiáveis ​​que refutam o mito de que o java é inseguro em si.

Os dois principais argumentos do administrador contra a instalação de um JRE:

  1. Aplicativos Java consomem toda a minha RAM
  2. Java está cheio de vulnerabilidades

A verdade?

Quando se trata de aplicativos java que comem ram. Bem ... eu diria que temos que definir valores adequados para Xmx. Feito.

Agora, existem muitas fontes falando sobre as muitas vulnerabilidades do Java. Essas fontes visam principalmente usuários finais executando um determinado sistema operacional de uma empresa em Redmond / EUA. AFAIK, pode ser verdade nas versões sem patch do Java Browser Plugin, que está configurado para executar todos os miniaplicativos automaticamente, que há grandes chances de ser vítima de uma unidade por infecção. Assim como existe o risco de contrair uma DST ao fazer sexo desprotegido com o eveyone no trem enquanto se desloca para o trabalho.

Mas não consegui encontrar ninguém na interwebz mundial que fale sobre aplicativos de servidor ou JREs rodando sem cabeça. Isso é outra coisa.

Ou estou faltando alguma coisa aqui?

[editar 28/08/2014] esclarecimento: Estou preocupado apenas com Java nos servidores. Não me importo com problemas com o Java Plugin e / ou software específico desenvolvido em java.

lajuette
fonte
7
Se o hardware em que está ligado é comprovadamente pouco potente e causa problemas, ao lado das preocupações da SA, certamente você tem um argumento comercial para obter novo hardware.
user9517
4
Convença-o de que não é o código da sua empresa que ele acabou de ver no thedailywtf.com.
Michael Hampton
9
O Java teve um ano difícil em 2013. Havia até um site acompanhando as explorações de 0 dia enquanto elas continuavam sendo implementadas. Desde meados do ano passado, não houve explorações de 0 dias, mas os pesquisadores ainda encontraram 107 CVEs Java apenas este ano. Isso está muito longe de "seguro".
Chris S
5
Posso acionar um bug da JVM alimentando dados maliciosos no seu aplicativo? É melhor você acreditar. E alguns desses CVEs estão relacionados à execução de Java em servidores, e não ao plug-in do navegador de desktop comum do Windows.
Michael Hampton
3
@lajuette Forneci um link com o número 107 por um motivo - se você clicasse em todas as perguntas que acabou de fazer, teriam sido respondidas. Alguns desses 107 estão relacionados a implementações que não são da Oracle, como o Dalvak do Android, mas a grande maioria está relacionada à implementação da Oracle. Java não é inerentemente inseguro, mas o JRE da Sun / Oracle está cheio de problemas. PHP, Perl, Ruby também têm vulnerabilidades - nenhuma delas é perfeita. Eu não poderia dizer se o Java é melhor ou pior do que o atualmente, mas no ano passado definitivamente foi o garoto que chicoteia o setor de segurança.
Chris S

Respostas:

18

A superfície de segurança adicional que o java coloca no seu ambiente é complexa e é importante não ignorá-lo ou tentar simplificá-lo.

Em primeiro lugar, há o registro horrível que o JRE possui por ter bugs de segurança. É difícil apontar uma específica, e essa é a parte mais assustadora - os bugs são vulnerabilidades predominantemente não especificadas com vetores não especificados.

Quando eu, como consultor de segurança, leio cláusulas como "permite um atacante remoto" sem qualificação adicional quanto ao seu significado, vejo que isso pode muito bem significar que determinados parâmetros que entram em uma determinada função podem invocar a condição vulnerável, mesmo se você estão executando apenas o código que você escreveu. E, como não são especificados, você não sabe se foi afetado.

Melhor ainda, o JRE canônico publicado pela Oracle possui um ciclo de atualização trimestral declarado para atualizações críticas, incluindo quase todas as atualizações de segurança. Eles criaram patches fora do ciclo um total geral de 11 vezes nos últimos quatro anos. Isso significa que existe a possibilidade de você estar vulnerável a um bug de segurança até três meses depois que ele é relatado antes de ter alguma maneira de corrigi-lo.

Há outros problemas com o java que não abordarei aqui, mas realmente parece que há uma preocupação justificável, especialmente para um servidor multiuso. Se você precisar executar essas coisas, você deve pelo menos criar uma VM de propósito único e isolá-la de outras coisas.

Em particular, se houver um controle remoto no JRE que permita que um invasor obtenha o RCE, outro no PHP que faça o mesmo e outro no Ruby que faça o mesmo novamente, será necessário corrigir os três. Todos os três parecem um pouco prováveis, como essas coisas acontecem, e o invasor escolhe o que for mais conveniente e depois é dono de todo o servidor. É por isso que devemos usar VMs para separar software, especialmente softwares de buggy, como estruturas de linguagem gerenciada, e especialmente aquelas que agrupam patches de segurança apenas quatro vezes por ano e são de propriedade de um fornecedor que afirma diante de todas as evidências de que eles são um exemplo de segurança.

Para atualizar, aqui estão alguns CVEs que selecionei na pesquisa CVE vinculada do ChrisS, a título de demonstração.

E o meu favorito, desde que eu estava lá:

A propósito, isso é apenas uma pequena amostra.

Falcon Momot
fonte
6

Aplicativos Java consomem toda a minha RAM

A alternativa ao uso da RAM é desperdiçar RAM. Você não pode salvá-lo para mais tarde.

Java está cheio de vulnerabilidades

Isso realmente não importa, porque você não vai expor a JVM ao mundo. Presumo que você não executará nenhum programa hostil e, se estiver, o Java é mais seguro do que a maioria das outras linguagens. O que importa é se seus aplicativos têm vulnerabilidades.

David Schwartz
fonte
3
Ok, então a razão não funciona. Que outras ferramentas estão na sua caixa de ferramentas de persuasão? Você tem um alicate enferrujado?
David Schwartz
1
@FalconMomot Sim, o kernel pode usá-lo para armazenar arquivos em cache. O kernel pode tirar a memória da JVM se tiver uma melhor utilização. É assim que praticamente todos os sistemas operacionais modernos funcionam. A alternativa ao uso da RAM é desperdiçar RAM. O sistema operacional possui um gerenciador de memória especificamente para garantir que a RAM atenda ao melhor objetivo. Argumentos como "Os aplicativos Java consomem toda a minha RAM" quase sempre indicam um administrador que não entende como os sistemas operacionais modernos usam a RAM.
David Schwartz
1
Se a JVM não liberar a memória, ela deverá ser trocada pelo espaço de troca (se houver) para fazer isso, o que é lento. O kernel não pode chamar o coletor de lixo. Além disso, o armazenamento em cache de arquivos normalmente tem prioridade mais baixa do que as alocações de espaço do usuário, mesmo que raramente sejam utilizadas (tanto quanto o kernel pode dizer que elas raramente são utilizadas, o que não é muito bom).
Falcon Momot
3
Quero saber mais sobre como o Linux pode usar simultaneamente um bloco de RAM para cache enquanto um processo ainda pensa que é o proprietário. Eu nunca ouvi isso antes.
Michael Hampton
1
@FalconMomot O kernel não precisa saber que a RAM é "livre". O kernel sempre tem controle sobre o uso da RAM, a menos que o aplicativo bloqueie as páginas. Ele só precisa tornar as páginas mapeadas descartáveis ​​para recuperar a RAM. Se os dados não forem modificados e não forem utilizados por um período de tempo, e a largura de banda de E / S não estiver saturada, eles poderão gravá-los oportunamente para trocar, tornando as páginas descartáveis, permitindo recuperar a RAM assim que tiver um uso melhor. por isso. (Este espaço não é grande o suficiente para explicar como moderno de gerenciamento de memória obras, mas parece que você tem alguns equívocos muito comuns.)
David Schwartz
2

Contrate uma empresa para fazer análises estáticas no seu programa. A Veracode, por exemplo, é uma empresa que eu usei no passado para auditar a segurança do código de programas Java, especificamente.

Fature o código de cobrança da sua equipe de administradores, obviamente.

mfinni
fonte
1

Explique que todas as outras linguagens (ou máquinas virtuais) podem se tornar inseguras pelo código implantado nelas, assim como no Java. Se ele acha que as outras plataformas são inerentemente seguras (ou mais seguras que Java) sem abordar corretamente a segurança, ele é ilusório.

Sua empresa obviamente investiu na contratação de um desenvolvedor Java, por que o administrador de sistemas se recusa a oferecer suporte a uma tecnologia que a empresa decidiu usar?

Eu faria a pergunta e perguntaria a ele quais alternativas ele propõe e como elas são mais seguras do que o Server JRE mais recente disponível, em termos muito específicos. Enquanto isso, trabalhe para mostrar que você entende sua tecnologia, a possível superfície de ataque e que você trabalhou para minimizá-la (por exemplo, estruturas desnecessárias, código de terceiros etc.). Verifique seu código, procure vulnerabilidades publicadas para as estruturas nas quais você confia nos últimos X anos, compare-o com outras linguagens / estruturas (certifique-se de incluir também participação no mercado, estruturas obscuras sem vulnerabilidades publicadas não significam nada).

Não podemos saber como aconteceu toda a conversão entre vocês dois, mas se esses foram os dois argumentos dele, acredito que você esteja lidando com um administrador de sistemas júnior. Ele tem experiência com servidores de aplicativos Java? Talvez ele esteja desconfortável com a tecnologia e com medo de colocar algo em produção sem entendê-la completamente (boa atitude do administrador de sistemas).

Giovanni Tirloni
fonte
Obrigado. Nós não estamos falando de uma empresa. Em vez de uma associação sem fins lucrativos. O sysadmin possui um médico em TI e marketing, mas não é um administrador de sistemas "real". E sim: acredito que ele tem medo de Java, o que não entende completamente.
precisa saber é o seguinte