<dd id="sga4y"><optgroup id="sga4y"></optgroup></dd>
<nav id="sga4y"><code id="sga4y"></code></nav>
  • <optgroup id="sga4y"></optgroup>

    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

    97av