
我们提醒您注意软件开发人员的十大主动控制-软件开发人员应重点关注的10个安全方面。 本文包含开发每个新项目时需要实施的安全技术的列表。
保护不足的软件会破坏关键基础设施的安全性,例如医疗保健,国防,能源或金融。 我们的全球数字基础架构变得越来越复杂,其组件之间的关系越来越多,因此应用程序安全的重要性正呈指数级增长。 相对简单的安全威胁不再被忽略。
OWASP
开放Web应用程序安全项目(OWASP)是一个开放源Web应用程序安全项目。 OWASP社区包括来自世界各地的公司,教育组织和个人。 OWASP正在研究可公开访问的文章,教程,文档,工具和技术。
OWASP项目由许多标准,工具和组织引用,包括MITRE,PCI DSS,DISA,FTC等。
主动防御:OWASP Top-10需求项目与
OWASP Top-10项目相似,但它侧重于防范威胁的方法和建议,而不是威胁本身。 本文档中的每种方法和建议都与OWASP Top-10列表中的一个或多个威胁相关。
目的和目的
主动防御:OWASP十大需求项目的目标是通过解决软件开发人员应考虑的信息安全最重要方面来吸引对应用程序安全的关注。 我们鼓励组织利用OWASP的主动防御建议,并教给开发人员如何注意应用程序安全性,并重视其他组织中发生的错误。 我们希望OWASP建议对您创建安全应用程序有用。
目标受众
该文档主要供开发人员使用。 但是,这对于开发经理,产品经理,质量保证专家,项目经理以及软件创建过程中的其他参与者将很有用。
十大主动防御要求
C1:安全要求的定义
安全要求描述了提供某些软件安全设置所必须实现的功能。 它们基于行业标准,适用法律和漏洞数据。 需求定义了需要开发或进一步开发的功能,以解决特定的安全问题或消除潜在威胁。
OWASP应用程序安全认证标准(ASVS)是可用安全要求和验证选项的目录。 OWASP ASVS可以为开发团队提供高级安全要求。
安全要求是根据常见的更高级别的安全功能进行分类的。 例如,ASVS包含以下类别:身份验证,访问控制,错误处理和日志记录以及Web服务。 对于每个类别,都有一个建议检查的参数列表。
成功应用安全要求的过程包括四个阶段:搜索和选择,文档编制,实施,确认新安全功能和应用程序功能的正确实施。
C2:使用安全框架和库
具有内置安全功能的安全库和框架可帮助开发人员在开发和实施阶段避免漏洞。 从头开始构建应用程序的开发人员可能没有足够的知识,时间或金钱来实现或维护应用程序的安全性。 使用安全框架可以提高应用程序安全性。
当您在软件中包含第三方库或框架时,应考虑以下建议:
C3:提供对数据库的安全访问
本节致力于提供对所有数据仓库(包括关系数据库和NoSQL数据库)的安全访问。
对应用程序安全性的最严重威胁之一是SQL注入。 这种攻击很容易实现:如果将不受信任的输入动态添加到SQL查询中,则可以注入SQL代码,这通常是通过将它们附加到主线上来实现的。 利用此漏洞可能导致数据库被盗,删除或更改。 该应用程序还可用于在包含您的数据库的系统上执行恶意命令,这将使攻击者能够在网络中立足。
为防止SQL注入,您必须避免将未经验证的输入解释为SQL命令的一部分。 最好的解决方案是使用“查询参数化”方法。 此方法必须应用于SQL和OQL构造以及存储过程。
有关ASP,ColdFusion,C#,Delphi,.NET,Go,Java,Perl,PHP,PL / SQL,PostgreSQL,Python,R,Ruby和Scheme的查询参数化的示例可以在
http://bobby-tables.com和上找到在
OWASP备忘录中用于查询参数化 。
C4:数据编码和屏蔽
编码和转义是防止代码注入的方法。 编码,也称为“输出编码”,是将特殊字符转换为对解释器无危险的等效组合。 例如,当字符<添加到HTML页面时,它会转换为组合<。 转义包括在字符或行之前添加特殊字符以防止错误解释,例如,在“(双引号)之前添加字符\允许您将其解释为文本的一部分,而不是行终止符。
最好在将数据传递到解释器之前立即应用编码。 如果在处理请求时过早应用此方法,则编码或屏蔽可能会影响程序其他部分中内容的使用。 例如,如果HTML内容在保存到数据库之前被转义,并且界面再次自动转义此数据,则由于两次转义,该内容将无法正确显示。
编码或转义可用于防止其他形式的内容嵌入。 例如,当输入系统命令的数据时,您可以取消某些特殊的元字符。 这称为“转义OS命令”,“转义Shell”等。 这样的保护可以用来防止“命令注入”。
还可以使用其他形式的转义来防止注入,例如,转义防止各种形式的XML和XML路径嵌入的XML属性,并转义唯一的LDAP名称以防止各种LDAP注入。
C5:强制验证所有输入
输入数据的验证是编程技术的一部分,该技术可确保只有正确格式化的数据才能进入程序组件。
句法和语义规范
在使用数据之前(包括向用户显示),应用程序必须检查数据是否符合语法和语义规范(按此顺序)。
句法规范意味着数据与预期表示相匹配。 例如,在应用程序中,用户可以指定一个四位数的“标识符”来执行某些操作。 攻击者可以输入允许其注入SQL代码的数据,因此,应用程序必须验证输入的数据是否完全是数字,是否完全是四个字符(除了使用适当的查询参数化外)。
语义规范意味着仅使用输入数据,而不会超出某些功能和上下文。 例如,在指定时间范围时,开始日期必须早于结束日期。
白名单和黑名单
检查输入语法的主要方法有两种:黑名单检查和白名单检查。
第一种方法旨在搜索数据中的“潜在有害”内容。 例如,Web应用程序可能阻止包含单词SCRIPT的输入,以防止跨站点脚本编写。 但是,可以通过对脚本标签使用小写字母或大小写字母的组合来规避此保护措施。
第二种方法旨在确认数据是否符合一组“测试”规则的要求。 例如,美国州白名单将在现有美国州列表中寻找2个字母的代码。
创建安全软件时,建议至少将其列入白名单。 黑名单可能包含错误,可以通过多种方式规避,而且本身也很危险。 尽管可以绕过黑名单的限制,但它们对于检测明显的攻击很有用。 因此,白名单通过验证数据是否符合语法和语义规范来帮助限制攻击的可能性,而黑名单则有助于检测和阻止明显的攻击。
客户端和服务器端检查
为了确保安全性,必须始终在服务器端进行输入验证。 客户端检查在功能和安全性方面可能很有用,但通常很容易绕开。 因此,对于安全性而言,服务器端验证是可取的。 例如,检查JavaScript可以警告用户该字段应仅包含数字,但是服务器端的应用程序应确认输入数据是可接受值范围内的数字。
C6:实施数字识别
数字标识是在线交易中用户(或任何其他对象)的唯一表示。 认证是确认一个人或实体是谁的过程。 会话管理是服务器监视用户身份验证状态的过程,以便用户可以继续使用系统而无需重新身份验证。 特殊版本
NIST 800-63B :数字标识指南(身份验证和生命周期管理)提供了有关实现数字标识,身份验证和会话管理要求的详细建议。
C7:强制访问控制
访问控制(或授权)在于允许或禁止来自用户,程序或进程的特定请求,并且还涉及此类特权的发布和撤销。
应该注意的是,授权(确认使用特殊功能或资源的权利)并不等同于验证(身份验证)。
访问控制通常会影响软件的许多方面,具体取决于访问控制系统的复杂性。 例如,出于可伸缩性目的的访问控制元数据管理或缓存通常是访问控制系统中需要创建或维护的其他组件。 有几种不同的访问控制方法:
- 选择性访问控制(DAC)–涉及基于标识符以及对象(例如,用户或进程)和/或对象所属组的“必要知识”原则,限制对对象(例如,文件或数据元素)的访问;
- 强制访问控制(MAC)-涉及基于这些资源中包含的数据的重要性(由标签定义)和用户对特定重要性信息的正式授权(即访问)来限制对系统资源的访问;
- 基于角色的访问控制模型(RBAC)-涉及基于角色定义访问权限,该角色使用资源定义了允许的操作,而不是基于主题标识符;
- 基于属性的访问控制(ABAC)-涉及基于用户属性和对象属性以及可以全局定义且与适用策略更相关的环境元素,允许或拒绝用户请求。
C8:无处不在的数据保护
机密数据(例如密码,信用卡号,医疗记录,个人数据和商业秘密)需要额外的保护,尤其是如果它们受数据隐私法(例如欧盟通用数据保护条例(GDPR)或保护法)的约束时财务数据,例如“支付卡数据安全标准(PCI DSS)”。
攻击者可以通过许多不同方式从Web应用程序和Web服务中窃取数据。 例如,如果攻击者通过不安全的Internet连接传输数据,则攻击者可以连接到共享无线网络并查看或窃取其他用户的机密数据。 攻击者还可以使用SQL注入从应用程序中窃取密码和其他凭据,然后将其放置在公共域中。
资料分类
您需要对系统中的数据进行分类,并确定每个数据块的关键级别。 然后,每种数据类别都可以与为每个关键性级别定义的保护规则相关联。 例如,非机密的公共营销信息可以归因于可以发布在公共网站上的公共数据。 信用卡号可以归因于存储或传输时需要加密的用户的个人数据。
传输加密
通过任何网络传输机密数据时,必须应用端到端连接保护(或加密)。 TLS是迄今为止提供安全连接的最广泛使用和支持的加密协议。 它用于许多领域(Web应用程序,Web服务,移动应用程序),以通过网络安全地传输数据。 为了确保TLS连接的安全性,必须正确配置它们。
TLS协议的主要好处是可以保护Web应用程序数据免于在客户端(Web浏览器)与Web应用程序服务器之间以及Web应用程序服务器与内部服务器或其他非浏览器之间传输期间进行未经授权的访问和更改。 ,组织的组成部分。
资料加密
管理敏感数据的第一条规则是避免尽可能存储敏感数据。 如果需要保存机密数据,请确保它们具有加密保护,以防止未经授权的访问和更改。
密码学是信息安全领域中最先进的领域之一;对密码学的理解需要广泛的知识和经验。 由于存在多种不同的加密方法,并且每种方法都有其优缺点,因此,Web架构师和Web开发人员必须清楚地了解一种解决方案,因此很难选择一个解决方案。 此外,认真的密码学研究通常基于更高的数学和数论,这会产生很高的输入阈值。
C9:实施安全事件记录和监视
大多数开发人员已经使用日志记录进行调试和诊断。 在应用程序运行时记录安全事件(与安全相关的数据)也很重要。 监视是使用各种自动化工具对应用程序和安全日志进行的实时分析。 可以将相同的工具和模板应用于正在进行的操作,调试和安全性。
安全事件记录的好处
安全事件日志可用于:
- 向攻击检测系统提供数据;
- 分析和调查事件;
- 符合法规要求。
实施安全事件记录
以下是实现安全事件日志记录的建议。
- 使用标准的表格和方法记录系统中以及组织中系统之间的事件。 标准事件日志记录平台的一个示例是Apache Logging Services,它提供Java,PHP,.NET和C ++应用程序之间的日志记录兼容性。
- 不要注册太多或太少的数据。 例如,确保注册时间戳记和凭据,例如源IP地址和用户ID,但不要记录个人或机密数据。
- 要特别注意节点之间的时间同步,以确保时间戳一致性。
记录以检测和抵制攻击
使用日志记录来确定指示恶意用户行为的活动。 要记录的潜在危险活动:
- 输入数据超出预期数值范围;
- 输入数据修改了必须保持不变的组件(选择列表,复选框,其他输入受限的组件);
- 违反服务器端访问控制规则的请求;
- 可以在此处找到更详细的攻击标记列表。
当应用程序检测到此类活动时,它至少应注册该事件并将其标记为危险。 理想情况下,应用程序应抵制攻击,例如,通过取消用户的会话并阻止其帐户来进行。 该对策机制允许程序实时响应可检测到的攻击。
C10:强制处理所有错误和异常
异常处理允许应用程序以各种方式响应各种错误(例如,网络故障或连接到数据库)。 正确处理异常和错误仅是确保代码的可靠性和安全性所必需的。
错误和异常在应用程序的各个级别进行处理,包括关键的业务逻辑,安全功能和框架。
就检测攻击而言,错误处理也很重要。 对应用程序的某些攻击可能导致错误,这些错误可以检测到进程中的攻击。
错误处理错误
多伦多大学的研究人员发现,即使在处理错误或忽略错误时进行很小的疏忽,也可能导致
分布式系统中的严重故障 。
错误的错误处理可能会导致各种漏洞。
- 数据泄漏。 错误消息中泄露机密信息可能会无意中帮助攻击者。 例如,包含堆栈跟踪或内部错误详细信息的消息可能会向攻击者提供有关您的环境的信息。 错误处理中的微小差异(例如,有关输入错误的用户名或错误的身份验证密码的消息)都可能成为攻击者的重要信息来源。 , , , .
- TLS. Apple «goto fail» , TLS- Apple.
- . . . .
- , try/catch . .
- , , .
- , , , .
- .
结论
该文档应被视为起点,而不是详尽的方法和实践集。再次,我们要注意,所提供的材料旨在使您熟悉开发安全软件的基础。创建应用程序安全程序时,建议您完成以下步骤:
完整版本的翻译和原文。参与了翻译和改编:JZDLin,Alexey Skachkov,Ivan Kochurkin和Taras Ivashchenko。
本文档是根据知识共享署名ShareAlike 3.0许可发布的,在OWASP财团的俄罗斯分支机构的参与下进行了翻译和改编。