CLR 中代码访问安全检测实现原理(3)
对检测某个组件是否拥有权限的 CodeAccessCheckStackWalkCB 函数 (ComCodeAccessSecurityEngine.cpp:449) 来说,其主要工作如下:
以下内容为程序代码:
enum StackWalkAction {
SWA_CONTINUE = 0, // continue walking
SWA_ABORT = 1, // stop walking, early out in "failure case"
SWA_FAILED = 2 // couldn't walk stack
};
// 堆栈帧的封装类
class CrawlFrame {
// ...
};
static StackWalkAction CodeAccessCheckStackWalkCB(CrawlFrame* pCf, VOID* pData)
{
// CheckInternal 填充的检测数据
CheckWalkHeader *pCBdata = (CheckWalkHeader*)pData;
// 获取当前帧的相关信息
MethodDesc * pFunc = pCf->GetFunction();
Assembly *pAssem = pFunc->GetModule()->GetAssembly();
AppDomain *pAppDomain = pCf->GetAppDomain();
// 遍历操作回调函数的返回动作,SWA_CONTINUE 继续;SWA_ABORT 中断;SWA_FAILED 失败。
StackWalkAction action ;
// 跳过特殊情况的帧
if (Security::SecWalkCommonProlog (&(pCBdata->prologData), pFunc, &action, pCf))
return action ;
if (pAssem != pCBdata->pPrevAssembly)
{
// 当 Assembly 变化时进行 CAS 检测
// ...
pCBdata->pPrevAssembly = pAssem;
}
if (pAppDomain != pCBdata->pPrevAppDomain)
{
// 当 AppDomain 变化时进行 CAS 检测
// ...
pCBdata->pPrevAppDomain = pAppDomain;
}
OBJECTREF *pFrameObjectSlot = pCf->GetAddrOfSecurityObject();
if (pFrameObjectSlot != NULL && *pFrameObjectSlot != NULL)
{
// 当帧保护安全对象时进行 CAS 检测
// ...
}
return SWA_CONTINUE;
}
从当前帧中可以获取各种需要检测的信息,如方法、Assembly和AppDomain。只有当 Assembly 或 AppDomain 发生变化时,对新的对象进行 CAS 检测,同时如果帧具有显式的安全对象,也要进行 CAS 检测。不过对于符合 Security::SecWalkCommonProlog 函数 (Security.cpp:406) 定义的特殊帧,将完全跳过 CAS 检测。
Tags:
作者:郁郁小蝎评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论