Java tem buffer overflows? Se sim, você pode me dar cenários?
java
buffer-overflow
buffer-overrun
ecleela
fonte
fonte
Respostas:
Como as Java Strings são baseadas em matrizes de char e o Java verifica automaticamente os limites da matriz, estouros de buffer só são possíveis em cenários incomuns:
fonte
Linguagens gerenciadas como Java e C # não têm esses problemas, mas as máquinas virtuais específicas (JVM / CLR / etc) que realmente executam o código podem.
fonte
Para todos os efeitos e propósitos, não.
Java tem verificação de limites de array, que verifica se os dados não podem ser acessados de uma área fora do array alocado. Quando alguém tenta acessar uma área que está além do tamanho do array, uma
ArrayOutOfBounds
exceção será lançada.Se houver uma saturação de buffer, provavelmente é devido a um bug na Java Virtual Machine e, até onde sei, não é o comportamento pretendido que está escrito nas Especificações da linguagem Java nem nas especificações da Java Virtual Machine.
fonte
Sim e não. Não, porque você realmente não pode criar, por engano, abrir-se para uma vulnerabilidade de estouro de buffer porque é um modelo de memória gerenciada. No entanto, pode haver vulnerabilidades de estouro de buffer na JVM e JDK. Veja este comunicado da Secunia:
http://secunia.com/advisories/25295
Ou veja estes avisos antigos sobre várias vulnerabilidades JDK e JRE anteriores:
Vulnerabilidades de estouro de buffer e inteiros no Java Runtime Environment (JRE) "unpack200" O utilitário de descompactação JAR pode levar ao aumento de privilégios https://download.oracle.com/sunalerts/1020225.1.html
Várias vulnerabilidades foram identificadas no Sun Java Development Kit (JDK) e Java Runtime Environment (JRE). https://security.gentoo.org/glsa/200705-23
fonte
Um estouro de buffer, no sentido estrito de sobrescrever a pilha ou o próprio heap, exigiria:
Um estouro de buffer no sentido de que você tem código usando um buffer e seu código é responsável por analisá-lo corretamente, mas é possível deixar de fazê-lo. Por exemplo, você pode escrever um analisador XML e alguém pode fornecer a você uma solicitação malformada (ou legítima, mas incomum) que, devido ao design do seu analisador, substitui os dados previamente validados por alguma carga útil que faria com que seu aplicativo se comportasse mal.
Esta última forma é menos provável, mas uma função de limpeza de string sql mal escrita e amplamente distribuída que tivesse um problema como este seria um alvo convidativo.
fonte
As máquinas virtuais Java (e .Net) capturam o código que tenta gravar fora da memória reservada. Aplicativos que não lidam com isso corretamente ainda podem causar problemas de segurança. Se usuários mal-intencionados podem acionar exceções inserindo entradas inválidas, eles podem fazer ataques de negação de serviço, por exemplo.
fonte
Como já foi apontado, o Java tem, como linguagem, a verificação de limites em todos os acessos à memória e, se houver um erro aqui, a falha é do JVM e não do programa. No entanto, o que deve ser observado, que é um argumento semelhante para vazamentos de memória em Java; embora não seja possível destruir a pilha, uma ArrayOutOfBoundsException no lugar errado, que não é tratada corretamente, pode acabar bagunçando o seu sistema.
fonte
É possível que você cause um estouro de buffer em um programa Java se estiver usando o recurso Java Native Interace (JNI) para chamar código externo e o código externo tiver um problema de exploração. Isso é bastante incomum, pois a maioria dos aplicativos evita o uso de JNI sempre que possível.
fonte
É possível para um método gravar em entradas válidas de uma matriz que ele não pretendia, normalmente por meio de estouro de inteiro.
Por exemplo, o seguinte não é suficiente para verificar os limites:
O IIRC
StringBuffer
já teve um bug assim, mas não havia nada de interessante que você pudesse fazer com ele.fonte
0 <= off && 0 <= len && off <= buff.length-len
eu acho. Não me cite. Parece o mesmo, mas não há estouro possível (no original off + len pode ficar negativo e, portanto, obviamente menor que o comprimento do array). Certifique-se de que nenhum programador de manutenção o "arrume" da forma óbvia. Acho o estouro de inteiro extremamente confuso. Tenho que pensar um pouco, e então surge a suspeita incômoda de que entendi errado. Mas é claro que deveria haver outro revisor e o programador original - juntos, é claro, não há como um erro passar! (não)Um dos principais recursos do JAVA é a segurança. Os programas escritos em linguagens interpretadas não estão sujeitos à exploração de estouro de buffer, mas você sempre pode causar um estouro de buffer no próprio Interpreter. Embora seja difícil. Da mesma forma, Python também é uma linguagem interpretada e está protegida contra estouro de buffer.
fonte