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 () 호출을보고했습니다.
스택 또는 힙 자체를 덮어 쓰는 엄격한 의미의 버퍼 오버플로에는 다음 중 하나가 필요합니다.
버퍼를 사용하는 코드가 있고 코드가 올바르게 구문 분석을 담당하지만 그렇게하지 못하는 경우 버퍼 오버플로가 발생할 수 있습니다. 예를 들어 XML 파서를 작성하면 누군가가 잘못된 (또는 합법적이지만 흔하지 않은) 요청을 제공 할 수 있습니다.이 요청은 파서의 설계로 인해 이전에 검증 된 데이터를 일부 페이로드로 덮어 써 애플리케이션이 제대로 작동하지 않게 할 수 있습니다.
이 후자의 형태는 가능성이 적지 만 이와 같은 문제가있는 널리 배포 된 잘못 작성된 SQL 문자열 정리 함수는 초대 대상이 될 것입니다.
일반적으로 정수 오버플로를 통해 메서드가 의도하지 않은 배열의 유효한 항목에 쓸 수 있습니다.
예를 들어 다음은 경계를 확인하는 데 충분하지 않습니다.
/* !! WRONG !! */ 0 <= off && 0 <= len && off+len <= buff.length /* !! WRONG !! */
IIRC는 StringBuffer
한때 그런 버그가 있었지만, 당신이 할 수있는 흥미로운 것은 없었습니다.
0 <= off && 0 <= len && off <= buff.length-len
내 생각에. 나를 인용하지 마십시오. 똑같아 보이지만 가능한 오버플로가 없습니다 (원래 off + len에서 음수가 될 수 있으므로 분명히 어레이 길이보다 작습니다). 유지 보수 프로그래머가이를 명백한 형태로 "정리"하지 않도록하십시오. 정수 오버플로가 엄청나게 혼란 스럽습니다. 잠시 생각 해보자. 그러면 내가 틀렸다는 잔소리가 난다. 그러나 물론, 다른 리뷰어와 원래 프로그래머가 있어야합니다. 물론 함께 오류가 발생할 수있는 방법은 없습니다! (not)
JAVA의 주요 기능 중 하나는 보안입니다. 인터프리터 언어로 작성된 프로그램은 버퍼 오버 플로우 악용에 취약하지 않지만 인터프리터 자체에서 항상 버퍼 오버 플로우를 일으킬 수 있습니다. 어려울지라도. 마찬가지로 Python은 해석 된 언어이며 버퍼 오버플로로부터 안전합니다.