攻击面分析在概念上很简单。 这就像在房子里走来走去,计数所有的门窗,然后检查它们是否打开或容易强行打开。 您所拥有的门窗越少,打开门的难度就越大,您就越安全。 系统的攻击面越大,您遇到的安全性问题就越大 ,并且必须在安全性程序中进行更多的工作。
对于企业系统和Web应用程序,门窗包括Web URL(每种形式,输入字段-包括隐藏字段,URL参数和脚本),Cookie,在应用程序外部共享的文件和数据库,打开的端口和套接字,外部系统调用和应用程序API,管理员用户ID和功能。 如果允许的话,以及应用程序中的任何支持后门 。
我不会通过关闭功能或删除代码来最小化攻击面 。 当然,这样做很重要,但是大多数开发人员都会得到酬劳以添加新功能并编写更多表单和其他界面,从而打开攻击面。 因此,重要的是要了解这意味着安全风险。
测量系统的攻击面
微软和其他研究人员的迈克尔·霍华德(Michael Howard)开发了一种方法,用于测量应用程序的攻击面并跟踪随时间变化的攻击面,称为相对攻击面商(RSQ) 。
使用此方法,您可以计算系统的总体攻击面分数,并在对系统及其部署方式进行更改时测量该分数。 卡耐基梅隆大学的研究人员在这项工作的基础上,开发出一种正式的方法来计算大型系统(如SAP)的攻击面度量 。 他们将攻击面计算为所有入口和出口点,通道(客户端或外部系统连接到系统的不同方式,包括TCP / UDP端口,RPC端点,命名管道…)和不可信数据元素的总和。 然后,他们对这些“攻击面”元素施加潜在的破坏/努力比率,以识别高风险区域。
较小的团队可以构建和维护较小的系统(这是我们中的大多数人),而敏捷团队尝试快速移动则不需要走那么远。 管理系统的攻击面可以通过开发人员可以理解并掌握所有权的几个简单步骤来完成。
攻击面:从哪里开始?
如果可以的话,从某种基准开始–至少对系统的攻击面有基本的了解。 从攻击面的角度花几个小时来审查设计和体系结构文档。 对于Web应用程序,您可以使用Arachni或Skipfish或w3af之类的工具,或者使用许多商业动态测试和漏洞扫描工具或服务之一来爬网您的应用程序并映射攻击面-至少是可通过以下方式访问的系统部分:网络。 或者,最好让一位appsec专家来审查该应用程序并对其进行笔测试,以便您了解攻击面和实际漏洞。
有了攻击面的地图后,请确定高风险区域。 着重于远程入口点–与外部系统和Internet的接口–特别是在系统允许匿名,公共访问的地方。 这是您最容易受到攻击的地方。 然后了解现有的补偿控件,网络防火墙和应用程序防火墙等操作控件以及有助于保护您的应用程序的入侵检测或防御系统。
攻击面模型将是粗糙且不完整的,特别是如果您之前没有在系统上进行任何安全性工作的话。 在团队对攻击面进行更改时,请使用已有的内容并填补漏洞。 但是,您如何知道何时更改攻击面?
您何时更改攻击面?
“……重要的是要了解,一旦编写一行代码,攻击面就会增加。”
但这超过了进行代码更改的风险–存在许多代码更改(例如,幕后报告和分析以及业务逻辑更改)不会使系统更容易受到攻击。 请记住,攻击面是系统中入口点和出口点以及不可信数据元素的总和。
添加新的系统接口,进入系统的新通道,新的连接类型,新的API,新的客户端类型,新的移动应用程序或与外部共享的新文件或数据库表–这些更改将直接影响攻击Surface并更改应用程序的风险状况。 您创建的第一个网页大大打开了系统的攻击面,并引入了各种新风险。 如果您向该页面或类似的其他页面添加另一个字段,但从技术上讲,您已经扩大了攻击面,但您并没有以有意义的方式提高应用程序的风险。 除非您采用新的设计或使用新的框架,否则这些增量更改中的每一个都是相同的。
会话管理,身份验证和密码管理的更改也会影响攻击面。 更改授权和访问控制逻辑也是如此,尤其是添加或更改角色定义,添加具有高特权的admin用户或admin功能。 更改处理加密和机密的代码。 更改数据验证的方式。 以及对层次结构和信任关系的重大体系结构更改,或技术体系结构的根本更改-换出Web服务器或数据库平台,或更改运行时操作系统。
使用基于风险和基于机会的方法
在您不断发展的需求的驱动下,可以以机会主义的方式进行攻击面管理。 当他们在系统的某个部分上工作时,团队将审查更改是否以及如何影响攻击面,存在哪些风险,并提出进一步审核的标志。 这些危险信号推动了威胁建模 ,安全代码审查和其他测试。
这意味着开发人员可以专注于交付功能,同时仍然负责安全性。 攻击面审查已成为设计,质量保证和风险管理的一部分,已融入团队的工作方式,并在每个阶段或阶段或冲刺中按需完成 。
第一次接触系统时,完成更改可能需要更长的时间,因为您需要进行更多的风险评估。 但是随着时间的流逝,当您处理系统的相同部分或出现相同的问题时,随着对应用程序的了解和对安全风险的了解的增加,它会变得越来越简单和快捷。
您对系统攻击面的了解可能永远不会是完美或完整的-但您将始终在对其进行更新和改进。 新的风险和漏洞将不断出现。 发生这种情况时,您将新项目添加到风险清单中,需要注意新的危险标记。 只要系统得到维护,您就永远不会完成攻击面管理。
参考: JCG合作伙伴提供的 基本攻击面管理 Building Real Software博客上的Jim Bird。
翻译自: https://www.javacodegeeks.com/2012/02/essential-attack-surface-management.html