可续订安全的编码

对可续订安全性的支持是 高度安全设备的七个属性之一。 在 Azure Sphere 中,这意味着设备上的所有软件(包括你自己的应用程序)都可以根据需要进行更新,以解决新发现的漏洞。 安全性是 Azure Sphere 存在的原因,始终确保设备安全至关重要,这不能过于强调。 不可能编写完全安全的代码,但通过良好的编码做法、对新发现的漏洞做出响应的极端谨慎,以及对可更新安全性的承诺,可以确保高级应用程序代码尽可能安全。 Azure Sphere 应用程序隔离模型提供了许多功能来确保:

  • 所有应用都必须经过适当的签名,然后才能安装或运行它们。
  • 应用程序只能访问在应用程序 的应用清单 文件中指定的那些硬件功能和 Internet 地址。
  • Azure Sphere SDK 提供的 API 包含少得多的标准 C 库子集,省略了潜在的安全漏洞,例如用户帐户和 shell 访问。
  • 在确定并解决安全问题时,可以使用 Azure Sphere 安全服务安全地更新 Azure Sphere OS 和客户应用程序。

但是,代码签名和攻击面最小化只会使你走到这一步。 遵循一组安全软件开发的最佳做法有助于确保你签署的应用程序尽可能安全可靠。 本文介绍 Azure Sphere 团队在其自己的开发实践中所使用的一些工具。

计划定期部署

Azure Sphere OS 和 Azure Sphere SDK 至少每季度更新一次。 应针对自己的应用程序 部署 制定类似的计划。

确保工具链保持最新状态

Azure Sphere OS 和 SDK 构成了 Azure Sphere 工具链的很大一部分,但你可能拥有单独管理的其他组件。 请务必定期检查这些组件的更新。

(CVE) 的常见漏洞和暴露是用于描述系统(包括 Azure Sphere 中的安全漏洞)的公共报告。 Azure Sphere OS 更新会定期处理 CVE 并帮助确保设备安全。 如果可能,请在生成管道中包含对 CVE 的检查。 为站点添加书签,例如用于跟踪安全更新 的 CISA 主页 。 在更新工具链时重新生成并重新部署应用程序。

传播并遵守编码标准

遵循已知标准的代码更易于维护、更易于查看和测试。 C 有公开可用的编码标准。 MISRA 是完善的, CERT 也有 C 的编码标准。除这些基本标准外,我们还建议尽可能使用 安全开发生命周期

确保使用基本安全标志进行编译

所有 Azure Sphere 应用都是使用 Gnu 编译器集合 (GCC) 中的 C 语言编译器生成的。 C 编译器 gcc 提供数百个 编译器和链接器标志。 在 Azure Sphere 中,默认使用以下标志:

  • -fstack-protector-strong:生成代码以防范 堆栈破坏攻击
  • pie:生成独立于位置的可执行文件。
  • fPIC:生成独立于位置的代码。

标志 -fstack-protector-all 提供比 -fstack-protector-strong更多的保护,但会增加内存堆栈使用量。 由于当前 Azure Sphere 硬件上的内存有限, -fstack-protector-all 默认情况下不使用 。

Azure Sphere 还使用许多警告标志,这些标志可用于识别编译期间代码的问题,这些问题可在部署前修复:

-Wall -Wswitch -Wempty-body -Wconversion -Wreturn-type -Wparentheses -Wno-format -Wuninitialized -Wunreachable-code -Wunused-function -Wunused-value -Wunused-variable -Wstrict-prototypes -Wno-pointer-sign -Werror=implicit-function-declaration

为了提高安全性, -Wl,-z,now-Wl,-z,relro 可以添加,但同样,默认情况下不使用它们,因为它们会导致额外的内存使用量。

查看所有代码

代码评审是确保高质量代码的简单但有效的工具。 建议在未经合格审阅者进行代码评审的情况下,不签入任何代码。 一对一代码评审(开发人员与其他开发人员一起演练新代码)通常有助于原始开发人员阐明生成代码的想法。 即使没有评审开发人员的输入,这也可能揭示设计缺陷或错过的分支点。

使用自动测试

自动测试框架(如 gtest)使你能够在每次生成项目时运行测试函数套件。 最佳做法是确保所有签入代码至少附带一个测试函数;通常越好。 重要的测试类型包括:

  • 基本单元测试 运行每段代码,以验证其是否按设计工作。 测试用例应设计为 在边缘测试代码;角案例和边缘案例通常是一个富有成效的 bug 来源。
  • 模糊测试 通过提供各种类型的意外输入来练习代码,以确保函数做出适当的响应。
  • 渗透测试 可用于识别允许攻击者穿透应用程序的漏洞。

使用静态代码分析器

静态代码分析器可帮助查找许多常见的代码问题。 大多数都关注特定类型的错误。 Azure Sphere 开发团队和一些 Azure Sphere 用户使用以下免费和开源工具:

运行其中一些工具可能需要重新编译应用程序 (或部分) 不同的目标操作系统。

删除不需要的代码

Azure Sphere SDK 提供标准 C 开发库的剥离版本;应尽可能寻找机会,将自己的代码剥离到其基本要素。 代码行越少,潜在威胁的攻击面就越小。 有关无法访问或未使用代码的警告可用于识别不需要的代码。