自由/开源软件(FLOSS)的最佳实践标准(第三部分)

原文:Best Practices Criteria for Free/Libre and Open Source Software (FLOSS) (version 0.8.0)

作者(组织):Core Infrastructure Initiative Best Practices Badge

Github 提交者:david-a-wheeler, altonius, kfogel, dankohn, NilsEnevoldsen

译者:wnereiz

许可证:MIT 或 CC-BY-3.0+

译者注

wnereiz: 自由/开源软件(FLOSS)的最佳实践标准的重要意义不仅仅在于获得认证,它具有在自由/开源生态领域更加广泛的指导性作用。由于篇幅较长,所以计划将此文章分阶段翻译并最终汇总。本文为第三部分。

自由/开源软件(FLOSS)的最佳实践标准 (版本 0.8.0)

接上文:自由/开源软件(FLOSS)的最佳实践标准(第二部分)

分析

静态代码分析

动态分析

  • 对于所有主要产品的待发布版本,“建议“在其发布之前使用至少一种动态分析工具进行分析。 动态分析工具可以通过执行特定的输入对软件进行检查。 例如,项目可以使用模糊测试工具(fuzzing tool) (如 American Fuzzy Lop) 或者网站应用程序扫描器 (如 OWASP ZAPw3af.org)。 就此标准的目的而言,动态分析工具需要以某种方式具备多样化的输入,从而可以发掘不同种类的问题,或者此工具是具有至少80%分支覆盖率的自动测试套件。 Wikipedia 上关于动态分析的页面 以及 OWASP 上关于模糊测试的页面 给出了一些动态分析工具。 [dynamic_analysis]
  • 如果是使用非保护型内存的语言(例如 C 或 C++)开发的应用层软件,则“建议“使用至少一种动态工具(如模糊测试工具(fuzzer)或网络应用程序扫描器)以某种常规机制探测内存安全性问题,例如缓冲区溢出。 探测内存安全性问题的机制包括如 Address Sanitizer (ASAN) 和 valgrind。 也可使用被普遍应用的断言。 如果并非是应用层软件,或者软件没有使用非保护型内存(memory-unsafe)语言开发,则此标准自动满足。 [dynamic_analysis_unsafe]
  • “建议“在动态分析时对包含多个运行时断言的软件进行检查。 [dynamic_analysis_enable_assertions]
  • 分析工具“可以“重点集中于发掘安全漏洞,但这不是必需的。
  • 在动态代码分析中发现的所有中、高严重级别的可利用漏洞,“必须“在其得到确认之后及时修复。 如果漏洞的 CVSS 2.0 达到 4 或更高,则为中到高严重级别。 [dynamic_analysis_fixed]
  • 理论依据: 静态源代码分析和动态分析的目的是要发现不同种类的缺陷(包括导致安全漏洞的缺陷)。所以将二者结合起来会更有效。

未来

以下“未来”的标准指的是我们想要在不久以后添加的标准。

  • (未来的标准)项目“应当”提供一种方法,可以使用被普遍应用的常规方式轻松地对软件进行安装和卸载。 例如,(系统或语言级的)包管理器,”make install/uninstall”(支持 DESTDIR),标准格式的容器,或标准格式的虚拟主机镜像文件。 安装和卸载流程(例如,打包)“可以”通过第三方实现,但前提是其必须为自由/开源软件(FLOSS)。 [installation_common]
  • (未来的标准)“建议”项目支持可重现构建(reproducible build)。 通过可重现构建,多方开发者可以独立地重复进行从源码文件生成所需信息的过程,并得到完全一致的结果。 在可重现构建项目中可以找到相关的文档介绍如何去做。 如果不需要构建(例如,脚本语言,其源代码可以直接使用而无须编译),则此标准不适用。 [build_reproducible] 理论依据: 如果项目需要构建,但并没有可工作的构建系统,则那些潜在的协助开发者将无法便捷地贡献代码,而且许多安全分析工具将会失效。如果不需要构建任何东西,则工作构建系统的标准不适用。
  • (未来的标准)当可以使用加密的网络通信协议(如 HTTPS/TLS 和 SSH)时,项目“不应当”使用未加密协议(诸如 HTTP 和 telnet),除非用户明确地提出需求或者明确需要做此配置。 [crypto_used_network]
  • (未来的标准)如果项目支持 TLS,则其“应当”至少支持 TLS 1.2 版。注意,TLS 的前身叫 SSL。 [crypto_tls12]
  • (未来的标准)如果项目支持 TLS,则在其使用过程中“必须”默认执行 TLS 证书验证,这也包括了项目的次级资源。 注意,不正确的 TLS 证书验证方式属于常见的错误。详细信息参见 “The Most Dangerous Code in the World: Validating SSL Certificates in Non-Browser Software” by Martin Georgiev et al.“Do you trust this application?” by Michael Catanzaro[crypto_certificate_verification]
  • (未来的标准)如果项目支持 TLS,则其应当在发送隐私信息(如 secure cookies)的 HTTP 头之前进行证书验证。 [crypto_verification_private]
  • (未来的标准)“建议”项目的网站、软件仓库(如果可以通过网页访问)以及下载站点(如果是独立的)能够支持带有非宽容值的密钥加固头。 注意,已知 GitHub 是满足此条件的。 网站如 https://securityheaders.io/ 可以帮助进行快速检查。 这些密钥加固头为: Content Security Policy (CSP)、HTTP Strict Transport Security (HSTS)、X-Content-Type-Options (as “nosniff”)、X-Frame-Options 以及 X-XSS-Protection。 [hardened_site]
  • (未来的标准) “建议”项目使用加固机制,这样可以减少由于软件缺陷导致安全漏洞的可能性。加固机制可以包括诸如内容安全规则 (CSP) 这样的 HTTP 头、用来缓解攻击的编译器参数(如 -fstack-protechtor)或移除未定义行为的编译器参数。 基于我们的目的,最低权限不能作为一种加固机制(最低权限非常重要,但它是独立的方法)。 [hardening]

非标准

我们计划依赖于任何特定的产品或服务。 特别是我们计划依赖私有工具或服务,因为许多自由软件开发者拒绝这类标准。 所以,我们会有意地依赖于 git 或 GitHub。 我们也不会要求或禁止任何特定的编程语言(然而,我们可能会推荐一些语言)。 这也意味着可以应用新的工具和技能,项目可以快速切换到其中而不用担心违背任何标准。 然而,此标准有时会识别某些行为的通用方式或方法(特别是 FLOSS),因为这样的信息可以帮助人们理解并符合标准。 我们计划为那些在 GitHub 上使用 git 的项目创建一个“易于操作的流程“。 我们欢迎优秀的补丁,能够帮助我们为其他软件仓库平台上的项目提供这种“易于操作的流程”。

我们没有计划对有关项目中活跃用户的讨论做出要求。有些非常成熟的项目很少有变动,所以活跃度会很低。 然而,如果项目存在漏洞报告,我们则要求其作出回应(见上述内容)。

唯一地识别某项目

如何能够唯一地识别项目是一大挑战。 我们的 rails 程序针对每个新项都要目给出一个唯一的 id,这样我们可以通过此 id 来识别项目。 然而,这种方法并不能帮助人们在不知道 id 的情况下搜索某个项目。

基于我们的目的,规定项目的“首页” URL 和/或其软件仓库的 URL 作为其真实名称。 多数项目具有人类可读的名称,但使用这些名称是不够的。 同样的可读名称可以用于不同的项目(包括项目分支),而且同一个项目可以有许多不同的名称。 许多情况下,指出项目的其他名称非常有用(例如,Debian 中的源代码包名称,一些编程语言仓库中的包名称,或其在 OpenHub 中的名称)。

在未来我们会尝试更仔细地检查用户是否合法的展现了其项目。 当前,我们主要集中精力于检查项目是否使用了 GitHub 仓库;如果其他情况变得更重要,则会有许多方式去处理。 我们希望在绝大部分情况下用户无法编辑 URL。因为如果可编辑,他们就可以进行欺骗,让人以为他们控制着一个实际并非其所控制的项目。 所以说,这些人无法从创建伪造的行条目中得到好处;最关键的部分是项目提及其徽章时所使用的 id,而这是由项目本身来决定的。

因此,徽章信息将包含作为名称的 URL,年限范围,以及级别/名称(如果超过一个的话)。

我们将会实现一些搜索机制,人们可以通过输入通用名称检索某项目。

为何制定此标准?

文章 Open badges for education: what are the implications at the intersection of open systems and badging? 中给出了使用徽章系统的三个普遍性的理由(用在这里都是有效的):

  1. 徽章可以作为某种行为的动力。我们希望通过最佳实践的鉴别,鼓励那些未实现的项目实现这些最佳实践方法。
  2. 徽章可以作为一种教学工具。一些项目可能并没有意识到其他项目所使用的最佳实践方法,或者只是部分应用了这些方法。 徽章将帮助他们意识到这些最佳实践以及实现它们的方法。
  3. 徽章可以作为一种象征物或凭证。 潜在的用户会趋向于使用那些应用了最佳实践的项目,来获得一贯良好的效果;徽章可以让项目表明其符合最佳实践,而且让用户易于得知有哪些项目这样去做了。

我们选择了使用自认证的方式,因为这样可以使得数量众多的项目(甚至是小项目)参与进来。这么做的风险是有些项目可能错误的声称自己是符合的,但我们认为风险很小,而且用户自己可以对其检查。

改进标准

我们希望从所有人那里获得好的建议和反馈;请您参与进来!

我们当前计划(一旦准备完毕就)启动单一的徽章等级。 此后,最终可能存在多个等级(铜,银,金)或其他(有前提条件)的徽章。 我们经常在讨论的一个问题是,是否应该在标准中添加关于持续集成的要求;如果不添加的话,则我们希望将其放在更高等级之中。 更多的信息请参见other(其他)

您也可以查阅“background(背景)”文件以获得关于此标准的更多信息,以及“implementation(实现)”中有关徽章应用程序(BadgeApp)的注解。