輸入驗證和表示法問題是由中繼字元、替代編碼和數值表示法引起的。信任輸入會導致安全問題。問題包括:「Buffer Overflows」、「Cross-Site Scripting」攻擊、「SQL Injection」及其他許多問題。
Marker child = MarkerManager.getMarker("child");
Marker parent = MarkerManager.getMarker("parent");
child.addParents(MarkerManager.getMarker(userInput));
parent.addParents(MarkerManager.getMarker(userInput2));
String toInfinity = child.toString();
child
和 parent
的父標記設定為使用者定義的標記。如果使用者輸入 child
的父項作為 parent
,並將 parent
的父項作為 child
,就會在 Marker 資料結構中建立循環連結。在包含循環連結的資料結構上執行遞迴 toString
方法時,程式會擲回堆疊溢位異常並當機。如此會透過 Stack Exhaustion 導致 Denial of Service。StringBuilder
或 StringBuffer
執行個體,可能會導致 JVM 過度消耗堆積記憶體空間。StringBuilder
或 StringBuffer
執行個體,可能會導致應用程式在調整基礎陣列大小以適合使用者資料時消耗大量的堆積記憶體。將資料附加至 StringBuilder
或 StringBuffer
執行個體時,執行個體會判斷支援字元陣列是否有足夠空間來儲存資料。如果資料不適合,則 StringBuilder
或 StringBuffer
執行個體會建立新陣列並使其陣列大小為先前的至少兩倍,同時,舊陣列將在記憶體回收之前保留在堆積中。攻擊者可使用此實作詳細資料執行 Denial of Service (DoS) 攻擊。StringBuilder
執行個體。
...
StringBuilder sb = new StringBuilder();
final String lineSeparator = System.lineSeparator();
String[] labels = request.getParameterValues("label");
for (String label : labels) {
sb.append(label).append(lineSeparator);
}
...
StringBuilder
或 StringBuffer
執行個體,可能會導致 JVM 過度消耗堆積記憶體空間。StringBuilder
或 StringBuffer
執行個體,可能會導致應用程式在調整基礎陣列大小以適合使用者資料時消耗大量的堆積記憶體。將資料附加至 StringBuilder
或 StringBuffer
執行個體時,執行個體會判斷支援字元陣列是否有足夠空間來儲存資料。如果資料不適合,則 StringBuilder
或 StringBuffer
執行個體會建立新陣列並使其陣列大小為先前的至少兩倍,同時,舊陣列將在記憶體回收之前保留在堆積中。攻擊者可使用此實作詳細資料執行 Denial of Service (DoS) 攻擊。StringBuilder
執行個體。
...
val sb = StringBuilder()
val labels = request.getParameterValues("label")
for (label in labels) {
sb.appendln(label)
}
...
...
user_ops = request->get_form_field( 'operation' ).
CONCATENATE: 'PROGRAM zsample.| FORM calculation. |' INTO code_string,
calculator_code_begin user_ops calculator_code_end INTO code_string,
'ENDFORM.|' INTO code_string.
SPLIT code_string AT '|' INTO TABLE code_table.
GENERATE SUBROUTINE POOL code_table NAME calc_prog.
PERFORM calculation IN PROGRAM calc_prog.
...
operation
參數是理想值時,程式會正常運作。不過,如果攻擊者指定同時為有效且惡意的語言作業,則會使用父系程序的完整權限來執行那些作業。此類攻擊在插入的程式碼存取系統資源或執行系統指令時更危險。例如,如果攻擊者指定「MOVE 'shutdown -h now' to cmd.CALL 'SYSTEM' ID 'COMMAND' FIELD cmd ID 'TAB' FIELD TABL[].」做為 operation
的值,則會在主機系統上執行系統關機指令。
...
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var userOps:String = String(params["operation"]);
result = ExternalInterface.call("eval", userOps);
...
operation
參數是良性的值時,例如「8 + 7 * 2」,程式會正常運作。在此案例中,會指定 result
變數的值為 22。不過,如果攻擊者指定同時為有效且惡意的語言作業,則會使用父系程序的完整權限來執行這些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。在 ActionScript 案例中,攻擊者可能使用此弱點執行 Cross-site scripting 攻擊。
...
public static object CEval(string sCSCode)
{
CodeDomProvider icc = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters cparam = new CompilerParameters();
cparam.ReferencedAssemblies.Add("system.dll");
cparam.CompilerOptions = "/t:library";
cparam.GenerateInMemory = true;
StringBuilder sb_code = new StringBuilder("");
sb_code.Append("using System;\n");
sb_code.Append("namespace Fortify_CodeEval{ \n");
sb_code.Append("public class FortifyCodeEval{ \n");
sb_code.Append("public object EvalCode(){\n");
sb_code.Append(sCSCode + "\n");
sb_code.Append("} \n");
sb_code.Append("} \n");
sb_code.Append("}\n");
CompilerResults cr = icc.CompileAssemblyFromSource(cparam, sb_code.ToString());
if (cr.Errors.Count > 0)
{
logger.WriteLine("ERROR: " + cr.Errors[0].ErrorText);
return null;
}
System.Reflection.Assembly a = cr.CompiledAssembly;
object o = a.CreateInstance("Fortify_CodeEval.FortifyCodeEval");
Type t = o.GetType();
MethodInfo mi = t.GetMethod("EvalCode");
object s = mi.Invoke(o, null);
return s;
}
...
sCSCode
參數是良性值 (例如「return 8 + 7 * 2」) 時,程式會正常運作,在此案例中,函數 CEval
的傳回值為 22。不過,如果攻擊者指定同時為有效且惡意的語言作業,則會使用父系程序的完整權限來執行那些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。例如,.Net 允許叫用 Windows API,如果攻擊者指定「return System.Diagnostics.Process.Start(\"shutdown\", \"/s /t 0\");」做為 operation
的值,則會在主機系統上執行關機指令。
...
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
userOps = request.getParameter("operation");
Object result = scriptEngine.eval(userOps);
...
operation
參數是良性值時,例如「8 + 7 * 2」,程式會正常運作。在此情況下,會指定 result
變數的值為 22。不過,如果攻擊者指定有效且惡意的語言作業,則會使用父系程序的完整權限來執行這些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。例如,JavaScript 允許叫用 Java 物件,如果攻擊者指定「java.lang.Runtime.getRuntime().exec("shutdown -h now")」作為 operation
的值,則會在主機系統上執行關機指令。
...
userOp = form.operation.value;
calcResult = eval(userOp);
...
operation
參數是良性的值時,例如「8 + 7 * 2」,程式會正常運作。在此案例中,會指定 calcResult
變數的值為 22。不過,如果攻擊者指定同時為有效且惡意的語言作業,則會使用父系程序的完整權限來執行這些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。在 JavaScript 案例中,攻擊者可能使用此弱點執行 Cross-site scripting 攻擊。
...
@property (strong, nonatomic) WKWebView *webView;
@property (strong, nonatomic) UITextField *inputTextField;
...
[_webView evaluateJavaScript:[NSString stringWithFormat:@"document.body.style.backgroundColor="%@";", _inputTextField.text] completionHandler:nil];
...
webView
內的 <body>
元素會具有藍色背景樣式。然而,如果攻擊者提供的惡意輸入仍然有效,便可能可以執行任意 JavaScript 程式碼。例如,由於 JavaScript 可以存取某些類型的私密資訊,如 Cookie,因此如果攻擊者指定 "white";document.body.innerHTML=document.cookie;"" 做為 UITextField 的輸入,則 Cookie 資訊會明顯寫入頁面。當基礎語言提供系統資源的存取權或允許執行系統指令時,這類攻擊會更加危險,因為在那些情況下,會使用父系程序的完整權限來執行插入的程式碼。
...
$userOps = $_GET['operation'];
$result = eval($userOps);
...
operation
參數是良性的值時,例如「8 + 7 * 2」,程式會正常運作。在此案例中,會指定 result
變數的值為 22。不過,如果攻擊者指定同時為有效且惡意的作業,則會使用父系程序的完整權限來執行這些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。例如,如果攻擊者指定「exec('shutdown -h now')」做為 operation
的值,則會在主機系統上執行系統關機指令。
...
userOps = request.GET['operation']
result = eval(userOps)
...
operation
參數是良性的值時,例如「8 + 7 * 2」,程式會正常運作。在此案例中,會指定 result
變數的值為 22。不過,如果攻擊者指定同時為有效且惡意的作業,則會使用父系程序的完整權限來執行這些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。例如,如果攻擊者指定「os.system('shutdown -h now')」做為 operation
的值,則會在主機系統上執行系統關機指令。
...
user_ops = req['operation']
result = eval(user_ops)
...
operation
參數是良性的值時,例如「8 + 7 * 2」,程式會正常運作。在此案例中,會指定 result
變數的值為 22。不過,如果攻擊者指定同時為有效且惡意的語言作業,則會使用父系程序的完整權限來執行這些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。如果使用 Ruby,則允許執行此作業,由於可透過使用分號 (;
) 區隔行來執行多個指令,因此還能夠在不中斷程式的情況下使用簡單插入來執行許多指令。operation
"system(\"nc -l 4444 &\");8+7*2",則此作業會開啟連結埠 4444 以偵聽機器上的連線,且仍然會將值 22 回傳到 result
...
var webView : WKWebView
var inputTextField : UITextField
...
webView.evaluateJavaScript("document.body.style.backgroundColor="\(inputTextField.text)";" completionHandler:nil)
...
webView
內的 <body>
元素會具有藍色背景樣式。然而,如果攻擊者提供的惡意輸入仍然有效,便可能可以執行任意 JavaScript 程式碼。例如,由於 JavaScript 可以存取某些類型的私密資訊,如 Cookie,因此如果攻擊者指定 "white";document.body.innerHTML=document.cookie;"" 做為 UITextField 的輸入,則 Cookie 資訊會明顯寫入頁面。當基礎語言提供系統資源的存取權或允許執行系統指令時,這類攻擊會更加危險,因為在那些情況下,會使用父系程序的完整權限來執行插入的程式碼。
...
strUserOp = Request.Form('operation')
strResult = Eval(strUserOp)
...
operation
的範例。strResult
變數所回傳的值為 22。但是,如果使用者指定其他有效的語言作業,不僅會執行那些作業,還會使用父系程序的完整權限來執行。當基本語言提供系統資源的存取權限或允許執行系統指令時,執行任意的程式碼會變得更加危險。例如:如果攻擊者將 operation
指定為「Shell('C:\WINDOWS\SYSTEM32\TSSHUTDN.EXE 0 /DELAY:0 /POWERDOWN')」,則可能會在主機系統上執行關閉指令。
...
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
ScriptContext newContext = new SimpleScriptContext();
Bindings engineScope = newContext.getBindings(request.getParameter("userName"));
userOps = request.getParameter("operation");
Object result = scriptEngine.eval(userOps,newContext);
...
page_scope
參數是預期的使用者名稱,程式會正常運作。不過,如果攻擊者指定 GLOBAL_SCOPE
的值,操作將會存取由同一個 ScriptEngine
建立的所有引擎中的所有屬性。
...
String address = request.getParameter("address");
Properties props = new Properties();
props.put(Provider_URL, "rmi://secure-server:1099/");
InitialContext ctx = new InitialContext(props);
ctx.lookup(address);
...
string name = Request["username"];
string template = "Hello @Model.Name! Welcome " + name + "!";
string result = Razor.Parse(template, new { Name = "World" });
...
operation
是良性的值時 (例如「John」),程式會正常運作;在此案例中,result
變數指定的值是「Hello World!Welcome John!」。不過,如果攻擊者指定同時為有效且惡意的語言作業,則會使用父系程序的完整權限來執行那些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。舉例來說,Razor 允許呼叫 C# 物件,如果攻擊者指定「@{ System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.EnableRaisingEvents=false; proc.StartInfo.FileName=\"calc\"; proc.Start(); }」 做為 name
的值,則會在主機系統上執行系統指令。
...
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
userOps = request.getParameter("operation");
Object result = scriptEngine.eval(userOps);
...
operation
參數是良性值時,例如「8 + 7 * 2」,程式會正常運作。在此情況下,會指定 result
變數的值為 22。不過,如果攻擊者指定有效且惡意的語言作業,則會使用父系程序的完整權限來執行這些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。例如,JavaScript 允許叫用 Java 物件,如果攻擊者指定「java.lang.Runtime.getRuntime().exec("shutdown -h now")」作為 operation
的值,則會在主機系統上執行關機指令。
...
userOp = form.operation.value;
calcResult = eval(userOp);
...
operation
參數是良性值時,例如「8 + 7 * 2」,程式會正常運作。在此情況下,會指定 calcResult
變數的值為 22。不過,如果攻擊者指定有效且惡意的語言作業,則會使用父系程序的完整權限來執行這些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。在 JavaScript 案例中,攻擊者可能使用此弱點執行 Cross-site scripting 攻擊。
...
strUserOp = Request.Form('operation')
strResult = Eval(strUserOp)
...
operation
的範例。strResult
變數所回傳的值為 22。但是,如果使用者指定其他有效的語言作業,不僅會執行那些作業,還會使用父系程序的完整權限來執行。當基本語言提供系統資源的存取權限或允許執行系統指令時,執行任意的程式碼會變得更加危險。例如:如果攻擊者將 operation
指定為「Shell('C:\WINDOWS\SYSTEM32\TSSHUTDN.EXE 0 /DELAY:0 /POWERDOWN')」,則可能會在主機系統上執行關閉指令。Delegate
欄位會在還原序列化類別時,引入任意程式碼執行漏洞。Delegate
類型用於保留方法呼叫的參考,該方法呼叫可於稍後在使用者程式碼中叫用。.NET 會使用自訂的序列化方法來序列化 Delegate
類型,並利用 System.DelegateSerializationHolder
類別來儲存附加至或歸屬於 Delegate
的方法資訊。Delegate
物件的已序列化串流不適合持續性儲存或傳遞至遠端應用程式,因為攻擊者可以將方法資訊取代為指向惡意物件圖形的方法資訊,所以攻擊者將可以執行任意程式碼。Delegate
欄位,並且會在 Executor
方法中叫用:
...
[Serializable]
class DynamicRunnner
{
Delegate _del;
string[] _arg;
public DynamicRunnner(Delegate dval, params string[] arg)
{
_del = dval;
_arg = arg;
}
public bool Executor()
{
return (bool)_del.DynamicInvoke(_arg);
}
}
...
Example 1
中提及之類別的不受信任的串流,攻擊者將方法資訊取代為指向 Process.Start
的方法資訊,將會導致在呼叫 Executor
方法時建立任意程序。BeanUtilsHashMapper
來還原序列化 Redis 雜湊,這樣做可能會讓攻擊者控制此類雜湊來執行任意程式碼。
HashMapper<Person, String, String> hashMapper = new BeanUtilsHashMapper<Person>(Person.class);
Person p = hashMapper.fromHash(untrusted_map);
Stream
物件做為輸入,並將其還原序列化回 .NET 物件。然後在將其轉換為字串物件清單後傳回結果:
...
List <string> Deserialize(Stream input)
{
var bf = new BinaryFormatter();
var result = (List <string>)bf.Deserialize(input);
return result;
}
...
Example 1
可以按如下方式進行重寫:
...
List <string> Deserialize(Stream input)
{
var bf = new BinaryFormatter();
object tmp = bf.Deserialize(input);
List <string> result = (List <string>)tmp;
return result;
}
...
Example 2
中,只要輸入串流有效,無論類型是否為 List <string>
,還原序列化作業都會成功。bin
資料夾或位於 GAC
中且攻擊者不能插入的可序列化類別中,會定義自訂還原序列化常式,所以這些攻擊的可利用性取決於應用程式環境中的可用類別。遺憾的是,常見的第三方類別、甚至是 .NET 類別可能會被濫用於耗盡系統資源、刪除檔案、部署惡意檔案或執行任意程式碼。
The pickle module is not intended to be secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source.
__reduce__
方法聲明其應如何還原序列化。此方法應傳回 callable
及其引數。Pickle 將使用提供的引數呼叫 callable 來建構新物件,允許攻擊者執行任意指令。enable_unsafe_deserialization()
會允許攻擊者將 lambda 或其他 Python 可呼叫物件還原序列化。雖然此功能對於彈性和還原複雜模型非常有用,但如果序列化資料可被利用,則會帶來弱點。
import tensorflow as tf
tf.keras.config.enable_unsafe_deserialization()
model = tf.keras.models.load_model('evilmodel_tf.keras')
model([])
XStream
處理不可信賴輸入的範例。
XStream xstream = new XStream();
String body = IOUtils.toString(request.getInputStream(), "UTF-8");
Contact expl = (Contact) xstream.fromXML(body);
var yamlString = getYAMLFromUser();
// Setup the input
var input = new StringReader(yamlString);
// Load the stream
var yaml = new YamlStream();
yaml.Load(input);
var yaml = require('js-yaml');
var untrusted_yaml = getYAMLFromUser();
yaml.load(untrusted_yaml)
import yaml
yamlString = getYamlFromUser()
yaml.load(yamlString)
範例 1:以下 XML 文件將個體化 ProcessBuilder 物件,並叫用其靜態 start() 方法以執行 Windows 小算盤。
XMLDecoder decoder = new XMLDecoder(new InputSource(new InputStreamReader(request.getInputStream(), "UTF-8")));
Object object = decoder.readObject();
decoder.close();
<java>
<object class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="1" >
<void index="0">
<string>c:\\windows\\system32\\calc.exe</string>
</void>
</array>
<void method="start"/>
</object>
</java>
範例 2:該應用程式可在執行雙重 SpEL 評估的 Spring 標籤中使用由使用者所控制的未驗證的資料。
String expression = request.getParameter("input");
SpelExpressionParser parser = new SpelExpressionParser();
SpelExpression expr = parser.parseRaw(expression);
<spring:message text="" code="${param['message']}"></spring:message>
sprintf()
、FormatMessageW()
或 syslog()
。snprintf()
將指令行引數複製到緩衝區內。
int main(int argc, char **argv){
char buf[128];
...
snprintf(buf,128,argv[1]);
}
%x
) 從堆疊讀取,然後函數會取得即將格式化的引數。(在此範例中,函數沒有取得即將格式化的引數。)透過使用 %n
格式化指令,攻擊者可能寫入堆疊,導致 snprintf()
將輸出的位元組數寫入到指定的引數 (而不是如預期從引數讀取值)。這種攻擊的一種繁瑣複雜的形式會使用四條交錯的輸入來完全控制堆疊中一個指標的數值。
printf("%d %d %1$d %1$d\n", 5, 9);
5 9 5 5
Example 1
中所提到的一樣。syslog()
函數有時候以如下形式使用:
...
syslog(LOG_ERR, cmdBuf);
...
syslog()
的第二個參數是個 Format String,所以任何包含在 cmdBuf
內的格式化指令都會被解譯,如 Example 1
中所述。syslog()
的正確使用方式:
...
syslog(LOG_ERR, "%s", cmdBuf);
...
sprintf()
、FormatMessageW()
、syslog()
、NSLog
或NSString.stringWithFormat
範例 1:以下程式碼在 NSString.stringWithFormat:
中使用指令行引數作為格式字串。
int main(int argc, char **argv){
char buf[128];
...
[NSString stringWithFormat:argv[1], argv[2] ];
}
%x
) 從堆疊讀取,然後函數會取得即將格式化的引數。(在此範例中,函數沒有取得即將格式化的引數。)
printf("%d %d %1$d %1$d\n", 5, 9);
5 9 5 5
Example 1
中所提到的一樣。syslog()
函數有時候以如下形式使用:
...
syslog(LOG_ERR, cmdBuf);
...
syslog()
的第二個參數是個 Format String,所以任何包含在 cmdBuf
內的格式化指令都會被解譯,如 Example 1
中所述。syslog()
的正確使用方式:範例 4:Apple 核心類別留下了危險的途徑,可藉此利用 Format String 弱點。
...
syslog(LOG_ERR, "%s", cmdBuf);
...
String.stringByAppendingFormat()
函數有時候以如下形式使用:
...
NSString test = @"Sample Text.";
test = [test stringByAppendingFormat:[MyClass
formatInput:inputControl.text]];
...
stringByAppendingFormat()
的正確使用方式:
...
NSString test = @"Sample Text.";
test = [test stringByAppendingFormat:@"%@", [MyClass
formatInput:inputControl.text]];
...
=cmd|'/C calc.exe'!Z0
。如果開啟試算表 (在此範例中為開啟 Windows 小算盤) 的使用者信任文件來源,則會接受由試算表處理器顯示的所有安全性提示並讓裝載執行於其系統之上。
public void Service()
{
string name = HttpContext.Request["name"];
string data = GenerateCSVFor(name);
HttpContext.Response.Clear();
HttpContext.Response.Buffer = true;
HttpContext.Response.AddHeader("content-disposition", "attachment;filename=file.csv");
HttpContext.Response.Charset = "";
HttpContext.Response.ContentType = "application/csv";
HttpContext.Response.Output.Write(tainted);
HttpContext.Response.Flush();
HttpContext.Response.End();
}
=cmd|'/C calc.exe'!Z0
。如果開啟試算表 (在此範例中為開啟 Windows 小算盤) 的使用者信任文件來源,則會接受由試算表處理器顯示的所有安全性提示並讓裝載執行於其系統之上。
func someHandler(w http.ResponseWriter, r *http.Request){
r.parseForm()
foo := r.FormValue("foo")
...
w := csv.NewWriter(file)
w.Write(foo)
}
=cmd|'/C calc.exe'!Z0
。如果開啟試算表 (在此範例中為開啟 Windows 小算盤) 的使用者信任文件來源,則會接受由試算表處理器顯示的所有安全性提示並讓裝載執行於其系統之上。
@RequestMapping(value = "/api/service.csv")
public ResponseEntity<String> service(@RequestParam("name") String name) {
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.add("Content-Type", "application/csv; charset=utf-8");
responseHeaders.add("Content-Disposition", "attachment;filename=file.csv");
String data = generateCSVFor(name);
return new ResponseEntity<>(data, responseHeaders, HttpStatus.OK);
}
=cmd|'/C calc.exe'!Z0
。如果開啟試算表 (在此範例中為開啟 Windows 小算盤) 的使用者信任文件來源,則會接受由試算表處理器顯示的所有安全性提示並讓裝載執行於其系統之上。
@RequestMapping(value = "/api/service.csv")
fun service(@RequestParam("name") name: String): ResponseEntity<String> {
val responseHeaders = HttpHeaders()
responseHeaders.add("Content-Type", "application/csv; charset=utf-8")
responseHeaders.add("Content-Disposition", "attachment;filename=file.csv")
val data: String = generateCSVFor(name)
return ResponseEntity(data, responseHeaders, HttpStatus.OK)
}
PreferenceActivity
的 Android 活動無法限制可個體化的片段類別。PreferenceActivity
,並為其額外提供 :android:show_fragment
意圖以使其載入任意類別。 惡意應用程式會讓 PreferenceActivity
載入易受攻擊應用程式的任意 Fragment
(一般在未匯出的活動內載入),從而將其暴露給攻擊者。
@Override
public static boolean isFragmentValid(Fragment paramFragment)
{
return true;
}