如何解决 fortify 上的不安全 JNI 错误

问题描述 投票:0回答:1

我遇到了强化错误 UNSAFE JNI 的麻烦。

我有一个类将本机方法调用到第二个类中。

第二类使用JNI。

当我运行强化扫描时,出现不安全 JNI 错误。

我尝试解决从所有方法中删除指针参数的问题,但它不起作用。

对决议有什么想法吗?谢谢。

1 班.

public class SteamGameServer extends SteamInterface {

    public SteamGameServer(SteamGameServerCallback callback) {
        super(SteamGameServerAPINative.getSteamGameServerPointer(),
                SteamGameServerNative.createCallback(new SteamGameServerCallbackAdapter(callback)));
    }

    public void setProduct(String product) {
        SteamGameServerNative.setProduct(pointer, product);
    }

    public void setGameDescription(String gameDescription) {
        SteamGameServerNative.setGameDescription(pointer, gameDescription);
    }

    public void setModDir(String modDir) {
        SteamGameServerNative.setModDir(pointer, modDir);
    }

    public void setDedicatedServer(boolean dedicated) {
        SteamGameServerNative.setDedicatedServer(pointer, dedicated);
    }

    public void logOn(String token) {
        SteamGameServerNative.logOn(pointer, token);
    }

    public void logOnAnonymous() {
        SteamGameServerNative.logOnAnonymous(pointer);
    }

    public void logOff() {
        SteamGameServerNative.logOff(pointer);
    }

    public boolean isLoggedOn() {
        return SteamGameServerNative.isLoggedOn(pointer);
    }

    public boolean isSecure() {
        return SteamGameServerNative.isSecure(pointer);
    }

    public SteamID getSteamID() {
        return new SteamID(SteamGameServerNative.getSteamID(pointer));
    }

    public boolean wasRestartRequested() {
        return SteamGameServerNative.wasRestartRequested(pointer);
    }

    public void setMaxPlayerCount(int playersMax) {
        SteamGameServerNative.setMaxPlayerCount(pointer, playersMax);
    }

    public void setBotPlayerCount(int botplayers) {
        SteamGameServerNative.setBotPlayerCount(pointer, botplayers);
    }

    public void setServerName(String serverName) {
        SteamGameServerNative.setServerName(pointer, serverName);
    }

    public void setMapName(String mapName) {
        SteamGameServerNative.setMapName(pointer, mapName);
    }
}

第 2 类。(使用本机方法)

class SteamGameServerNative {

    private SteamGameServerNative () {
        
    }
    
    // @off

    /*JNI
        #include "SteamGameServerCallback.h"
    */

    static native long createCallback(Object javaCallback); 
    
    static native void setProduct(long pointer, String product); 

    static native void setGameDescription(long pointer, String gameDescription);

    static native void setModDir(long pointer, String modDir);

    static native void setDedicatedServer(long pointer, boolean dedicated);

    static native void logOn(long pointer, String token);

    static native void logOnAnonymous(long pointer);
    
    static native void logOff(long pointer);

    static native boolean isLoggedOn(long pointer);

    static native boolean isSecure(long pointer);

    static native long getSteamID(long pointer);

}
java java-native-interface fortify
1个回答
0
投票

根据 Fortify,任何 JNI 的使用都会自动标记为“不安全的 JNI”

当 Java 应用程序使用 JNI 调用其他编程语言编写的代码时,会发生不安全 JNI 错误。

防止 Fortify 将 Java 代码标记为“不安全 JNI”的唯一方法是从代码中删除所有对 JNI 的使用,如果您需要使用 JNI,这不是一个可行或现实的解决方案。

“不安全的 JNI”漏洞指标并不是现有漏洞的积极指标。

“不安全的JNI”必须被视为代码开发人员和安全审计人员之间进行手动审计审查的标志。审查后,要么需要进行代码修复,以确保应用任何缺失的安全编码实践,要么需要审核员批准将其标记为已禁止。

Fortify 扫描无法证明 JNI 的任何特定使用是否以安全方式编码。 Fortify 无法判断 JNI 调用的工作流管道的 Java 和非 Java 端是否都采取了适当的保护措施。因此,无论状态如何,它都会将每个 JNI 项标记为“不安全 JNI”,以便进行手动审核。

Fortify 本身建议通过手动审核解决不安全的 JNI,如下所示:

审核构成给定应用程序的所有源代码,包括用其他语言实现的本机方法。在审核期间,确保正确考虑和处理 Java 和本机代码之间的边界检查和其他行为的差异。特别是,验证共享对象在所有阶段是否得到正确处理:在将它们传递给本机代码之前、由本机代码操作它们时以及在它们返回到 Java 应用程序之后。

© www.soinside.com 2019 - 2024. All rights reserved.