JVM注解@CallSensitive
@CallSensitive是JVM中專用的注解缩膝,在類加載過過程中是可以常常看到這個注解的身影的,@CallSensitive用來找到真正發(fā)起反射請求的類
@CallSensitive的使用
@CallerSensitive
public static Class<?> forName(String className)
throws ClassNotFoundException {
Class<?> caller = Reflection.getCallerClass();
return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}
注意:Reflection.getCallerClass()方法調(diào)用所在的方法必須用@CallerSensitive進(jìn)行注解
這個注解是為了堵住漏洞用的。曾經(jīng)有黑客通過構(gòu)造雙重反射來提升權(quán)限,原理是當(dāng)時反射只檢查固定深度的調(diào)用者的類陋守,看它有沒有特權(quán),例如固定看兩層的調(diào)用者(getCallerClass(2))利赋。如果我的類本來沒足夠權(quán)限群訪問某些信息水评,那我就可以通過雙重反射去達(dá)到目的:反射相關(guān)的類是有很高權(quán)限的,而在 我->反射1->反射2 這樣的調(diào)用鏈上媚送,反射2檢查權(quán)限時看到的是反射1的類中燥,這就被欺騙了,導(dǎo)致安全漏洞塘偎。使用CallerSensitive后疗涉,getCallerClass不再用固定深度去尋找actual caller(“我”),而是把所有跟反射相關(guān)的接口方法都標(biāo)注上CallerSensitive吟秩,搜索時凡看到該注解都直接跳過咱扣,這樣就有效解決了前面舉例的問題
參考資料