Security Briefs...小心完全信任的代码
2006-07-20 11:40:01 来源:WEB开发网核心提示:大多数的托管应用程序都以完全信任环境下运行,然而,Security Briefs...小心完全信任的代码,根据我自己的经验,在给那些经验丰富的开发人员讲授 .NET 安全问题的时候,任何程序集都可以用一个标志来标记自身,技术上称作许可请求,我发现他们大多数 人都没有理解完全信任代码的真正含义,我收集了很多例子
大多数的托管应用程序都以完全信任环境下运行。然而,根据我自己的经验,在给那些经验丰富的开发人员讲授 .NET 安全问题的时候,我发现他们大多数 人都没有理解完全信任代码的真正含义。我收集了很多例子,在这些例子中,完全信任的代码可以绕过通用语言运行时(CLR)的安全特性。 每个例子都以一个提问开始,而每个问题的答案似乎都显而易见。
CLR 是否会在运行以前检查所有的代码?
很多CLR的安全特性是基于类型安全的。以一个简单的包含私有成员的类为例。CLR 会在运行时限制对私有成员的访问。但是,这 只有在使用合法手段进行访问时才成立。考虑如下非托管 C++ 类定义:class DiskQuota {
private:
long MinBytes;
long MaxBytes;
};
我之所以要在这里选择非托管 C++,是因为它将示范当类型系统被破坏时,下面这段程序是如何被利用进行类型诈骗的:
void EvilCode(DiskQuota* pdq) {
// use pointer arithmetic to index
// into the object wherever we like!
((long*)pdq)[1] = MAX_LONG;
}
通过使用指针和不安全的强制类型转换,攻击者可以访问甚至修改某个类的私有成员。在非托管代码中,运行时没有提供针对这方面的保护 。然而,CLR 被设计成能在 JIT 编译期间(在此特殊情况下的不安全指针运算)探测到这种滥用类型的行为并产生一个异常。缓冲区溢出是另外一个 违反类型系统的例子,它会导致令人厌恶的安全漏洞。CLR 通过保证所有代码的类型安全来封堵这些漏洞,是这样吗?
是的,除非你搬起石头砸自己的脚,盲目信任这些程序集。任何程序集都可以用一个标志来标记自身,技术上称作许可请求,它告诉 CLR 跳过对 代码的安全检查。下面是一个 C# 例子:
更多精彩
赞助商链接