Pergunta

O Java tem buffer overflows? Se sim, você pode me dar cenários?

Foi útil?

Solução

Desde Java Cordas são baseadas em matrizes de caracteres e Java verifica automaticamente limites de matriz, buffer overflows só são possíveis em cenários incomuns:

  1. Se você chamar código nativo via JNI
  2. Na própria JVM (geralmente escrito em C ++)
  3. O intérprete ou compilador JIT não funciona corretamente (bytecode Java mandato cheques Bounds)

Outras dicas

idiomas gerenciados tais como Java e C # não têm estes problemas, mas as máquinas virtuais específicas (JVM / CLR / etc) que realmente executar o código pode.

Para todos os efeitos, não.

Java tem variedade verificação de limites que irá verificar que os dados não podem ser acessados ??de fora da área do matriz alocada. Quando se tenta área de acesso que está além do tamanho da matriz, um ArrayOutOfBounds exceção será lançada.

Se houver um tampão-superação, é provavelmente de um erro no Java Virtual Machine, e é, a meu conhecimento, não o comportamento desejado que está escrito nas Especificações Java idioma nem os Java Virtual Machine Especificações.

Um tampão de transbordo, no sentido estrito de substituir a pilha ou amontoado si exigiria, quer:

  1. Um bug no quadro (estes têm existido no passado e pode muito bem de novo)
  2. O uso de JNI (essencialmente não usando código gerenciado)

Um buffer overflow no sentido de que você tem o código usando um buffer e seu código é responsável por analisá-lo corretamente, mas não conseguem fazê-lo é possível. Por exemplo, você pode escrever um parser XML e alguém poderia fornecê-lo com um pedido mal formado (ou legítimo, mas raro) que, devido ao design de suas substituições analisador de dados com alguma carga previamente validados que faria com que a sua aplicação a se comportar mal.

Esta última forma é menos provável, mas uma função de limpeza cadeia SQL mal escrito amplamente distribuída que teve um problema como este seria um alvo convidativo.

Sim e não. Não, em que você não pode realmente criar equivocadamente abrir-se a uma vulnerabilidade de buffer overflow porque é um modelo de memória gerenciado. No entanto, pode haver buffer overflow vulnerabilidades no JVM e JDK. Veja este comunicado Secunia:

http://secunia.com/advisories/25295

Ou ver esses velhos avisos sobre várias vulnerabilidades JDK e JRE anteriores:

  • Integer e Buffer Overflow Vulnerabilities no Java Runtime Environment (JRE) "unpack200" JAR chumbo Desembalagem Utility maio a escalada de privilégios https://download.oracle.com/sunalerts/1020225.1.html

    Integer e buffer vulnerabilidades de estouro no Java Runtime Environment (JRE) com applets desembalar e Java Web Start aplicações utilizando o utilitário de desembalar JAR "unpack200" pode permitir que um miniaplicativo não confiável ou aplicação de privilégios escalar. Por exemplo, um applet não confiável pode conceder a si mesmo permissão para ler e escrever arquivos locais ou executar aplicações locais que são acessíveis ao usuário que executa o applet não confiável.

    A Sun reconhece com gratidão "regenrecht" trabalhar com a iDefense VCP ( http://labs.idefense.com/vcp/ ) e Chris Evans do Google para trazendo estas questões à nossa atenção.

  • Múltiplas vulnerabilidades foram identificadas no Sun Java Development Kit (JDK) eo Java Runtime Environment (JRE). https://security.gentoo.org/glsa/200705-23

    Uma vulnerabilidade não especificado envolvendo um "uso incorreto do sistema aulas" foi relatado pela equipe de segurança Fujitsu. Além disso, Chris Evans da Google Security Team relataram um estouro de inteiro resultando em uma sobrecarga da memória intermédia no analisador ICC utilizado com JPG ou BMP arquivos, e uma chamada incorreta open () para / dev / tty quando o processamento arquivos certa BMP.

Java (e .Net) máquinas virtuais de código catch que tenta escrever fora da memória reservada. Os aplicativos que não lidar com isso corretamente pode ainda causar problemas de segurança. Se usuários mal-intencionados podem acionar exceções inserindo entrada inválida eles podem fazer ataques de negação de serviço, por exemplo.

Como já foi apontado, Java tem, como língua, verificação de limites em todo o acesso de memória, e se há um erro aqui, a JVM é a culpa e não o programa. No entanto, o que deve ser observado, que é um argumento semelhante para vazamentos de memória em Java; enquanto não é possível para esmagar a pilha, um ArrayOutOfBoundsException no lugar errado, o que não é tratado corretamente, pode ainda acabar estragar seu sistema.

É possível para um método de escrever em entradas válidas de uma matriz que não tinha a intenção de, normalmente através de estouro de inteiro.

Por exemplo, o seguinte não é suficiente para verificar limites:

/* !! WRONG !! */ 0 <= off && 0 <= len && off+len <= buff.length /* !! WRONG !! */

IIRC, StringBuffer já teve um erro como esse, mas não havia nada de interessante que você poderia fazer com ele.

Você pode conseguir causar um buffer overflow em um programa Java se você estivesse usando o recurso Java Native interace (JNI) para invocar o código externo, e o código externo teve um problema explorável. Isto é bastante incomum, pois a maioria das aplicações de evitar o uso de JNI, sempre que possível.

Uma das principais características do JAVA é a segurança. Programas escritos em linguagens interpretadas não são propensos ao buffer overflow explorar, mas você sempre pode causar um buffer overflow no próprio intérprete. Embora seja difícil. Da mesma forma Python também é uma linguagem interpretada e é seguro contra estouro de buffer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top