Critical Security Update

To help protect your systems, customers using NI driver software 2026 Q2 or earlier should visit ni.com/ni-pal-update and follow the recommended actions.

NI LabVIEW与SDLC中的安全开发:框架

概述

​​确保软件应用程序的安全性需要一种正式方法,以便在整个开发生命周期中融入安全思维。软件开发生命周期(SDLC)在开发开始前即开始,包括团队准备、为软件开发设置保护、遵循软件设计的最佳安全实践以及软件发布后的支持。本文为NI LabVIEW团队提供在项目中采用包含安全软件开发框架的正式SDLC的建议。

内容

​​简介:LabVIEW安全和SDLC

​软件开发生命周期(SDLC)是用于设计、创建和维护软件(包括内置于硬件的代码)的正式或非正式方法。

​每个软件团队均有其开发流程,无论是否附有正式文档。有意识的安全开发在整个过程中增加了相关活动,以减少漏洞、提高可维护性,并降低修复安全问题的成本。漏洞不仅包括编码缺陷造成的问题,还包括安全配置设置、错误的信任假设和过时的风险分析造成的问题。

​在SDLC中越早解决安全问题,最终达到相同安全级别所需的工作量和成本就越少。无论使用何种SDLC模型,该原则(称为左移)都至关重要。左移原则适用于任何编程环境,包括LabVIEW-一个可用于开发安全应用程序的安全编程环境。已完成的应用程序的安全性在很大程度上取决于开发团队采用的SDLC。

​关于SDLC和合规性的重要说明:大多数监管项目(例如,欧洲《网络韧性法案》(CRA)、美国网络安全成熟度模型认证(CMMC)、英国国防网络认证(DCC)等)都要求提供证据,表明系统设计遵循了类似本SDLC中的安全惯例,但这类监管项目的要求远不止一套SDLC。详细信息见这些项目的文档。 

​方法

​该指南主要基于NIST特别出版物800-218,安全软件开发框架(SSDF)中定义的原则和实践。SSDF为开发安全软件提供了与具体技术无关的框架,并且公认可满足美国政府软件安全相关要求。每个SSDF实践都针对LabVIEW开发团队的需求进行了解释和应用,重点是在测试、测量、自动化和工程环境中的实际实现。 

​本文档中提出的建议还与JKI Security Suite和微软安全开发生命周期(SDL)等其他已确立的安全开发框架和行业最佳实践进行了比较,以确保与经验证的软件安全、风险管理和软件供应链保护方法保持一致。目标是为LabVIEW组织提供将网络安全纳入其开发流程的实用路线图,同时生成客户、监管机构和政府采集项目日益需要的证据和可追溯性。

​整体方法

​NIST 800-218中描述的过程包括以下四个软件开发方面:

  1. ​组织准备(PO)-组织应确保其人员、流程和技术准备就绪,可在组织级别执行安全的软件开发。许多组织会发现一些PO实践也适用于其软件开发的子集,如单个开发组或项目。
  2. ​保护软件(PS)-组织应保护软件的所有组件,防止篡改和未经授权的访问。
  3. ​生产高安全等级软件(PW)-组织应生产高安全等级软件,将发布中的安全漏洞降至最低。
  4. ​漏洞响应(RV)-组织应识别软件发行中的残余漏洞,并采取适当的响应措施解决这些漏洞,防止类似情况再次发生。

​在本文中,我们使用这些主题来指导LabVIEW SSDF的开发。

​组织准备

​在开始开发之前,必须采取措施来帮助团队采用安全开发原则、完成必要的培训以及建立支持安全开发的流程和工具。该阶段需要时间来实现以下目标:

  • ​确保组织已定义特定的安全要求并记录加以说明。
  • ​培训承担每个角色的员工,使其了解这些要求。
  • ​定义用于开发安全软件的流程。
  • ​将安全要求向下传递至任何提供代码的分包商或第三方组件(包括开源)。
  • ​使用工具实现安全和质量检查自动化。
  • ​保护代码不受外部损害。

LabVIEW团队

​这些要求对于任何软件开发团队都是通用的,但需要调整一些步骤,以适应测试团队和LabVIEW团队。

​安全团队关系

​许多测试团队与公司内部的安全团队处于隔绝状态。应与他们协调合作,建立互信关系,让他们知道你们非常重视安全问题。与您的安全团队会面,了解他们对已开发代码的要求。向他们展示项目和测试方面,并为其介绍相应流程。了解测试实验室的工作方式和面临的限制对他们很有帮助。您面临的挑战与其他IT系统不同,如果安全团队了解这些差异,将会有所帮助。

​您还必须了解安全团队的关注点。了解他们必须满足哪些项目要求后,您可以将安全要求追溯至具体需求,从而更好地满足原项目的初衷。

​需求跟踪和文档

​需求跟踪是团队为交付安全代码的准备过程的重要部分。良好的跟踪流程不仅提供了存储需求的功能,还提供了这些需求的可追溯性。您的团队应能够在整个生命周期内跟踪需求:

​需求定义→设计→实施→测试→缺陷修正→发布

​这种可追溯性在客户审核、安全声明(如CRA)、评估(如CMMC)或供应商安全审查期间用作证据。

​“GitHub问题 + 项目 + 里程碑”是大多数小型团队最常见的需求跟踪方法。其他跟踪选项包括GitLab(免费和付费)、Azure DevOps、JIRA和其他专业软件开发工具。这些工具有助于创建问题并跟踪问题直至解决问题。

​在所选工具中,系统地跟踪安全需求。每项需求均应满足下列标准:

  • 通过ID号唯一标识,每个ID只有一个需求
  • ​按类型分类,如功能缺陷、安全漏洞、性能问题
  • ​分配了反映其影响的严重等级,如严重、高、中或低
  • ​从发现到解决全程跟踪

​确定需求跟踪工具后,请记录流程,以便在开发中使用这些工具。在系统的整个生命周期内,使用该流程进行需求跟踪和问题跟踪。该流程可能包括以下步骤:

  • 为每个需求分配唯一的标识符;切勿组合需求。
  • ​直接在设计文档中引用需求ID。
  • ​确定架构框图中哪些组件满足每个需求。
  • ​在代码注释、书签、标签和文档中引用需求ID。
  • ​在存储库提交中捕捉需求ID。
  • ​在每个推送和合并请求中引用需求ID。
  • ​将需求ID链接至单元测试,并确保所有需求均已测试。
  • ​在测试结果中列出需求ID。
  • ​在安全性和代码审查中记录需求ID。
  • ​识别发布文档中实施的需求ID。
  • ​将漏洞链接至受影响的需求ID(如发现)。

​设计安全验证

​计划将代码模块化。该步骤在LabVIEW中尤其有用,因为用户可测试单个模块。规划模块化架构时,也应计划开发单元测试。这样可提高代码质量,并在进行更新后(甚至在系统部署后)提供验证代码的更快方法。 

​详细了解使用NI单元测试框架

​第三方测试工具提供了额外的价值,例如,JKI的Caraya和LUnit产品为LabVIEW团队扩展了软件测试功能。

​第三方和分包商

​定义检查和批准分包工作、第三方软件和开源组件的流程。流程应包括检查常见漏洞和暴露(CVE)等公共数据库,以识别所用组件中的已知漏洞。

​如使用开源组件,在应用程序中使用代码前需扫描漏洞。

​基于角色的培训

​定义团队中的特定角色,包括安全特定角色。确定每个角色的职责和访问权限。至少应定义具有特权访问的角色(管理员),与用户角色(开发人员和操作员)分离开来。

​创建适用于这些角色的安全培训。将培训分配给团队成员并跟踪培训完成情况。这些记录将作为认证审查的证据。

​请考虑使用在线NI安全培训:《测试系统集成的安全注意事项》课程。

​ISC2等行业认证项目提供低成本的入门级认证。这些项目对测试团队的价值在于为与安全团队通信提供通用语言。

​领导支持

​定义SDLC后,将其提交给公司领导层,并获取他们的正式支持。该项目应至少获得负责审批安全预算的层级批准,以表明其对该项目的承诺。

​数据管理和标签

​组织应识别可能遇到的数据类型并创建标签系统。应考虑下列数据类型:

  • ​机密或敏感数据(如果组织有资格处理该级别的数据)。
  • ​受控未分类信息(CUI)-该信息未分类,但根据法规需要加以保护。
  • ​ITAR技术信息-该信息需要特殊处理,以确保无许可证时不会导出信息。
  • ​出口管理法规(EAR)数据、出口管制信息、NOFORN和其他出口限制信息-根据适用的出口法规,这些信息需要控制以防止未经授权的外国人访问。
  • ​受公司保护的信息-该信息包括专有或机密信息,如果公开可能会对公司造成损害。
  • ​个人身份信息(PII)-该数据在某些国家和地区受到保护,必须以特定方式加以保护。
  • ​公共数据-您可能拥有对公众免费开放的数据。

​拥有清晰的数据管理和标签系统将使您能够妥善保护数据,对每个数据分类应用正确的限制。在开始系统开发之前由组织定义这些内容,可通过将适用的控制措施应用于正确的风险领域来节省时间。映射到现有的公司和IT标签系统将简化系统之间共享数据的方式。

​开发与安全工具

​确定要进行标准化安全保护的软件和驱动程序版本及配置。对于LabVIEW,请确定用于开发的版本。建立安全配置,以便安装。可参考LabVIEW安全配置指南。请访问ni.com/security,查看其他安全配置指南。

​为实现可审计性并快速设置新系统,请自动化开发和构建机器的设置方式。建立基准安装并从该安装创建镜像。

​创建用于整个开发过程中安全检查的工具。您需要一个静态应用程序安全测试(SAST)工具来分析源代码,而无需执行程序来查找潜在的安全漏洞。对于LabVIEW图形化代码,我们推荐使用JKI Security Suite,该套件专门设计用于对LabVIEW代码进行静态分析。或者手动执行静态代码分析,查找安全问题。

​SAST工具是分析代码漏洞的重要安全工具。动态应用程序安全测试(DAST)工具也很重要,用于在测试期间扫描运行代码。软件组件分析(SCA)可识别开源库、第三方程序包和软件组件的使用,并扫描这些组件的已知漏洞和许可证问题。

​有许多其他类型的工具可用于扫描代码以发现安全问题。适合项目的工具取决于您的工具集、项目的性质和使用的代码类型。在安全开发生命周期的此阶段,研究和确定团队将使用的工具非常重要。

​代码库

​安全开发要求以多个版本存储源代码,以便团队在代码出现问题时可以还原至旧版本。作为组织进行安全开发准备工作的一部分,应建立一个代码存储库,用于存储代码、签出用于开发的代码并维护源代码的版本控制。

​在代码存储库中进行分支有利于并行开发和稳定发布。定义要在组织中使用的分支类型。这些分支类型为标准类型,但可根据需求进行调整:

  • ​生产分支-包含生产就绪型代码的主稳定分支。
  • ​发布分支-管理特定的发行版本,允许在主分支继续进行新开发的同时,对旧版本进行补丁和热修复。
  • ​功能分支-用于开发新功能、修复错误或实验的临时分支。
  • ​开发分支-在新功能合并到生产分支之前的集成分支。该分支可能包含进行中的功能,是多个功能分支的集成点。

​请使用提供正确安全控制的存储库。确保存储库保留完整的提交文件和更改历史记录,以维持可追溯性。

​开发计算机的安全性

​确保用于开发代码的计算机遵循基本的网络安全策略。这些基本控制措施包括密码保护、恶意代码防护和其他基本网络卫生措施。关于这些基本控制,请访问https://www.acquisition.gov/far/52.204-21。

​为确保可追溯性,请记录用于开发系统的计算机的配置设置。要捕捉的配置设置包括以下范例:

  • 操作系统版本和架构(例如,Windows 10 x 64)
  • ​LabVIEW版本(例如,LabVIEW 2023 Q3)和位数(32位/64位)
  • ​NI驱动程序版本(例如,NI-DAQmx 23.8、NI-VISA 23.5)
  • ​特定的NI附加模块版本(例如,LabVIEW Real-Time Module或LabVIEW FPGA Module)
  • ​NI Package Manager订阅源配置和关键程序包版本
  • ​NI VI Package Manager (VIPM)版本和VIPC文件(列出所需的VI程序包和版本)
  • ​所需的第三方驱动程序版本
  • ​部署所需的运行引擎版本

​安全证据

​大多数安全项目都需要团队遵循SSDF中既定惯例的证据。建立存储库以跟踪证据,并在系统的开发和部署过程中不断对其进行更新。系统应跟踪下列项:

  • 培训记录
  • ​威胁模型
  • ​风险评估
  • ​代码检查记录
  • ​测试结果
  • ​SBOM
  • ​安全扫描结果
  • ​发布批准
  • ​补丁记录

​许多团队会执行这些安全活动,但无法证明他们执行了这些活动。合规团队希望同时看到:团队已制定流程,并且遵循这些流程。将这些文件放在同一位置将大大简化审计和合规性审查。

​保护软件

​当组织做好安全开发代码的准备后,下一个任务是保护软件。此步骤可确保团队在开发和发布过程中保障代码安全。

​LabVIEW团队

​在开发过程中保护软件对于任何软件都至关重要,无论使用何种编程语言。LabVIEW团队采用专业的软件开发工作流程工具时,这些团队也必须采用安全的开发流程和工具。

​安全代码存储库

​使用上一阶段中确定的安全代码存储库来存储和管理代码。出色的存储库不仅用于管理源代码。还应包含需求、文档、构建脚本、测试工件和发布历史记录。由于存储库包含大量代码和支持,因此使用安全的存储库非常重要-如果存储库受损,软件也会受损。

​在存储库中,主分支是必须保护的关键资产。您的团队应定义并遵守代码保护策略。这些策略可能包括以下范例:

  • 分支保护规则
  • ​拉取请求审查
  • ​批准需求
  • ​合并前自动化测试
  • ​受限的直接提交

​存储库还应提供从需求生成到开发再到产品发布的可追溯性。某些存储库允许对提交进行签名(例如,Git)。

​存储库应通过保留软件更改记录来提供审计跟踪。更改内容、更改操作人员、更改原因、批准人员以及发布时间。此外,发布镜像应备份到安全归档中,以便即使存储库受损仍可检索代码。

​软件物料清单(SBOM)

​SBOM提供了用于代码开发的软件和组件列表。在构建过程中生成SBOM,可确保您记录代码中使用的组件,从而简化识别和修复漏洞的过程。

​从LabVIEW 2026 Q3开始,可在应用程序构建过程中生成SBOM。详细信息请参阅生成独立应用程序的软件物料清单。

​代码签名

​代码签名为用户提供了一种机制,用于验证软件是否由已知组织生产、自发布以来是否未被修改以及是否已被批准发布。在LabVIEW应用程序中,代码签名应应用于可执行文件、安装程序、部署包、DLL、驱动程序和更新包。

​按照下列说明,可在构建过程中对应用程序进行签名。也可使用微软的SignTool.exe对软件进行签名,与签名任何应用程序或文件相同。

​密钥管理

​应用程序通常需要密码、API密钥、证书、令牌、加密密钥、数据库凭证和服务帐户凭证等密钥。这些密钥提供对系统和数据的访问权限,必须在软件生命周期内受到保护。

​请勿将硬编码密码、API密钥、证书或加密密钥直接写入源代码、配置文件、构建脚本或测试工具。硬编码密钥很难轮换,可能会被复制到存储库中,并且可能会通过源代码检查、备份或已部署应用程序的逆向工程而暴露。

​尽可能使用安全的操作系统或受硬件保护的存储来存储密钥。安全或受保护的存储包括下列选项:

  • ​Windows中的凭据管理器
  • 微软SecretStore
  • ​微软CryptProtectData (DPAPI)
  • ​可信平台模块(TPM)
  • ​硬件安全模块(HSM)
  • ​安全的云密钥管理服务

​授权密钥访问时,应用最小权限原则。只有需要访问密钥的用户、系统和服务才能获取密钥。管理凭证应与用户凭证分离,并应尽可能避免共享帐户。

​密码、证书、API密钥和加密密钥应根据组织策略定期更换。建立流程以定义密钥的生成方式、存储位置、可访问密钥的人员以及撤销已泄露密钥的方式。

​测试系统经常使用真实的网络连接、数据库、云服务和仪器。测试团队需要在测试期间访问这些系统。尽可能使用专用的测试凭证而不是生产凭证。独立的测试环境可降低在开发和验证活动期间暴露运营系统的风险。

​开发安全软件

​该阶段的重点是安全地设计、实施、测试和验证软件。为有效完成此任务,团队必须评估预期软件用途的风险和要求,并针对这些风险进行设计。最佳实践包括尽可能重用已知的安全组件、在开发过程中进行测试以及扫描开发代码中的漏洞。团队制定安全使用计划,包括使用默认安全设置。

​LabVIEW团队

​测试和测量应用程序面临着不同于一般软件应用程序的安全挑战。LabVIEW团队应理解这些挑战并开发软件,防止应用程序受到攻击。LabVIEW提供许多固有的安全保护,但团队必须考虑可能的攻击并做好防御准备。

​威胁建模和风险评估

​OWASP(开放式Web应用安全项目)是一个非营利基金会,提供免费工具、指南和标准来帮助人们构建安全的软件。OWASP提供了社区驱动的威胁建模指南;其模型提供了一系列结构化步骤,用于界定工作范围、确定威胁、制定对策和缓解措施以及评估工作。

​对于测试团队来说,首先通过对话了解开发系统的预期用途和威胁。会话应涉及首席开发人员、测试架构师、系统工程师、产品所有者、网络安全代表和操作人员。

​OWASP方法包含威胁列表,涵盖欺骗、篡改、抵赖、信息泄露、拒绝服务和权限提升(STRIDE)。STRIDE威胁类别可帮助团队考虑所有类型的威胁。

​测试团队应借鉴他们在头脑风暴中的经验,具体研究威胁在测试环境中将如何影响系统:

  • 导致测试结果丢失的原因有哪些?我们如何从此类丢失中恢复?
  • ​如何破坏系统校准,从而导致系统生成错误数据?
  • ​是否有人未经授权控制系统中的仪器或设备?
  • ​攻击者如何通过系统导致生产停机?

​将这些测试特有的风险添加到更传统的网络威胁中,将有助于确定适合测试系统的防御策略。威胁建模的输出应为一组按优先级排序的风险,以及降低这些风险所需的安全需求。这些需求将成为下文中系统设计和开发活动的输入。定期威胁检查可帮助团队识别随时间变化的新的和正在出现的威胁,并可以检查之前的威胁未捕捉到的问题。

​安全需求开发

​威胁建模可识别系统的风险。下一步是将这些风险转换为可衡量的安全需求,以便在整个生命周期内实施、测试和跟踪。安全需求与功能需求同等严格。

​安全需求定义了系统必须提供的安全控制或行为。良好的安全需求应具体、可测量、可测试且可追溯。下表列出了一些范例。


​安全需求应分配有唯一标识符,并通过与功能需求相同的需求管理工具进行跟踪。

​定义明确的安全需求应在整个开发生命周期内保持可追溯性。可追溯性表明已解决已识别的风险,并在客户审计、供应商安全评估和合规性审查期间提供宝贵的证据。

​测试和测量系统的安全需求通常在企业软件项目中遭到忽视。在开发安全需求时,应使用标准安全类别,同时考虑以下数据:

  • 防止测试结果被未经授权地修改
  • ​保护校准数据和校准程序
  • ​保护仪器配置
  • ​关闭或故障时安全处理硬件输出
  • ​控制对序列编辑和测试极限修改的访问
  • ​保护生产数据库和制造记录
  • ​验证从外部仪器、设备和网络接口接收的数据

            ​由于不准确的测量和遭到损坏的测试结果可能会产生严重的业务后果,因此完整性相关的安全需求通常与保密需求同样重要。

            ​生成模块化代码

            ​模块化代码通过将功能隔离到具有受控接口且定义明确的组件中来限制缺陷和漏洞的影响。在良好的模块化设计中,每个模块仅开放其他模块所需的功能。这提供了更少的入口点,并减少了滥用的机会。模块化代码还具有易于测试的优点,因此更容易应用和验证代码更新。

            ​创建模块化代码时,请考虑最低权限原则。模块只应具有执行功能所需的权限。例如,仪器通信功能无需访问数据库,因为数据库由不同的模块处理。避免将数据库句柄传递至仪器通信模块。

            ​数据在模块间传递时,请评估通信的信任度。如适用,接受其他组件的数据前应验证源。

            ​模块化代码应使安全检查更加容易。可以逐一审查每个模块,而不必在每次审查时都审查整个代码集。代码检查人员无需了解整个代码集即可提高单个组件的安全性。

            ​代码模块还简化了代码重用。经过安全开发和测试的模块可重复使用到其他应用程序中,用户可确信其按预期工作。

            ​LabVIEW最佳实践

            ​建立一套最佳实践并遵循这些实践。代码检查应验证这些实践的合规性。虽然本文内容并不包含全面审查最佳实践,但至少应涉及这些领域:

            • ​竞争条件-当多个执行路径在未进行适当同步的情况下访问共享资源时,会因时序变化导致不可预测的行为。代码应设计为无论系统资源可用性和定时如何均可按预期执行。应谨慎使用全局资源和变量以避免出现上述情况。异步访问共享资源需要适当的同步基元(通知器、事件、队列),以确保线程安全运行。
            • ​资源限制-不受控制的资源消耗可能导致软件挂起、系统崩溃和性能降低,从而影响安全性和操作可靠性。LabVIEW并行执行模型和自动内存管理可能会掩盖资源耗尽问题,直至超过临界阈值,因此主动限制资源使用对于维持系统稳定性至关重要。实现特定的限制机制,防止资源耗尽攻击并确保系统在不同负载条件下的可预测性。需关注的具体项包括:数组扩容保护、循环速率控制、避免死循环、网络连接终端、内存使用监控、文件操作、UI响应和队列深度限制。
            • ​可观察性-可观察性是指通过输出(例如,日志、事件、指标、警报和审计记录)确定系统内部状态、行为和安全性的能力。提高应用程序的可观察性需要投入精力来设计系统,使其能够在不暴露敏感信息的情况下提供这种功能。
            • ​基本内存管理-LabVIEW可自动处理大多数内存管理。开发人员必须管理某些内存函数。对于性能关键的循环,请为数组和数据结构预分配内存。检查VI执行设置以正确配置重入和其他设置。明确关闭不再需要的数据值引用和其他引用。避免无限制的内存分配,例如,在循环内部创建无限制的数组。
            • ​数据隔离和封装-设计具有明确定义的公共接口的组件,这些接口仅开放客户端所需的最低功能。使用内部数据的私有范围以及强制封装方法。LabVIEW类数据是私有的;切勿为应该保持私有的数据创建直接访问器。根据逻辑职责分离功能,并酌情控制访问级别。
            • ​输入验证-严格验证所有输入数据,特别是来自外部源或用户的数据,以确保鲁棒性和系统完整性。输入验证是一项关键安全控制,可防止格式错误的数据影响系统操作或导致攻击,从而在整个处理过程中保护数据完整性。
            • ​整数处理-选择足够大的整数,以满足预期运算和未来增长。LabVIEW提供多种整数数据类型(例如,I8、U64),具有不同的范围和溢出行为。根据最大预期值加安全余量选择整数类型,而不仅仅是典型操作范围。审查计数器、定时器和累加器的溢出条件,并明确测试极端情况。
            • ​硬件接口-关闭、解锁、释放或断开连接不再需要的硬件资源或连接(例如,DAQmx任务、VISA会话、文件引用)。配置硬件输出,使其在应用程序关闭或出错时转换为已知的安全状态。
            • ​错误处理-实现全面的错误处理,用于检测、管理和报告预期和意外故障。LabVIEW内置的错误簇有助于实现该功能。使用错误函数合并错误信息,以保持路径中的原始错误和后续错误。
            • ​容错设计-设计系统以正确处理故障,并过渡到安全状态。这包括将接口设计具有安全性、验证所有数据输入、明确告知用户关键连接的状态、定义程序以在出错或关闭时将硬件输出设置为已知的安全状态(例如,断电或断开连接)。这样做可确保与硬件接口正确断开连接、实现在出错或关闭时刷新关键数据缓冲区至磁盘的机制、正确关闭文件引用,以及与数据采集硬件和其他仪器断开连接。
            • ​VI服务器安全-使用LabVIEW VI服务器进行远程控制或通信时,应配置设置以限制潜在的攻击面并实施适当的用户识别和凭证管理。
            • ​可执行文件INI VI服务器风险-LabVIEW生成的可执行文件会生成一个INI文件,用于控制包括VI服务器访问在内的可执行文件权限。例如,my-app.exe在同一目录下生成my-app.ini。通过简单的文本修改并掌握应用程序结构,外部攻击者未经授权即可访问应用程序的前面板控件并可能执行任意VI。要避免这种情况,请仔细管理已部署应用程序的文件位置和权限。
            • ​生产环境加固-生产部署必须移除可能暴露敏感信息或提供未授权访问路径的开发结果和调试功能。通过LabVIEW可视化开发环境,用户可轻松在生产生成中无意间包含调试VI、测试数据和诊断信息。也可能意外包含存储在存储库中的代码。删除调试和测试VI、禁用项目程序生成规范中的调试功能、清除敏感的默认值、删除硬编码测试凭证、清理程序框图常量以删除开发路径、服务器名称或其他信息,并验证错误处理是否正常工作。
            • ​单元测试-自动化单元测试是验证核心逻辑、数据处理、接口和错误管理的基础。它确保组件满足需求并随着代码库的发展保持行为一致。开发人员应结合新的或修改的代码创建单元测试,以支持在整个开发生命周期中持续评估安全和隐私控制。单元测试执行合规性项目所需的持续安全评估、缺陷检测和补救流程,为安全控制验证提供测试执行证据和结果。

            ​使用公认的LabVIEW单元测试框架(NI单元测试框架、JKI Caraya或LUnit)。这些工具支持开发人员定义输入和输出,并验证代码是否正常运行。此操作无需运行整个应用程序,简化了代码验证。

            单元测试可保护敏感功能(如控制昂贵的设备),因为模块可独立测试。单元测试应设计为可重复执行,并在理想情况下集成到连续集成(CI)系统中,以确保它们在代码更改时自动运行。

            ​安全审查

            ​频繁的安全审查是建立注重安全的开发文化的重要组成部分。审查为团队提供了建立安全实践、相互学习和加强安全流程的方法。安全审查在开发前就开始进行了—审查已规划的架构和方法。然后,应在整个开发流程中继续进行审查,以确保安全开发代码。频率应根据开发规模确定;审查应足够频繁,以便在进行下游重大开发之前纠正问题。应在执行每个合并请求、拉取请求或其他重要的代码集成事件时进行审查。对于大型项目,可能额外需要定期审查。

            ​当团队根据检查清单逐项进行审查时,安全审查的效果会大大提升。这些检查清单应由组织制定,并在每个项目开始时根据威胁和风险分析进行自定义。

            ​除手动代码审查外,还可执行自动化代码检查。如使用持续集成和持续交付/部署(CI/CD)流程,请将安全扫描添加至接收流程中,以便在每次代码签入时扫描代码。设置其他扫描工具,每天或每周运行一次,以便在新引入的安全缺陷成为代码永久组成部分之前捕捉到它们。使用静态分析、单元测试和其他安全扫描工具,以便包含多种审查类型。

            ​开发工具

            ​尽可能使用最新版本的开发软件驱动程序。几乎每天都会发现新的安全威胁,开发人员会将安全修复程序构建到补丁和新的软件版本中。如无法使用最新版本,请使用仍接收供应商安全更新的软件,这些更新将在系统生命周期内收到。 

            ​使用供应商提供的配置指南配置工具以确保安全。

            ​查看NI产品支持的软件版本列表

            ​查找NI产品指南 

            ​测试

            ​发布产品之前,请根据项目开始时发现的威胁和风险进行测试。该列表可能包括以下测试:

            • ​动态测试-应用程序运行时,测试软件的完整性。动态测试将查找身份验证失败、授权缺陷、注入漏洞、错误配置和其他导致程序崩溃的方式。
            • ​模糊测试-这种测试方法是将意外或格式错误的数据输入到软件中。例如,输入值可以是AAAAAA...或NULL,而不是将控制点设置为25度。该测试尤其适用于与仪器或网络协议通信的LabVIEW应用程序,以查看输入是否导致仪器崩溃或无法正常运行。
            • ​渗透测试-该测试可由内部团队或外部顾问执行。在该测试中,专家将尝试获取未经授权的访问权限、提升权限、访问敏感数据或绕过应用程序的控制。该测试通常在重要发布之前执行,或每年执行一次,具体取决于系统的风险状况。

            ​由于LabVIEW是一种图形化编程语言,某些传统安全工具无法测试LabVIEW代码。JKI Security Suite等工具为LabVIEW开发人员提供了以安全为重点的静态分析功能,用于扫描LabVIEW代码并针对图形化编程语言的特定安全问题进行调整。 

            ​详细了解JKI Security Suite

            ​发布门禁

            ​除非开发团队能够证明已完成威胁模型检查、关键漏洞解决、单元测试应用并通过、静态分析、SBOM生成、代码检查并签署了发布包,否则不应批准发布。实施正式的发布门禁流程可使管理层据此确认流程合规且软件安全。

            ​安全部署和安装

            ​开发安全软件只是流程的一部分。如应用程序部署不正确,或在安装和配置过程中移除了安全控件,安全应用程序可能会受到攻击。因此,应将部署过程视为安全软件开发生命周期的一部分,在软件发布给用户之前,制定明确的流程、审查和验证活动。

            ​安全默认配置

            ​应使用安全默认设置部署应用程序。用户通常认为默认设置就是推荐配置。默认情况下,禁用的任何安全敏感选项在系统生命周期内可能会一直保持禁用状态。

            ​安全默认设置包括以下范例:

            • ​在适当情况下要求进行身份验证。
            • ​禁用未使用的网络服务和端口。
            • ​默认启用加密通信。
            • ​使用最小权限原则。
            • ​在生产版本中禁用开发和调试接口。
            • ​限制对配置和管理功能的访问。

            ​应要求用户有意识地削弱安全设置,而不是手动启用安全保护。

            ​生产环境加固

            ​在发布之前,请移除在开发过程中有用但在生产环境中造成不必要风险的开发成果和功能。检查应用程序是否符合下列标准:

            • 测试VI
            • ​调试工具
            • ​诊断后门
            • ​凭据范例
            • ​硬编码密码
            • ​内部服务器名称
            • ​文件系统路径
            • ​未使用的服务
            • ​开发证书

            ​生产系统应仅开放运行系统所需的功能。

            ​帐户和权限管理

            ​查看系统所需的权限,并将其分配给相应的角色。系统不应授予管理员权限,除非有明确的操作需要。服务帐户应仅配置执行预期功能所需的权限。对于基于角色的权限,请考虑:

            • 具有特定角色访问权限的管理员帐户
            • ​用于维护和更新的服务帐户
            • ​访问数据的数据库帐户
            • ​操作员站的共享凭证
            • ​根据系统的威胁状况限制访问的文件和文件夹权限

            ​如果系统存储敏感信息,请验证访问控制是否适当地保护了相应信息。

            ​网络安全配置

            ​部署前记录所有必需的网络通信。对于系统的每个连接,请考虑:

            • ​用于传输数据的协议
            • ​需要通过防火墙打开的端口号
            • ​每个通信流的方向
            • ​身份验证要求和凭据存储
            • ​数据存储和传输的加密需求
            • ​删除或禁用不需要的通信路径

            ​数据跨越网络边界时,必须保护数据。对于每次数据传输,请采取以下预防措施:

            • 使用TLS或其他安全协议。
            • ​尽可能减少暴露的服务。
            • ​限制入站连接。
            • ​尽可能将通信限制到授权的系统。

            ​测试系统通常同时连接至企业网络、制造网络、云服务和仪器。理解和记录这些信任边界是一项重要的部署活动。

            ​密钥和凭据管理

            ​应用程序通常需要密码、API密钥、证书、令牌或加密密钥。处理这些密钥令牌时,请注意避免:

            • ​源代码中的硬编码凭据
            • ​在纯文本配置文件中存储密码
            • ​将私有密钥存储在不安全的位置

            ​请使用下列工具或技术之一:

            • ​Windows中的凭据管理器
            • ​Microsoft Secret Store
            • ​CryptProtectData (DPAPI)
            • ​可信平台模块(TPM)
            • ​硬件安全模块(HSM)

            ​记录密钥的创建、存储、轮换、备份和撤销方式。请遵循此流程。

            ​记录和审计

            ​应用程序应记录重要的操作和安全相关事件。要记录的事件包括以下范例:

            • 用户身份验证事件
            • ​配置更改
            • ​软件更新
            • ​权限操作
            • ​安全故障
            • ​网络连接失败
            • ​启动和关闭事件

            ​确认日志不记录任何密钥,例如密码、个人信息或机密信息,因为非预期受众可能会查看日志。

            ​日志有助于故障排查、调查事件并证明符合客户需求和法规要求。

            ​在可能的情况下,将应用程序日志与Windows事件查看器或Linux系统日志等平台记录机制集成,以简化监控、事件调查和合规性报告。评估发送日志至安全服务器是否有助于保护和访问。

            ​防止审计日志在未经授权的情况下被访问和修改,并定义日志的保留时间。

            ​发布批准

            ​发布软件之前,请执行最终的安全检查,以验证应用程序是否符合团队的发布需求。作为最终审查的一部分,包括:

            • ​已审查和批准威胁模型
            • ​已实施安全要求
            • ​已通过单元测试
            • ​已完成安全扫描
            • ​已解决关键漏洞
            • ​已生成SBOM
            • ​已更新文档
            • ​已审查部署说明
            • ​已签名发布包

            ​发布流程应提供证据,表明这些活动已经完成。这些证据记录在发布后应受到保护,以免被篡改,保持完整性。

            ​代码签名和程序包完整性

            ​用户应能够验证发布的软件是否来自预期的组织,并且自发布以来是否未进行过修改。

            ​代码签名应应用于以下所有软件类型:

            • ​可执行文件
            • ​安装程序
            • ​驱动程序
            • ​插件
            • ​库
            • ​部署包
            • ​更新包

            ​代码签名不会阻止软件修改,但可以有力地检测未经授权的修改,并保证软件来自预期的发布者。

            ​部署验证

            ​安装后,验证已部署的系统在预期环境中安全运行。验证活动应确认下列功能:

            • 所需服务正在运行
            • ​加密功能正常
            • ​用户权限正确
            • ​记录功能正常
            • ​备份功能正常
            • ​安全控制在部署后保持启用

            ​每当发生重大配置更改时,应执行安全验证。

            ​部署证据

            ​保存记录,以证明已根据定义的流程执行部署。这些记录包括以下范例:

            • 批准的部署程序
            • ​安装记录
            • ​安全检查清单
            • ​代码签名记录
            • ​SBOM
            • ​安全扫描结果
            • ​部署验证报告
            • ​发布批准

            ​这些记录在客户审计、供应商评估、法规审查和内部安全调查期间提供了宝贵的可追溯性。

            ​响应漏洞

            ​软件漏洞是指软件设计、实施、配置或运行过程中存在的弱点、瑕疵或缺陷,可被利用来破坏系统或其数据的机密性、完整性或可用性。漏洞可能存在于团队开发的代码或软件使用的组件中。由于漏洞为恶意操作者提供了破坏系统的途径,因此修复这些漏洞并将其部署到受影响的系统非常重要。

            ​LabVIEW团队

            ​测试行业在应对漏洞方面面存在历史性挑战。许多测试项目通过单一的前期供资模式供资,并没有针对系统持续维护的供资。这意味着测试团队没有资源更新系统,甚至无法提供安全更新。这与保持系统更新的安全需求直接冲突。

            ​一个重大挑战是更新所需的验证量。即使软件和硬件工具无需成本,更新后的系统是否按预期运行,其验证工作也可能耗费高昂。

            ​行业转变

            ​随着安全行业发生变化,测试行业也必须开始转型,以便在测试系统的整个生命周期内更好地进行规划并提供资金。测试团队可采取一些步骤来转向全生命周期管理方法,其中包括:

            • 就系统的长期所有权开展谈判。指定负责系统生命周期的系统所有者,并确保随着组织中角色的变化,所有权也会发生转移。
            • ​将系统设计为模块化。更新大型集成代码要困难得多。开发模块化代码则更易于更新和测试,而不会影响整体代码。定义每个代码模块的功能和模块间的通信接口。
            • ​使用代码创建单元测试。测试需要更多的代码开发,但这些工具可显著降低在系统生命周期内验证软件更新的成本。
            • ​与客户和经理合作,实现全生命周期思维。这可能意味着在项目的整个生命周期中为项目提供资金;也可能意味着在项目开始时为更多的开发和验证提供资金。帮助他们认识到安全是项目的关键部分,必须进行规划。
            • ​建立系统生命周期的正式维护阶段,包括缺陷管理、过时规划、安全补丁、文档更新和客户支持等活动。将此维护阶段视为计划的工程活动,而不是事后考虑。
            • ​将技术更新纳入系统生命周期规划。将这些更新构建到生命周期中—如有必要,可就这些计划的更新向客户收取前期费用。
            • ​评估安全事故—个人安全事故、整个组织范围内的事故以及公开记录的事故。从这些事故中学习可以帮助您的团队为未来的攻击做好准备,并可用于证明持续安全投入的合理性。

            ​漏洞识别

            ​我们在ni.com/security上公布了NI产品中的漏洞,包括LabVIEW、驱动程序和其他软件。补丁也通过常见漏洞和暴露(CVE)系统加以报告。这些补丁可能修复NI工程师开发的软件代码或组件中的漏洞。访问ni.com/security注册并获取新补丁的相关通知。

            ​SBOM也可用于自动扫描软件。如通过LabVIEW应用程序生成SBOM,可设置扫描软件检查CVE数据库中报告的问题并通知用户。有多种软件组件分析(SCA)工具可扫描SBOM并将其与CVE数据库匹配。

            ​如最终用户发现漏洞,可直接向您报告。如问题在NI软件内部,请访问ni.com/security进行报告。

            ​漏洞修复

            ​必须认真对待漏洞报告。如果用户报告问题,或软件堆栈中报告漏洞,请分析该漏洞以确定其被利用的影响和可能性。这些问题受漏洞性质以及用户使用受影响软件组件的方式的影响。如果确定存在重大攻击威胁,则需要更新软件并向最终用户发布补丁。

            ​某些法规(例如,欧洲网络弹性法案(CRA))要求您提供长达五年或更长时间的安全补丁。有些合同可能规定更长或更短的支持承诺。在初始项目建议书中规划此级别的支持,以避免交付项目后出现意外情况。

            ​作为漏洞修复流程的一部分,对漏洞执行根本原因分析,以改进开发流程,从而在未来项目中消除类似问题。

            ​结论:在SDLC中集成安全软件开发的重要性

            ​安全软件开发不是在项目结束时执行的单独活动。它是一组集成在系统生命周期中的实践。通过采用本指南中介绍的原则,LabVIEW团队可以减少漏洞、提高可维护性、简化合规性工作流程并更好地保护委托给他们的系统和数据。安全是一个持续性过程,您的团队将随着时间的推移而成熟。立即开始建立可重复、可持续的流程,在产品生命周期内不断提高安全性。

            威胁安全要求
            未授权修改测试结果仅允许具有相应角色的身份验证用户修改存储的测试结果。
            拦截网络流量应用程序与外部系统之间的所有通信均应使用加密协议。
            校准数据损坏校准数据应防止在未经授权的情况下被修改,并记录所有更改。
            未经授权的设备控制操作行政或危险设备时,必须由经过身份验证且获得授权的用户进行操作。