programing

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

projobs 2022. 9. 15. 23:07
반응형

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

Java에는 버퍼 오버플로우가 있습니까?만약 그렇다면 시나리오를 제시해 주시겠습니까?

Java String은 char 배열에 기반하고 Java는 배열 경계를 자동으로 검사하므로 버퍼 오버플로우가 발생할 수 있는 것은 다음과 같은 비정상적인 시나리오뿐입니다.

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

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

사실상, 아니다.

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

버퍼 오버런이 있는 경우 Java Virtual Machine의 버그에 의한 것일 수 있으며 Java Language Specifications 또는 Java Virtual Machine Specifications에 기재되어 있는 의도된 동작이 아닌 것으로 알고 있습니다.

한마디로 이야기할 수 없군요.아니요, 관리 대상 메모리 모델이기 때문에 실수로 버퍼 오버플로 취약성을 발생시킬 수 없습니다.그러나 JVM 및 JDK에는 버퍼 오버플로 취약성이 있을 수 있습니다.다음 Secunia 권고 사항을 참조하십시오.

http://secunia.com/advisories/25295

또는 이전의 몇 가지 JDK 및 JRE 취약성에 대한 다음과 같은 오래된 권고 사항을 참조하십시오.

  • Java Runtime Environment(JRE; Java 런타임 환경)의 "http 200" JAR 언패킹 유틸리티의 정수 및 버퍼 오버플로 취약성으로 인해 특권이 상승할 수 있음https://download.oracle.com/sunalerts/1020225.1.html

    "unpack200" JAR unpacking 유틸리티를 사용하는 애플릿 및 Java Web Start 응용 프로그램의 Java Runtime Environment(JRE; Java 런타임 환경)에는 정수 및 버퍼 오버플로 취약성이 있으며 이를 통해 신뢰할 수 없는 애플릿 또는 응용 프로그램이 권한을 상승시킬 수 있습니다.예를 들어 신뢰할 수 없는 애플릿은 로컬파일 읽기 및 쓰기 권한을 부여하거나 신뢰할 수 없는 애플릿을 실행하는 사용자가 액세스할 수 있는 로컬응용 프로그램을 실행할 수 있습니다.

    Sun은 iDefense VCP(http://labs.idefense.com/vcp/)와 구글의 Chris Evans와 함께 일하면서 이러한 문제를 우리에게 알려준 것에 대해 감사히 생각합니다.

  • Sun Java Development Kit(JDK) 및 Java Runtime Environment(JRE)에서는 여러 가지 취약성이 발견되었습니다.https://security.gentoo.org/glsa/200705-23

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

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

  1. 프레임워크의 오류(이러한 오류는 과거에도 존재했으며 다시 발생할 수 있음)
  2. JNI 사용(기본적으로 관리 코드를 사용하지 않음)

버퍼를 사용하는 코드가 있고 코드가 올바르게 해석해야 하지만 해석에 실패한다는 의미에서 버퍼 오버플로가 발생할 수 있습니다.예를 들어 XML 파서를 작성할 때 누군가가 잘못된 형식(또는 합법적이지만 흔치 않은) 요청을 제공할 수 있습니다. 파서의 설계로 인해 이전에 검증된 데이터가 일부 페이로드로 덮어쓰기되어 응용 프로그램이 제대로 작동하지 않을 수 있습니다.

후자의 형식은 가능성은 낮지만, 이와 같은 문제가 있는 SQL 문자열 클렌징 함수가 널리 배포되어 있기 때문에 이러한 문제가 발생할 수 있습니다.

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

이미 지적된 바와 같이 Java는 언어로서 모든 메모리 액세스에 대한 체크를 제한하고 있으며, 여기에 오류가 있을 경우 JVM에 장애가 있으며 프로그램이 아닙니다.단, 주의할 점은 Java에서의 메모리 누전과 같은 인수입니다.스택을 파괴할 수는 없지만 ArrayOutOfBoundsException이 잘못된 위치에 있으면 올바르게 처리되지 않아 시스템이 계속 망가질 수 있습니다.

Java Native Interace(JNI; Java 네이티브인터페이스) 기능을 사용하여 외부 코드를 호출하고 외부 코드에 부정 이용 가능한 문제가 있는 경우 Java 프로그램에서 버퍼 오버플로를 일으킬 수 있습니다.대부분의 응용 프로그램이 가능한 경우 JNI를 사용하지 않기 때문에 이는 매우 드문 일입니다.

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

예를 들어 다음 항목은 경계를 검사하기에 충분하지 않습니다.

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

IIRC,StringBuffer그런 버그가 있었지만, 그 버그로 할 수 있는 재미있는 것은 아무것도 없었습니다.

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

언급URL : https://stackoverflow.com/questions/479701/does-java-have-buffer-overflows

반응형