it-swarm-pt.tech

Por que ouço tantas inseguranças Java? Outras línguas são mais seguras?

Eu realmente gosto da linguagem de programação Java, mas ouço continuamente como ela é insegura. A pesquisa de 'Java inseguro' ou 'Vulnerabilidades Java' no Google traz vários artigos falando sobre o motivo pelo qual você deve desinstalar ou desativar Java para proteger seu computador. Java geralmente libera um grande número de patches de segurança de cada vez, e ainda há toneladas de vulnerabilidades ainda por corrigir.

Entendo que sempre haverá erros no software, mas a quantidade de vulnerabilidades que Java teve não parece normal (ou estou imaginando isso?). O que é ainda mais confuso é que, se houver uma única decisão arquitetural que está criando essas vulnerabilidades, por que não mudar esse design? Existem muitas outras linguagens de programação que não apresentam esse problema, portanto, deve haver uma maneira melhor de fazer o que Java está fazendo de errado. Então, por que Java ainda é tão inseguro?

104
gsingh2011

Se você usar Java como a maioria das outras linguagens de programação, por exemplo, para escrever aplicativos independentes, ele não será menos seguro que outras linguagens e mais seguro que C ou C++, pois não há excesso de buffer etc.).

Mas Java é usado regularmente como um plug-in dentro do navegador da Web, por exemplo, semelhante ao Flash. Como nesse caso o usuário executa um código não confiável sem o ter instalado explicitamente, a idéia é executar o código dentro de uma caixa de proteção limitada, onde não deve ser capaz de agir de alguma forma contra o sistema ou o usuário (por exemplo, leia os arquivos locais e envie-os para o site, verifique a rede local, etc.) E é aqui que Java falhou nos últimos anos, por exemplo, novos bugs surgiam às vezes diariamente, o que permitia escapar da caixa de areia.

Além disso, às vezes os erros no interpretador de código de bytes ou nas bibliotecas nativas levam a estouros de buffer e podem comprometer o sistema, mas, a esse respeito, o Flash geralmente é considerado pior.

E quanto às outras linguagens serem melhores: elas geralmente nem podem ser executadas como código não confiável dentro de uma sandbox (a exceção é JavaScript e talvez Flash), então elas seriam ainda piores porque não há uma maneira inerente de limitar sua interação com o sistema .

120
Steffen Ullrich

As vulnerabilidades de segurança relatadas não são sobre Java (a linguagem de programação), que, em virtude da aplicação da JVM segurança da memória , é realmente mais robusta do que linguagens como C ou C++, onde estouros de buffer e leituras de buffer permanecem uma ameaça e podem resultar em bagunças como o Heartbleed.

Em vez disso, as vulnerabilidades relatadas estão na Sandbox Java, que tenta impor um modelo de privilégio que permite a execução segura de código não confiável) e é famosa por ser usada para permitir a execução automática de Java Applets em um navegador. Essa sandbox está cheia de buracos. Além disso, a Oracle libera patches (as "atualizações críticas de patches") apenas 4 vezes por ano. Não é preciso dizer que os fornecedores de navegadores não estão felizes com isso. Firefox , por exemplo, é requer autorização do usuário para iniciar um Java Applet desde o Firefox 26.

A razão pela qual os relatórios da imprensa não fazem essa distinção é que o Oracle usa a marca "Java" tanto para a linguagem de programação quanto o plug-in do navegador que executa applets . De fato, se um usuário comum encontrar a marca registrada Java, provavelmente ela se refere a ela).

É um pouco especulativo por que exatamente o Sandbox permanece vulnerável. Se você me perguntar, um motivo é que a mesma API é usada com e sem o Sandbox, e a maioria Java é executado sem o Sandbox (porque o código é confiável). Como resultado, é bem possível que um desenvolvedor esqueça esse recurso obscuro ao alterar a API Java ou sua implementação, expondo acidentalmente coisas que devem ser protegidas (para ilustrar como isso é fácil, veja o longo - Diretrizes de codificação segura para Java SE ). Outro motivo, porém relacionado, é o tamanho da API Java API ( 5800 classes e quase 50.000 métodos para Java SE 6 ).

81
meriton

Existem muitas outras linguagens de programação que não apresentam esse problema, portanto, deve haver uma maneira melhor de fazer o que quer Java está fazendo errado.

Essa é uma reivindicação bastante alta. De onde você tirou essa impressão? Existem "muitas outras linguagens de programação" que não foram submetidas aos mesmos ritmos do Java ou que são usadas onipresentemente.

Em princípio, a razão pela qual existem tantos patches de segurança é porque o Java foi projetado para ser seguro, com vários recursos focados na segurança que outras linguagens não possuem).

O Java Language Environment

1.2.2 Robusto e seguro

A tecnologia Java foi projetada para operar em ambientes distribuídos, o que significa que a segurança é de suma importância. Com os recursos de segurança projetados no sistema de linguagem e tempo de execução, a tecnologia Java permite construir aplicativos que não podem ser invadidos de fora. No ambiente de rede, aplicativos escritos na Java está protegida contra invasões por código não autorizado, tentando entrar nos bastidores e criar vírus ou invadir sistemas de arquivos.

Se você não incluir "seja seguro" nas especificações da sua linguagem de programação, raramente precisará liberar patches de segurança. Se, por outro lado, esse é um dos seus objetivos declarados, você será pressionado com força não para.

11
dimo414

Por si só, o Java possui grandes ativos de segurança, ou seja, sua resistência inerente a estouros de buffer e erros de gerenciamento de memória:

  • Todos os acessos à matriz são verificados em relação ao comprimento da matriz alocada. Portanto, os estouros de buffer são interceptados de maneira confiável e acionam uma exceção, o que é melhor (isso transforma as vulnerabilidades de execução remota de código em mera negação de serviço).

  • A alocação de memória é gerenciada por meio de um coletor de lixo, o que evita erros de uso após liberação e liberação dupla. Além disso, o GC permite um manuseio mais fácil das cadeias de caracteres (as cadeias de caracteres são imutáveis ​​em Java), o que remove a maioria das ocasiões de bugs no buffer overflow.

  • A digitação estrita é aplicada; código não pode acessar bytes de dados para o que eles não são. Isso novamente evita vulnerabilidades (os erros nos quais os tipos de dados são transgredidos serão relatados na compilação ou, na pior das hipóteses, como um tempo de execução ClassCastException).

Isso torna Java muito mais forte do que muitas linguagens de programação (em particular o casal infernal C/C++) quando se trata de segurança.

No entanto, os designers do Java tentaram aproveitar essa segurança aprimorada para dificultar algo, como applets . O problema é a superfície de ataque : como o applet é um código potencialmente hostil, tudo o que faz deve ser controlado, mas o código hostil deve poder usar o "padrão Java classes" se é fazer qualquer coisa, para que "pontos de controle" sejam aplicados a cada padrão Java. A superfície de ataque consiste em centenas de classes contendo milhares de métodos e tudo deles devem aplicar verificações adequadas.

Os designers do Java pecaram pela ambição: a dificuldade de implementar milhares de verificações sem danificá-las) era muito maior do que eles imaginavam. Todos os "bugs do Java" vêm desse fato.

Podemos comparar Java com Javascript aqui; por exemplo, Java permite o acesso a arquivos em discos, mas esse direito não deve ser concedido aos applets, exceto se o o applet solicitou o pedido e o usuário concorda (o que implica todo o negócio de assinatura de applets) Javascript, menos ambicioso, simplesmente não possui nenhum método de acesso a arquivos: os controles de acesso em uma função não podem ser implementados incorretamente se a função realmente não existir!

Para resumir: Java é bom e seguro. Java applets implica uma enorme superfície de ataque cuja segurança é muito difícil de garantir.Para aplicativos e servidores independentes, porém, usar Java é uma boa idéia se você deseja segurança ( isso se aplica igualmente ao c #).

10
Thomas Pornin

Atualmente, encontrar mais vulnerabilidades pode não implicar a insegurança do software. O problema é como a equipe de resposta de segurança de cada fornecedor de software reage a ele e a rapidez com que os patches são lançados.

Basta verificar a rapidez com que o Firefox e o Chrome são corrigidos. Muitas vulnerabilidades também são encontradas e resolvidas).

Pelo que me lembro, a Oracle tem um programa chamado Critical Patch Updates (CPU), que fornece muitos patches trimestralmente. Eles também lançam patches sem CPU se houver vulnerabilidade de dia zero por aí. Mas o problema é o tempo que a Oracle leva para lançar um patch.

4
Kasun

Medo superestimado .. Java em si é bom; os problemas ocorrem com os Java-Applets da velha escola em execução nos navegadores da web, mas duvido que alguém realmente crie Applets mais - a maioria das casas de desenvolvimento usaram Flash ou HTML4/5 para interfaces da web front-end nos últimos 10 anos.

Hoje em dia Java é usado principalmente para JEE back-end, clientes GUI de front-end (JFX/AWT/SWING), aplicativos de console e aplicativos móveis - portanto, não há problema.

2
John