[java] Java에 버퍼 오버 플로우가 있습니까?

Java에 버퍼 오버 플로우가 있습니까? 그렇다면 시나리오를 제공 할 수 있습니까?



답변

Java Strings는 char 배열을 기반으로하고 Java는 배열 경계를 자동으로 확인하므로 버퍼 오버플로는 비정상적인 시나리오에서만 가능합니다.

  1. JNI를 통해 네이티브 코드를 호출하는 경우
  2. JVM 자체에서 (일반적으로 C ++로 작성 됨)
  3. 인터프리터 또는 JIT 컴파일러가 올바르게 작동하지 않음 (Java 바이트 코드 필수 경계 검사)


답변

Java 및 C #과 같은 관리 언어에는 이러한 문제가 없지만 실제로 코드를 실행하는 특정 가상 머신 (JVM / CLR / etc)이있을 수 있습니다.


답변

모든 의도와 목적을 위해 아닙니다.

Java에는 할당 된 배열 외부의 영역에서 데이터에 액세스 할 수 없는지 확인 하는 배열 경계 검사 가 있습니다. 배열 크기를 초과하는 영역에 액세스하려고하면 ArrayOutOfBounds예외가 발생합니다.

버퍼 오버런이있는 경우 Java Virtual Machine의 버그로 인한 것일 수 있으며 Java 언어 사양이나 Java Virtual Machine 사양에 작성된 의도 된 동작이 아닙니다.


답변

예, 아니오. 아니요, 관리되는 메모리 모델이기 때문에 실수로 버퍼 오버플로 취약점에 노출 될 수는 없습니다. 그러나 JVM 및 JDK에는 버퍼 오버 플로우 취약점이있을 수 있습니다. 이 Secunia 권고를 참조하십시오.

http://secunia.com/advisories/25295

또는 몇 가지 이전 JDK 및 JRE 취약성에 대한 이전 권고를 참조하십시오.

  • JRE (Java Runtime Environment) “unpack200″JAR Unpacking 유틸리티의 정수 및 버퍼 오버플로 취약점으로 인해 권한 상승이 발생할 수 있음 https://download.oracle.com/sunalerts/1020225.1.html

    “unpack200″JAR 압축 해제 유틸리티를 사용하는 Java Web Start 응용 프로그램과 애플릿의 압축을 푸는 JRE (Java Runtime Environment)의 정수 및 버퍼 오버 플로우 취약점으로 인해 신뢰할 수없는 애플릿 또는 응용 프로그램이 권한을 상승시킬 수 있습니다. 예를 들어, 신뢰할 수없는 애플릿은 자신에게 로컬 파일을 읽고 쓸 수있는 권한을 부여하거나 신뢰할 수없는 애플릿을 실행하는 사용자가 액세스 할 수있는 로컬 응용 프로그램을 실행할 수 있습니다.

    Sun은 iDefense VCP ( http://labs.idefense.com/vcp/ ) 및 Google의 Chris Evans와 협력 하여 이러한 문제를 알려준 “regenrecht”에게 감사를 표 합니다.

  • Sun JDK (Java Development Kit) 및 JRE (Java Runtime Environment)에서 여러 취약점이 확인되었습니다. https://security.gentoo.org/glsa/200705-23

    Fujitsu 보안 팀에서 “잘못된 시스템 클래스 사용”과 관련된 불특정 취약점이보고되었습니다. 또한 Google 보안 팀의 Chris Evans는 JPG 또는 BMP 파일과 함께 사용되는 ICC 파서에서 버퍼 오버플로를 초래하는 정수 오버플로와 특정 BMP 파일을 처리 할 때 / dev / tty에 대한 잘못된 open () 호출을보고했습니다.


답변

스택 또는 힙 자체를 덮어 쓰는 엄격한 의미의 버퍼 오버플로에는 다음 중 하나가 필요합니다.

  1. 프레임 워크의 버그 (이것들은 과거에 존재했으며 다시있을 수 있습니다)
  2. JNI 사용 (본질적으로 더 이상 관리 코드를 사용하지 않음)

버퍼를 사용하는 코드가 있고 코드가 올바르게 구문 분석을 담당하지만 그렇게하지 못하는 경우 버퍼 오버플로가 발생할 수 있습니다. 예를 들어 XML 파서를 작성하면 누군가가 잘못된 (또는 합법적이지만 흔하지 않은) 요청을 제공 할 수 있습니다.이 요청은 파서의 설계로 인해 이전에 검증 된 데이터를 일부 페이로드로 덮어 써 애플리케이션이 제대로 작동하지 않게 할 수 있습니다.

이 후자의 형태는 가능성이 적지 만 이와 같은 문제가있는 널리 배포 된 잘못 작성된 SQL 문자열 정리 함수는 초대 대상이 될 것입니다.


답변

Java (및 .Net) 가상 머신은 예약 된 메모리 외부에서 쓰기를 시도하는 코드를 포착합니다. 이를 올바르게 처리하지 않는 응용 프로그램은 여전히 ​​보안 문제를 일으킬 수 있습니다. 악의적 인 사용자가 잘못된 입력을 입력하여 예외를 트리거 할 수있는 경우 서비스 거부 공격을 수행 할 수 있습니다.


답변

이미 지적했듯이 Java는 언어로서 모든 메모리 액세스에 대한 경계 검사를 수행하며 여기에 오류가 있으면 프로그램이 아닌 JVM에 결함이 있습니다. 그러나 주목해야 할 것은 자바의 메모리 누수와 유사한 주장이다. 스택을 부수는 것은 불가능하지만 올바르게 처리되지 않은 잘못된 위치의 ArrayOutOfBoundsException은 여전히 ​​시스템을 망칠 수 있습니다.