12

我不确定这是否是主题,但它是如此特定于 .NET WinForms,我相信它在这里比在 Security stackexchange 站点更有意义。

(此外,它与安全编码严格相关,我认为它与任何关于我在整个网站上看到的常见网站漏洞的问题一样重要。)

多年来,我们的团队一直在对网站项目进行威胁建模。我们模板的一部分包括OWASP前 10 名以及其他众所周知的漏洞,因此当我们进行威胁建模时,我们始终确保我们有一个记录在案的流程来解决这些常见漏洞中的每一个。

例子:

SQL 注入 (Owasp A-1)

  • 标准实践
    • 尽可能使用存储参数化过程来访问数据
    • 如果存储过程不可行,请使用参数化查询。(使用我们无法修改的第 3 方数据库)
    • 仅当上述选项不可行时才转义单引号
    • 数据库权限必须按照最小权限原则设计
    • 默认情况下,用户/组无权访问
    • 在开发过程中,记录每个对象(表/视图/存储过程)所需的访问权限以及访问的业务需求。
    • [剪辑]

无论如何,我们使用 OWASP Top 10 作为网站特定漏洞的起点。

(最后是问题)

在极少数情况下,当 Web 应用程序不能满足需求时,我们会开发 WinForms 或 Windows 服务应用程序。我想知道是否有 WinForms 应用程序的常见安全漏洞的等效列表。

在我的头顶上,我能想到一些......

  • SQL 注入仍然是一个问题。
  • CLR 通常可以防止缓冲区溢出,但如果将非托管代码与托管代码混合使用则更有可能
  • .NET 代码可以反编译,因此将敏感信息存储在代码中,而不是在 app.config 中加密...

是否有这样一个列表,甚至是这样一个列表的多个版本,我们可以从中借用来创建我们自己的列表?如果是这样,我在哪里可以找到它?

我一直没能找到它,但如果有的话,这对我们以及其他 WinForms 开发人员都会有很大帮助。

4

3 回答 3

12

Web 环境和桌面环境之间存在很大差异。在开发网站和服务时,您不信任的是用户(用户输入)。在运行桌面应用程序时,不受信任的是应用程序本身,或者至少,系统管理员想知道应用程序本身是否不会造成任何伤害,因为在本地计算机上运行的代码是有风险的通过它自己。

所以从某种意义上说,对于作为桌面应用程序开发人员的您来说,安全规则并不总是适用,因为您运行的应用程序不是黑盒子,而是白盒子。对于 Web 服务/站点,您希望攻击无法更改内部状态,但对于任何桌面应用程序(Java、.NET、本机),在应用程序运行时更改应用程序状态“相当”容易运行,尤其是使用 Java 和 .NET,调试和反编译应用程序非常容易。

换句话说,您必须考虑到桌面应用程序已完全受损,如果这是一种风险,您必须将所有必须安全的内容(身份验证、授权、验证)提取到外部(Web)服务中。对于此服务,“正常”OWASP 规则适用。

您应该注意的是,当桌面应用程序直接连接到数据库时,很难完全保护您的数据层。例如,在这种情况下,SQL 注入对于您的桌面应用程序来说不是问题,因为当应用程序可以直接连接到数据库时,用户也可以。如果用户可以连接到数据库,他就可以执行任意查询。这是一种极端形式的 SQL 注入,但它完全跳过了您的应用程序。

试图保护 2 层应用程序,通常意味着使用存储过程作为中间(服务)层(并防止直接访问表)。开发和维护存储过程比开发 .NET (web) 服务的成本要高得多。

于 2012-07-05T15:13:16.987 回答
4

也许您想调查检查安全漏洞的现有工具。他们有时会列出要检查的缺陷。

托管代码中仍然存在所有可能的安全风险,因为开发人员可以打开各种漏洞。框架 (.NET) 本身没有风险,但开发人员有风险。

在这里你有一个工具列表,你可以在那里阅读他们将检查哪些安全风险:

静态代码分析列表

但是,当然,存在已知的漏洞,如您在此处看到的:

technet 远程代码执行

technet 特权提升

还有更多已知且未解决的缺陷,可以在知名的安全站点上找到。(包括零日攻击)

**更多详细信息,这是我在评论中提到的清单**

MS 安全清单(不知道为什么这是“退休”,因为这主要是中性信息

打开 Web 应用程序安全项目

MS 反跨站点脚本

MS ASP 安全参考实现(非常好的资料网站)

CAT.NET ... MS 静态安全分析工具

于 2012-07-06T08:19:54.637 回答
1

恐怕不可能构建一个实际上安全的本地 Winform 应用程序,因为用户总是可以破解您的应用程序。

但是有一些技术可以减缓破解过程。大多数技术发生在组装层,例如垃圾代码和包装。

另一种技术是使您的可执行代码(即程序执行时进入内存的代码)随时间变化。但是,您必须首先确保所有其他代码(然后不执行)是安全的。这可以通过加密来完成。但是您还必须确保加密程序的安全性更高。加密程序始终固定在 ROM 中,并通过物理方式进行保护。

另一种方法是利用网络。经常更新本地应用程序并禁止使用旧版本。这样,您的代码可能会以足够快的速度变化以击败破解过程。

哦……我是在扔垃圾还是只是跑题了?我很抱歉。

于 2012-07-15T07:01:49.763 回答