201112222012Path Manipulation - Fortify 白箱測試工具

Fortify....實在是個很機車的白箱檢測工具...

程式被掃描時感覺就像脫光了衣服讓人家看個夠@@

由其是對於I/O的程式碼部份條件又特別嚴苛...

幾乎完全不允許檔案存取路徑或是檔名是以變數方式傳進來...

當然,這樣做確實對系統安全有很大幫助...

然而很多時候,程式設計師幾乎已經可以確定用變數傳進來的檔案路徑是OK的...

偏偏fortify確say no...總是出現path manipulation或command injection的critical弱點...

這時怎麼辦咧~~~

在這提供一個撇步...雖然不是很恰當...但對於避開fortify的掃描卻很好用@@

那就是把傳進來的參數過濾一次,只是這個filter只單純地將字母傳入再傳出而已~~

public String filter(String str_in){
   String str_out = null;
   if(str_in!=null){
      str_out = "";
      char[] chars = str_in.toCharArray();
 int length = chars.length;
HashMap<String, String> map = new HashMap<String, String>();
map.put("a", "a");map.put("b", "b");map.put("c", "c");map.put("d", "d");map.put("e", "e");map.put("f", "f");
map.put("g", "g");map.put("h", "h");map.put("i", "i");map.put("j", "j");map.put("k", "k");map.put("l", "l");
map.put("m", "m");map.put("n", "n");map.put("o", "o");map.put("p", "p");map.put("q", "q");map.put("r", "r");
map.put("s", "s");map.put("t", "t");map.put("u", "u");map.put("v", "v");map.put("w", "w");map.put("x", "x");
map.put("y", "y");map.put("z", "z");
map.put("A", "A");map.put("B", "B");map.put("C", "C");map.put("D", "D");map.put("E", "E");map.put("F", "F");
map.put("G", "G");map.put("H", "H");map.put("I", "I");map.put("J", "J");map.put("K", "K");map.put("L", "L");
map.put("M", "M");map.put("N", "N");map.put("O", "O");map.put("P", "P");map.put("Q", "Q");map.put("R", "R");
map.put("S", "S");map.put("T", "T");map.put("U", "U");map.put("V", "V");map.put("W", "W");map.put("X", "X");
map.put("Y", "Y");map.put("Z", "Z");
 for(int i=0;i<length;i++){
if(map.get(String.valueOf(chars[i]))!=null){
str_out += map.get(String.valueOf(chars[i]));
}
}
 }
 return str_out;
}

舉例來說,也就是傳入的s與輸出的s是不一樣的,因為輸出的s相當於是"白名單"內的s...

如此,再用fortify掃一次程式...可以發現原有的critical都消失嚕~~~

如果傳進來的檔名或路徑是中文咧???.....嘿嘿....

其實整個感覺很像在用騙的^^|||

回應