<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            Unsafe JNI

            ABSTRACT

            Java Native Interface(JNI)應用不當會導致 Java 應用程序容易受到其他語言的安全漏洞攻擊。

            EXPLANATION

            當 Java 應用程序使用 JNI 調用以其他編程語言編寫的代碼時,會發生 Unsafe JNI 漏洞。

            例如:以下 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" //the java class above compiled with javah
            #include <stdio.h>

            JNIEXPORT void JNICALL
            Java_Echo_runEcho(JNIEnv *env, jobject obj)
            {
            char buf[64];
            gets(buf);
            printf(buf);
            }


            因為這個例子是在 Java 中實現的,所以看上去似乎可以避免諸如 buffer overflow 之類的內存問題。雖然 Java 在內存安全方面做的很好,但是該保護機制并不適用于其他語言編寫的且通過 Java 本地接口 (Java Native Interface,JNI) 訪問的源代碼中出現的漏洞。盡管有 Java 提供的內存保護機制,但是這個例子中的 C 語言代碼仍然很容易受到 buffer overflow 的攻擊,因為它在沒有執行任何輸入檢查的情況下就使用了 gets()

            Sun Java(TM) 教程對 JNI 描述如下 [1]:

            一旦有了 JNI 框架,您的本地方法就可以像 Java 代碼那樣利用 Java 對象。本地方法可以創建 Java 對象(包括數組和字符串),并且檢查和應用這些對象,以便執行各種相關的任務。本地方法也可以檢查和應用由 Java 應用程序代碼創建的對象。本地方法甚至可以更新由自己創建的或傳遞給它的 Java 對象,且更新后的對象可以應用到 Java 應用程序中。因此,在應用程序中,無論是本地語言還是 Java 語言都能創建、更新和訪問 Java 對象,并在兩種語言間共享這些對象。

            通過檢查本地方法實現的源代碼,可以輕松地發現上述例子中存在的漏洞。根據不同的 C 語言源代碼和項目構建方式,這種方式可能在某些情況下不可行,但是多數情況下還是可行的。然而,這種能夠在 Java 方法和本地方法間共享對象的能力會進一步加大潛在的風險。在 Java 中數據處理不當時,可能會導致本地代碼出現意想不到的漏洞,同樣本地代碼中的不安全操作會破壞 Java 的數據結構。

            通過 Java 應用程序訪問的本地代碼中出現的漏洞,通常與由本地語言編寫的應用程序中存在的漏洞是一樣的。這種攻擊面臨的唯一挑戰是:攻擊者需要確定 Java 應用程序是否使用了本地代碼執行某些特定的操作。可以用多種方法實現上述目的,包括識別那些通常用本地代碼實現的某些特定行為,或者利用 Java 應用程序中 system information leak 的漏洞(表明系統使用了 JNI) [2]。

            REFERENCES

            [1] Standards Mapping - OWASP Top 10 2004 - (OWASP 2004) A1 Unvalidated Input

            [2] Standards Mapping - Security Technical Implementation Guide Version 3 - (STIG 3) APP3510 CAT I

            [3] Standards Mapping - Security Technical Implementation Guide Version 3.4 - (STIG 3.4) APP3510 CAT I

            [4] Standards Mapping - Common Weakness Enumeration - (CWE) CWE ID 111

            [5] Standards Mapping - Payment Card Industry Data Security Standard Version 1.2 - (PCI 1.2) Requirement 6.3.1.1

            [6] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1 - (PCI 1.1) Requirement 6.5.1

            [7] Standards Mapping - FIPS200 - (FISMA) SI

            [8] B. Stearns The Java Tutorial:The Java Native Interface


            Copyright 2013 Fortify Software - All rights reserved.
            (Generated from version 2013.1.1.0008 of the Fortify Secure Coding Rulepacks)
            desc.semantic.java.unsafe_jni

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线