계: Input Validation and Representation
입력 검증 및 표현 문제는 메타 문자, 대체 인코딩 및 숫자 표현 때문에 발생합니다. 보안 문제는 입력을 신뢰하기 때문에 발생합니다. 문제로는 "Buffer Overflows", "Cross-Site Scripting" 공격, "SQL Injection", 그 외 여러 가지가 있습니다.
Unsafe JNI
Abstract
JNI(Java Native Interface)의 잘못된 사용으로 Java 응용 프로그램이 다른 언어의 보안 결함에 취약해질 수 있습니다.
Explanation
Unsafe JNI 오류는 Java 응용 프로그램이 JNI를 사용하여 다른 프로그래밍 언어로 작성된 코드를 호출할 때 발생합니다.
예제 1: 다음 Java 코드는
다음 C 코드는
이 예제는 Java로 구현되었기 때문에 buffer overflow 취약점과 같은 메모리 문제가 없는 것처럼 보입니다. Java가 메모리 연산을 안전하게 수행하는 뛰어난 기능이 있지만 이 보호 기능이 JNI(Java Native Interface)를 통해 접근하는 다른 언어로 작성된 소스 코드에서 발생하는 취약점에까지 적용되지는 않습니다. Java의 메모리 보호 기능에도 불구하고, 이 예제의 C 코드는 입력에 대해 범위 검사를 수행하지 않는
Sun Java(TM) Tutorial에 JNI에 대한 다음과 같은 설명이 나와 있습니다[1]:
JNI 프레임워크에서는 Java 코드가 Java 개체를 사용하는 것과 같은 방식으로 네이티브 메서드가 Java 개체를 사용할 수 있습니다. 네이티브 메서드는 배열과 문자열을 포함한 Java 개체를 만들고 검사하고 작업을 수행하는 데 사용할 수 있습니다. 네이티브 메서드는 Java 응용 프로그램 코드에서 만든 개체를 검사하고 사용할 수도 있습니다. 또한 네이티브 메서드는 Java가 만들었거나 Java에 전달된 Java 개체를 업데이트할 수도 있고 업데이트된 개체를 Java 응용 프로그램이 사용할 수 있습니다. 따라서 응용 프로그램의 네이티브 언어 쪽과 Java 쪽 모두 Java 개체를 작성, 업데이트, 및 접근할 수 있고 둘 사이에 이들 개체를 공유할 수 있습니다.
Java 응용 프로그램을 통해 접근되는 네이티브 코드의 취약점은 일반적으로 네이티브 언어로 작성된 응용 프로그램의 취약점 익스플로이트와 같은 방식으로 익스플로이트됩니다. 이 공격의 유일한 난관이라면 공격자가 Java 응용 프로그램이 네이티브 코드를 사용하여 특정 작업을 수행한다는 것을 식별하는 것입니다. 이는 다양한 방법으로 수행할 수 있는데, 예를 들면, 네이티브 코드에서 자주 구현되는 특정 동작을 식별하거나 Java 응용 프로그램에서 JNI 사용을 노출하는 system information leak을 익스플로이트하는 것이 있습니다[2].
예제 1: 다음 Java 코드는
Echo
라는 클래스를 정의합니다. 클래스는 C를 사용하여 콘솔에 입력된 명령을 사용자에게 돌려보내는 하나의 네이티브 메서드를 선언합니다.
class Echo {
public native void runEcho();
static {
System.loadLibrary("echo");
}
public static void main(String[] args) {
new Echo().runEcho();
}
}
다음 C 코드는
Echo
클래스에서 구현된 네이티브 메서드를 정의합니다.
#include <jni.h>
#include "Echo.h" //javah로 컴파일된Example 1
의 Java 클래스
#include <stdio.h>
JNIEXPORT void JNICALL
Java_Echo_runEcho(JNIEnv *env, jobject obj)
{
char buf[64];
gets(buf);
printf(buf);
}
이 예제는 Java로 구현되었기 때문에 buffer overflow 취약점과 같은 메모리 문제가 없는 것처럼 보입니다. Java가 메모리 연산을 안전하게 수행하는 뛰어난 기능이 있지만 이 보호 기능이 JNI(Java Native Interface)를 통해 접근하는 다른 언어로 작성된 소스 코드에서 발생하는 취약점에까지 적용되지는 않습니다. Java의 메모리 보호 기능에도 불구하고, 이 예제의 C 코드는 입력에 대해 범위 검사를 수행하지 않는
gets()
를 사용하기 때문에 buffer overflow에 취약합니다. Sun Java(TM) Tutorial에 JNI에 대한 다음과 같은 설명이 나와 있습니다[1]:
JNI 프레임워크에서는 Java 코드가 Java 개체를 사용하는 것과 같은 방식으로 네이티브 메서드가 Java 개체를 사용할 수 있습니다. 네이티브 메서드는 배열과 문자열을 포함한 Java 개체를 만들고 검사하고 작업을 수행하는 데 사용할 수 있습니다. 네이티브 메서드는 Java 응용 프로그램 코드에서 만든 개체를 검사하고 사용할 수도 있습니다. 또한 네이티브 메서드는 Java가 만들었거나 Java에 전달된 Java 개체를 업데이트할 수도 있고 업데이트된 개체를 Java 응용 프로그램이 사용할 수 있습니다. 따라서 응용 프로그램의 네이티브 언어 쪽과 Java 쪽 모두 Java 개체를 작성, 업데이트, 및 접근할 수 있고 둘 사이에 이들 개체를 공유할 수 있습니다.
Example 1
의 취약점은 네이티브 메서드 구현의 소스 코드 감사를 통해 쉽게 발견할 수 있습니다. 소스 코드 감사는 C 소스 코드의 가용성 및 프로젝트 구축 방식에 따라 불가능할 수도 있지만 대부분의 경우 이 방법으로 충분합니다. 하지만 Java와 네이티브 메서드 간에 개체를 공유하게 되면 잠재적인 위험이 Java의 부적절한 데이터 처리가 네이티브 코드의 취약점으로 이어지거나 네이티브 코드의 안전하지 못한 작업으로 Java의 데이터 구조가 손상되는 훨씬 심각한 경우로 확대됩니다.Java 응용 프로그램을 통해 접근되는 네이티브 코드의 취약점은 일반적으로 네이티브 언어로 작성된 응용 프로그램의 취약점 익스플로이트와 같은 방식으로 익스플로이트됩니다. 이 공격의 유일한 난관이라면 공격자가 Java 응용 프로그램이 네이티브 코드를 사용하여 특정 작업을 수행한다는 것을 식별하는 것입니다. 이는 다양한 방법으로 수행할 수 있는데, 예를 들면, 네이티브 코드에서 자주 구현되는 특정 동작을 식별하거나 Java 응용 프로그램에서 JNI 사용을 노출하는 system information leak을 익스플로이트하는 것이 있습니다[2].
References
[1] B. Stearns The Java Tutorial: The Java Native Interface
[2] JNI00-J. Define wrappers around native methods CERT
[3] INPUT-3: Define wrappers around native methods Oracle
[4] Standards Mapping - Common Weakness Enumeration CWE ID 111
[5] Standards Mapping - Common Weakness Enumeration Top 25 2024 [12] CWE ID 020
[6] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002754
[7] Standards Mapping - FIPS200 SI
[8] Standards Mapping - General Data Protection Regulation (GDPR) Indirect Access to Sensitive Data
[9] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-10 Information Input Validation (P1)
[10] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-10 Information Input Validation
[11] Standards Mapping - OWASP Mobile 2014 M7 Client Side Injection
[12] Standards Mapping - OWASP Mobile 2024 M4 Insufficient Input/Output Validation
[13] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-CODE-4
[14] Standards Mapping - OWASP Top 10 2004 A1 Unvalidated Input
[15] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1 Requirement 6.5.1
[16] Standards Mapping - Payment Card Industry Data Security Standard Version 1.2 Requirement 6.3.1.1
[17] Standards Mapping - Payment Card Industry Data Security Standard Version 3.0 Requirement 6.5.6
[18] Standards Mapping - Payment Card Industry Data Security Standard Version 3.1 Requirement 6.5.6
[19] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2 Requirement 6.5.6
[20] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2.1 Requirement 6.5.6
[21] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 6.2.4
[22] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0.1 Requirement 6.2.4
[23] Standards Mapping - Payment Card Industry Software Security Framework 1.0 Control Objective 4.2 - Critical Asset Protection
[24] Standards Mapping - Payment Card Industry Software Security Framework 1.1 Control Objective 4.2 - Critical Asset Protection, Control Objective B.3.1 - Terminal Software Attack Mitigation, Control Objective B.3.1.1 - Terminal Software Attack Mitigation
[25] Standards Mapping - Payment Card Industry Software Security Framework 1.2 Control Objective 4.2 - Critical Asset Protection, Control Objective B.3.1 - Terminal Software Attack Mitigation, Control Objective B.3.1.1 - Terminal Software Attack Mitigation, Control Objective C.3.2 - Web Software Attack Mitigation
[26] Standards Mapping - Security Technical Implementation Guide Version 3.1 APP3510 CAT I
[27] Standards Mapping - Security Technical Implementation Guide Version 3.4 APP3510 CAT I
[28] Standards Mapping - Security Technical Implementation Guide Version 3.5 APP3510 CAT I
[29] Standards Mapping - Security Technical Implementation Guide Version 3.6 APP3510 CAT I
[30] Standards Mapping - Security Technical Implementation Guide Version 3.7 APP3510 CAT I
[31] Standards Mapping - Security Technical Implementation Guide Version 3.9 APP3510 CAT I
[32] Standards Mapping - Security Technical Implementation Guide Version 3.10 APP3510 CAT I
[33] Standards Mapping - Security Technical Implementation Guide Version 4.2 APSC-DV-002560 CAT I
[34] Standards Mapping - Security Technical Implementation Guide Version 4.3 APSC-DV-002560 CAT I
[35] Standards Mapping - Security Technical Implementation Guide Version 4.4 APSC-DV-002560 CAT I
[36] Standards Mapping - Security Technical Implementation Guide Version 4.5 APSC-DV-002560 CAT I
[37] Standards Mapping - Security Technical Implementation Guide Version 4.6 APSC-DV-002560 CAT I
[38] Standards Mapping - Security Technical Implementation Guide Version 4.7 APSC-DV-002560 CAT I
[39] Standards Mapping - Security Technical Implementation Guide Version 4.8 APSC-DV-002560 CAT I
[40] Standards Mapping - Security Technical Implementation Guide Version 4.9 APSC-DV-002560 CAT I
[41] Standards Mapping - Security Technical Implementation Guide Version 4.10 APSC-DV-002560 CAT I
[42] Standards Mapping - Security Technical Implementation Guide Version 4.11 APSC-DV-002560 CAT I
[43] Standards Mapping - Security Technical Implementation Guide Version 4.1 APSC-DV-002560 CAT I
[44] Standards Mapping - Security Technical Implementation Guide Version 5.1 APSC-DV-002560 CAT I
[45] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002560 CAT I
[46] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002530 CAT II, APSC-DV-002560 CAT I
[47] Standards Mapping - Security Technical Implementation Guide Version 6.1 APSC-DV-002530 CAT II, APSC-DV-002560 CAT I
[48] Standards Mapping - Web Application Security Consortium Version 2.00 Improper Input Handling (WASC-20)
desc.semantic.java.unsafe_jni