软件安全知识之预防漏洞-接口设计及编码实践

admin 2023年6月2日09:34:51评论17 views字数 2079阅读6分55秒阅读模式

软件安全知识之预防漏洞-接口设计及编码实践

预防漏洞

接口设计

软件开发不仅依赖于编程语言,还依赖于由库或框架实现的API。就像语言设计会影响引入漏洞的可能性一样,API设计也是如此。基本原则是相同的:API应设计为避免执行错误(现在,执行错误违反了API规范),尤其是未捕获的执行错误。程序员应该很难违反API合约,如果违反了合约,就应该被困住,例如,导致程序终止或明确定义的错误处理行为。

建了一个属于网络安全从业人士交流群,加微信进群

软件安全知识之预防漏洞-接口设计及编码实践

如果编程语言本身不能阻止某一类漏洞(例如,C不能防止内存管理漏洞,Java不能防止竞争条件或结构化输出生成漏洞),则引入的可能性可以通过提供更高级别的API来减少这些漏洞:

•已经提出了几个库,为C或C++的内存管理提供不太容易出错的API。这些库提供胖指针(指针维护边界信息并检查访问是否在边界内)、垃圾收集(不再需要手动释放)或智能指针(支持所有权制度以安全自动化)解除分配)。

•已经提出了几个提供不太容易出错的API的库,以便为各种类型的结构化输出和各种编程语言进行结构化输出生成。示例包括预准备语句API,它允许程序员将SQL语句的结构与需要插入到该结构中的用户输入分开,或者语言的库实现集成查询,其中查询表达式是使用API调用而不是使用语言语法构造的。

•已经提出了几个为密码学提供不太容易出错的API的库。这些库使用简化(以牺牲灵活性为代价)、安全默认值、更好的文档和更完整用例的实现(例如,包括对辅助的支持)诸如密钥存储之类的任务),以降低开发人员犯错误的可能性。

使用断言、合约和防御性编程[18,c3]是构建高可靠性软件的通用方法,也是避免API漏洞的非常有用的方法。契约设计通过提供前置条件和后置条件使API的合约显式化,并且在防御性编程中将检查这些前置条件,从而避免发生未捕获的错误。

编程语言API还确定语言中的程序与周围系统之间的接口。例如,浏览器中的JavaScript不会向本地文件系统公开API。因此,在浏览器中运行的JavaScript程序无法访问文件系统。此类权限较低的API可用于包含不受信任的代码或对其进行沙箱处理(请参阅第4.3节),但它们也可以防止漏洞。对象能力系统[22]通过提供一种支持结构化代码的语言和API,使代码的每个部分只具有它真正需要的特权(从而支持最小特权原则),从而进一步推动了这一想法。

将加密密钥材料保存在单独的保护域(例如硬件安全模块(HSM)中)的加密API的设计带来了自身的挑战。此类API本身具有安全目标:HSM的API旨在对其使用的加密密钥保密-这应该是不可能的以从HSM中提取密钥。研究表明[6,c18],维持这样的安全目标是极具挑战性的。如果存在从HSM中提取机密密钥的一系列API调用,则HSMAPI存在API级漏洞。请注意,这是一个API设计缺陷,与主题1中考虑的实现缺陷相反。

.编码实践

通过采用安全编码实践,可以大大降低引入主题1中讨论的各种类别漏洞的可能性。编码指南还可以帮助防止语言或API设计无法解决的更通用性质的漏洞,例如,不硬编码的指南。密码。安全编码实践可以形式化为描述和说明好坏代码模式的规则和建议的集合。

设计此类编码指南的第一种方法是启发式和务实的:征求编程社区提供候选的安全编码规则和建议基于过去事情如何出错的经验。这些提议的规则由社区审查和讨论,直到达成共识,认为该规则足够适合包含在编码标准中。通用软件开发的有影响力的标准包括C[17]和Java[23]的SEICERT编码标准。

对于关键系统开发,已经制定了更严格和更严格的编码标准。MISRA指南[24]在C语言中的关键系统开发中得到了广泛的认可和采用。Ada[19]的SPARK子集旨在支持编码,以便能够正式验证是否存在漏洞类别。

规则可以采用多种形式,包括:

•避免使用提供的危险语言API函数(例如,不要在C语言中使用system()函数),

•试图避免未定义的行为或未捕获的执行错误(例如,不访问C语言中释放的内存),

•缓解由语言运行时导致的某些漏洞(例如,不在Java字符串中存储机密,因为Java运行时可以将这些字符串无限期地存储在堆上),或者,

•主动的防御性规则,使其不太可能遇到未定义的行为(例如,从格式字符串中排除用户输入)。

此外,可以通过编码规则解决特定的侧通道漏洞,例如,避免依赖于机密的控制流或内存访问可以防止这些机密通过基于缓存或基于分支预测器的侧通道泄漏。

当它们不是由类型系统强制执行时,用于安全管理资源(如动态分配的内存)的所有权制度也可以作为编程习语和编码准则的基础。例如,资源获取即初始化(RAII)习语、移动语义和智能指针基本上支持C++的所有权制度,但没有编译器强制执行的保证。

安全编码指南的一个重要挑战是它们的数量往往会随着时间的推移而增长,因此程序员可能会偏离指南中编纂的安全实践。因此,提供工具支持以检查软件是否符合编码规则非常重要。主题3.1讨论静态分析工具如何自动检测违反安全编码规则的情况。

原文始发于微信公众号(河南等级保护测评):软件安全知识之预防漏洞-接口设计及编码实践

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月2日09:34:51
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   软件安全知识之预防漏洞-接口设计及编码实践https://cn-sec.com/archives/1768483.html

发表评论

匿名网友 填写信息