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


96

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


2
일부 라이브러리 함수 (네이티브 코드로 구현 됨)에는 버그가있는 것으로 알려져 있습니다. 특히 Java 5 영역에서는 2D, 사운드 또는 색상 프로필의 많은 악용이 알려져 있습니다.
eckes

답변:


108

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

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

24

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


5
안전하지 않은 컨텍스트의 C #에는 버퍼 오버플로가있을 수 있습니다. 언어로서의 Java는이를 완전히 금지합니다 (관리되지 않는 포인터 액세스를 얻으려면 JNI를 통해 언어를 변경해야합니다)
ShuggyCoUk

1
좋은 지적. 안전하지 않은 C #을 사용하면 더 이상 편안하게 관리되는 세상에서 샌드 박스가되지 않습니다.
Brian Rasmussen

1
맞습니다. 안전하지 않은 내용을 작성하지 않거나 interop을 수행하지 않더라도 라이브러리를 사용할 수 있습니다. 그래서 그것은 조심해야 할 것입니다.
BobbyShaftoe

13

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

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

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


10

예, 아니오. 아니요, 관리되는 메모리 모델이기 때문에 실수로 버퍼 오버플로 취약점에 노출 될 수는 없습니다. 그러나 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 () 호출을보고했습니다.


9

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

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

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

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


4

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


3

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


3

JNI (Java Native Interace) 기능을 사용하여 외부 코드를 호출하고 외부 코드에 악용 가능한 문제가있는 경우 Java 프로그램에서 버퍼 오버플로가 발생할 수 있습니다. 대부분의 애플리케이션은 가능한 경우 JNI를 사용하지 않기 때문에 이는 매우 드문 경우입니다.


3

일반적으로 정수 오버플로를 통해 메서드가 의도하지 않은 배열의 유효한 항목에 쓸 수 있습니다.

예를 들어 다음은 경계를 확인하는 데 충분하지 않습니다.

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

IIRC는 StringBuffer한때 그런 버그가 있었지만, 당신이 할 수있는 흥미로운 것은 없었습니다.


무엇 이다 경계를 확인하기에 충분는?
Broam 2010

1
@ 브롬 : 0 <= off && 0 <= len && off <= buff.length-len내 생각에. 나를 인용하지 마십시오. 똑같아 보이지만 가능한 오버플로가 없습니다 (원래 off + len에서 음수가 될 수 있으므로 분명히 어레이 길이보다 작습니다). 유지 보수 프로그래머가이를 명백한 형태로 "정리"하지 않도록하십시오. 정수 오버플로가 엄청나게 혼란 스럽습니다. 잠시 생각 해보자. 그러면 내가 틀렸다는 잔소리가 난다. 그러나 물론, 다른 리뷰어와 원래 프로그래머가 있어야합니다. 물론 함께 오류가 발생할 수있는 방법은 없습니다! (not)
Tom Hawtin-tackline

나는 이것을 조금 쳐다 봐야했지만 당신이 옳다. off + len은 C에서 오버플로 및 래핑 할 수 있습니다. Java 에서 내가 잘못하지 않는 한, 오버플로 예외가 발생하기 전에 발생합니다.
Broam 2010

1
아니요. 정수 산술은 조용히 둘러 쌉니다. C #에는 오버플로시 예외가 발생하는 "모드"가 있지만 많이 사용되지는 않는다고 생각합니다 (사용할 생각이라면 어쨌든 올바른 작업을 수행 할 것이라고 생각할 것입니다).
Tom Hawtin-tackline

1

JAVA의 주요 기능 중 하나는 보안입니다. 인터프리터 언어로 작성된 프로그램은 버퍼 오버 플로우 악용에 취약하지 않지만 인터프리터 자체에서 항상 버퍼 오버 플로우를 일으킬 수 있습니다. 어려울지라도. 마찬가지로 Python은 해석 된 언어이며 버퍼 오버플로로부터 안전합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.