<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    如何消除VeraCode檢測中的OS Command Injection Issue(CWE ID 78)

    Veracode是一個檢測應用程序是否存在安全漏洞的工具,更多細節(jié)請訪問http://www.veracode.com

    這里主要總結一下如何消除Veracode檢測結果中的OS Command Injection issue(CWE ID 78)。

    首先,先看看VeraCode對OS Command Injection的定義:
    OS command injection vulnerabilities occur when data enters an application from an untrusted source and is used to
    dynamically construct and execute a system command.  This allows an attacker to either alter the command executed by the application or append additional commands.  The command is typically executed with the privileges of the executing process and gives an attacker a privilege or capability that he would not otherwise have.

    再看卡VeraCode對如何解決這個問題的建議:
    Careful handling of all untrusted data is critical in preventing OS command injection attacks.   Using one or more of the following techniques provides defense-in-depth and minimizes the likelihood of an vulnerability.
    * If possible, use library calls rather than external processes to recreate the desired functionality.
    * Validate user-supplied input using positive filters (white lists) to ensure that it conforms to the expected format, using centralized data validation routines when possible.
    * Select safe API routines.  Some APIs that execute system commands take an array of strings as input rather than a
    single string, which protects against some forms of command injection by ensuring that a user-supplied argument
    cannot be interpreted as part of the command.
    通過對現(xiàn)有系統(tǒng)的實踐證明,對于這類OS Command Injection Issue,消除時主要遵循以下幾個原則:

    1)重構代碼,保證只有1個函數(shù)最終執(zhí)行Runtime.exec(xxxx,xxx)
        public static Process execAndReturnProcess(String cmd[]) throws Exception
        {
            
    return execAndReturnProcess(cmd, null);
        }
       
        public static Process execAndReturnProcess(String cmds[], String envps[]) throws Exception
        {
            String[] validatedCmdArray 
    = ASEUtils.validateCommandArray(cmds);
            String[] validatedEnvArray 
    = ASEUtils.validateEnvArray(envps);
            
            
    if (null == validatedCmdArray)
            {
                
    throw new Exception("No permission to execute the command:" + cmds[0]);
            }
            
            Runtime runtime 
    = Runtime.getRuntime();
            Process process 
    = runtime.exec(validatedCmdArray, validatedEnvArray);
            
    return process;
        }

    2)用Runtime.exec調(diào)用操作系統(tǒng)命令時,優(yōu)先使用數(shù)組作為參數(shù)
    Process exec(String[] cmdarray, String[] envp, File dir)
    而不是字符串作為參數(shù)
    Process exec(String cmd, String[] envp, File dir)

    3)Veracode會檢測傳入exec()的變量是否存在隱患(比如文件中讀取出來的,或者注冊表里讀取出來的),這種情況就需要對原有變量做驗證,然后重新定義變量,傳入Runtime.exec中,如下面代碼所示:
    public static Process execAndReturnProcess(String cmds[], String envps[]) throws Exception
        {
            String[] validatedCmdArray 
    = validateCommandArray(cmds);
            String[] validatedEnvArray 
    = validateEnvArray(envps);
            
            
    if (null == validatedCmdArray)
            {
                
    throw new Exception("No permission to execute the command:" + cmds[0]);
            }
            
            Runtime runtime 
    = Runtime.getRuntime();
            Process process 
    = runtime.exec(validatedCmdArray, validatedEnvArray);
            
    return process;
        }    
        
        
    public static String[] validateCommandArray(String[] cmdArray)
        {
            String[] validatedCmdArray = new String[cmdArray.length];
            
            
    for (int i=0; i<cmdArray.length; i++)
            {
                
    if ( null != cmdArray[i] && cmdArray[i].trim().length()>0)
                {
                    validatedCmdArray[i] 
    = removeControlCharacter(cmdArray[i]);
                }
            }
            
    return validatedCmdArray;
        }

    4)另外,還可以定義一個全局的可執(zhí)行命令的列表(White List),對每次要執(zhí)行的命令,都驗證它是否在允許的可執(zhí)行命令列表里。

    public static final String [] ALLOWED_COMMAND_ROUTINES =
        {
            
    "cmd",        
            
    "command",    
            
    "sh",         
            
    "env",
        };
        
        
    private static boolean isValidateCommandRoutine(String command)
        {
            Boolean isValidRoutine 
    = false;
            
    for (int i=0; i<ALLOWED_COMMAND_ROUTINES.length ;i++)
            {
                
    if (command.equals(ALLOWED_COMMAND_ROUTINES[i]) != -1)
                {
                    isValidRoutine 
    = true;
                }
            }
            
    return isValidRoutine;
        }
        
        
    public static String[] validateCommandArray(String cmds[])
        {
            Boolean isValidRoutine 
    = isValidateCommandRoutine(cmds[0]);
            
    if (isValidRoutine)
            {
                String[] validatedCmdArray 
    = new String[cmds.length];
                
    for (int i=0; i<cmds.length; i++)
                {
                    
    if ( null != cmds[i] && cmds[i].trim().length()>0)
                    {
                        validatedCmdArray[i] 
    = removeControlCharacter(cmds[i]);
                    }
                }
                
    return validatedCmdArray;
            }
            
    return null;
        }

    當然,如果第三方檢測程序始終認為最后的調(diào)用 Runtime.exec(xxx,xx)存在隱患,則可以采用它們提供的注釋或者標記等其他方法消除最終的調(diào)用入口。

    實際上,我們在做第三方安全檢測時,使用上面提到的4點,Veracode 已經(jīng)可以通過檢測了,但是Fortify不行,所以最后只能在Fortify的系統(tǒng)里標記"Not an issue", 忽略這個最終的Runtime.exec調(diào)用。

    posted on 2011-09-06 10:28 想飛就飛 閱讀(3661) 評論(0)  編輯  收藏 所屬分類: J2EE開發(fā)工具&環(huán)境

    公告


    導航

    <2011年9月>
    28293031123
    45678910
    11121314151617
    18192021222324
    2526272829301
    2345678

    統(tǒng)計

    常用鏈接

    留言簿(13)

    我參與的團隊

    隨筆分類(69)

    隨筆檔案(68)

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 美女裸身网站免费看免费网站| 色www免费视频| 国产卡二卡三卡四卡免费网址| 日韩亚洲国产高清免费视频| 国产男女猛烈无遮挡免费网站| 久久嫩草影院免费看夜色| 亚洲精品影院久久久久久| 日韩a级毛片免费观看| 黄色短视频免费看| 亚洲91精品麻豆国产系列在线| 波多野结衣免费视频观看| 色欲A∨无码蜜臀AV免费播| 亚洲AV无码资源在线观看| 亚洲成在人线av| 国产99视频免费精品是看6| 免费人成在线观看网站品爱网| 亚洲av成人一区二区三区观看在线| 亚洲AV无一区二区三区久久| 国产资源免费观看| 香蕉成人免费看片视频app下载 | 精品亚洲成a人片在线观看少妇| 夜夜爽免费888视频| 亚在线观看免费视频入口| 美女被爆羞羞网站免费| 99999久久久久久亚洲| 国产亚洲精品a在线观看app | 亚洲中文字幕无码一区二区三区| 日韩不卡免费视频| 视频免费在线观看| 国产成人 亚洲欧洲| wwwxxx亚洲| 久久精品国产亚洲av四虎| 亚洲Av无码国产情品久久| 免费精品人在线二线三线区别| 久久99热精品免费观看动漫| 三年在线观看免费观看完整版中文| 亚洲AV成人一区二区三区观看| 亚洲AV男人的天堂在线观看| 97久久精品亚洲中文字幕无码| 国产亚洲精品免费视频播放| 国产免费久久精品久久久|