gpt4 book ai didi

c# - 有人可以在继承Windows控件时解释此LinkDemand警告吗?

转载 作者:太空狗 更新时间:2023-10-29 20:45:03 25 4
gpt4 key购买 nike

我有这个HeaderlessTabControl,它继承了经典的TabControl。

// From http://social.msdn.microsoft.com/forums/en-US/winforms/thread/c290832f-3b84-4200-aa4a-7a5dc4b8b5bb/
// Author: Hans Passant (nobugz)
public class HeaderlessTabControl : TabControl {
protected override void WndProc(ref Message m) {
// Hide tabs by trapping the TCM_ADJUSTRECT message
if (m.Msg == 0x1328 && !DesignMode) {
m.Result = (IntPtr)1;
} else {
base.WndProc(ref m);
}
}
}

当我在项目上运行代码分析时,会收到以下警告:

Warning 1 CA2122 : Microsoft.Security : 'HeaderlessTabControl.WndProc(ref Message)' calls into 'Message.Msg.get()' which has a LinkDemand. By making this call, 'Message.Msg.get()' is indirectly exposed to user code. Review the following call stack that might expose a way to circumvent security protection: ->'HeaderlessTabControl.WndProc(ref Message)'
->'HeaderlessTabControl.WndProc(ref Message)'



...以及与 Message.Msg.set()TabControl.WndProc()有关的两个类似警告。我知道我已经通过执行此操作公开了一些代码。有人可以解释一下我可能在这里打开的什么样的安全漏洞,以及解决该漏洞的可能方法吗?

最佳答案

I guess what I am asking is, what possible security holes should I be looking for?



让我给您五分钟的“传统” .NET代码访问安全性概述。 (我们有一个更新的,简化的安全模型,应将其用于新代码,但了解底层安全模型会有所帮助。)

这个想法是,程序集可以提供证据-诸如它们的位置,编写者等等。策略使用证据并产生与该程序集关联的一组授予权限。

尝试执行需要特定权限的操作(例如,创建对话框或访问打印机或写入文件)时,运行时会发出对该权限的要求。需求检查当前“在堆栈上”的代码,以确定直接或间接调用当前代码的所有代码。 (*)

需求说明必须已授予堆栈上的每个调用方所需的权限。这样可以防止诱骗攻击,即恶意的低信任度代码调用良性的高信任度代码并将其“诱骗”为代表其执行某些危险的操作,从而伤害用户。由于完全需求检查直接和间接调用者,因此诱骗攻击得以克服。

断言允许高信任度代码修改需求语义。一条断言说:“我是良性的高信任度代码,并且断言我不能被低信任度的敌对调用者所诱使我代表它执行危险的操作。”断言通常与较弱的需求配对。也就是说,高信任度代码断言“即使调用者不能,我也可以安全地调用非托管代码”,然后要求“但调用者最好具有访问打印机的权限,因为这就是我要处理非托管代码的方式。代码权限”。

需求的问题在于它们很昂贵。您必须进行完整的堆栈遍历,并查看每个人的权限集。如果操作很便宜-例如,调整位图中的像素-您不想每次都满足全部需求,因为您会花费所有时间进行冗余安全检查。

因此,链接需求。每个 protected 方法的调用者都会执行一次链接请求,这是第一次使用调用 protected 方法的代码,并且它仅检查 protected 方法的直接调用者,而不执行完整的堆栈遍历。此后,将执行链接要求的代码操作,而不会对该调用方进行安全检查。 (实际上应该将其称为“jit需求”,而不是“link需求”,因为使用的机制是在调用者被j住时检查需求。)

显然,这很便宜-每个调用者仅查看一个程序集的一张支票比查看堆栈中每个程序集的每个调用的一张支票便宜-而且更危险。

链接需求基本上是不合算的。链接需求显示“调用者,通过我的链接需求检查,您可以从现在开始以便宜的价格给我打电话。但是我现在正在关闭安全系统,因此,您现在有责任确保您的调用者无法成功攻击该调用者。充分利用我授予您的权利,即日后无需进行安全检查就可以给您调用我。”

您正在调用具有链接需求的方法。因此,您面临的问题是: 您愿意承担这一责任吗? 您可以廉价地调用该方法。您是否愿意 保证,确保没有低信任度的敌对调用者可以使用未经安全检查损害用户的事实而调用该方法的事实?

如果您不愿意或无法做到这一点,请发出您自己对链接请求权限的要求;然后,您的所有来电者都必须满足要求。或者,将成本推销给您的调用者:向调用者发出链接请求,并让他们进行工作。

(*)正如我喜欢指出的那样,调用堆栈实际上并没有告诉您谁给您打电话,而是告诉您下一步控制将转到何处。由于这些通常是同一件事,所以一切正常。可能会遇到“谁打给你?”的情况。与“你下一步要去哪里?”离婚了;在那些环境中,您必须非常小心使用传统风格的代码访问安全性。较新的“沙盒”安全模型更适合这些情况。

关于c# - 有人可以在继承Windows控件时解释此LinkDemand警告吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9151738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com