owned this note
owned this note
Published
Linked with GitHub
# Standard for Public Code & CII Best Practices Criteria for FLOSS
SPC: https://standard.publiccode.net/criteria/ ( or https://github.com/publiccodenet/standard/tree/develop/criteria )
CIIBP: https://github.com/coreinfrastructure/best-practices-badge/blob/master/doc/criteria.md
The following are Eric's rough notes from a first read of the CIIBP
----
## Similarities and differences to consider
* In general, CIIBP goes into more detail, reflecting some of what Foundation for Public Code has been enumerating with the first steps to incubation: https://about.publiccode.net/activities/codebase-stewardship/product-assets-for-early-incubation.html
* The SPC is a bit like a high level Interface and the assets are like an Implementation, with some lower-level detail
* the CIIBP seems much more implementation-like and low-level in several places
* CIIBP adds term "SUGGESTED"
* perhaps SPC would wish to adopt? Probably not, it's compelling, but non-standard
* CIIBP is very "project" focused, SPC is very "codebase" focused
* this should not change, "project" is a word which means too many things
* SPC "gaps" or differences to consider:
* machine readability: perhaps SPC would want to have a "criteria" section in publiccode.yml ?
* add using standard file names and file locations as part of Use Open Standards?
* tweak wording? Or only as guidance to Designers and developers?
* statement about using common/FOSS build tools?
* Version Control
* in Maintain Version Control include a SHOULD criterion for a public URL to the codebase repo?
* Maintain Version Control include more what/who/when ?
* Code in the Open or Maintain Version Control include more about being able to view between releases?
* Maintain Version Control state that a codebase SHOULD use *distributed* rcs? e.g. git,bzr
* does SPC want to mention Semantic Versioning as further reading?
* https://semver.org/
* https://github.com/coreinfrastructure/best-practices-badge/blob/master/doc/criteria.md#version_semver
* SPC has nothing around CVEs in Release_notes, should it?
* discussions (regardless of type) to be searchable, addressed by url, no proprietary not covered ... too specific or a SHOULD?
* responses to issues/bugs
* issue acknowledgement criterion?
* setting expectations is probably more important than drawing a line at X hours or Y days
* request responsiveness criterion?
* criteria describing the public availablity/searchability of archives for reports and responses for later searching?
* Tests in general:
* statement about tests also being FOSS?
* test suite SHOULD be invocable in a standard way?
* mention of testing evidence or coverage metrics?
* vulnearbilities reporting, responding
* statement about private reporting of vulnearbility?
* criteria covering vulnerability reporting response times?
* no unpatch known vulnerabilities older than 60 days?
* "rapidly" fix all reported critical vulnerabilities?
* timely fixing of severity exploitable vulnerabilities discovered with static code analysis?
* "timely" fixes of medium and high severity exploitable vulnerabilities discovered with dynamic code analysis?
* specific developer skills
* developer(s) with secure development knowledge?
* dev(s) with vulnerabilities & mitigation knowledge?
* Bunch of stuff on cryptography:
* add requirement to only use cryptography publicly published and reviewed by experts?
* don't roll-your-own-crypto?
* need only FOSS crypto?
* crypto keylenghts?
* don't depend on known-to-be-broken crypto?
* don't depend on known-to-be-weak crypto if safer available?
* implement perfect forward secrecy?
* require password salting?
* only cryptographically secure PRNGs for security?
* Quality/security testing specifics:
* avoid MITM via https or ssh?
* check cryptographic hash signatures & use https?
* Static code analysis?
* add static code analysis to continuous integration?
* rules approach to look for common vulnerabilities?
* suggest fuzz testing or Zed Attack Proxy? Further reading?
* scan and test for memory safety violations?
* suggest using lots of dynamic asserts?
* statement on compiler flags/warnings, linting? strictness?
# some more detailed comparison notes:
----
* CIIBP encourages machine readability of statements about compliance via criteria/criteria.yml
* perhaps SPC would want to have a criteria section in publiccode.yml ?
----
CIIBP: Basics project website content
SPC: similar to Document your objectives, Use plain English, Welcome contributions
* CIIBP: The project website MUST succinctly describe what the software does (what problem does it solve?).
* SPC GAP: implied
* CIIBP: The project website MUST provide information on how to: obtain, provide feedback (as bug reports or enhancements), and contribute to the software.
* SPC: Welcome contributions
* CIIBP: The information on how to contribute MUST explain the contribution process
* SPC: Welcome contributions
* CIIBP: The information on how to contribute SHOULD include the requirements for acceptable contributions
* SPC: Welcome contributions
----
CIIBP: OSS License
SPC: Publish with an open source license
* in general very similar. SPC is a bit more strict choice of license. CIIBP more strict for "The project MUST post the license(s) of its results in a standard location in their source repository."
* consider adding using standard names and locations as part of Open Standards?
----
CIIBP: Documentation
SPC: Document your code
* CIIBP: The project MUST provide basic documentation for the software produced by the project.
* SPC: explicit in Document your code
* CIIBP: The project MUST provide reference documentation that describes the external interface (both input and output) of the software produced by the project.
* SPC: no mention of APIs in standard, but seen in early incubation assets
* CIIBP: The project sites (website, repository, and download URLs) MUST support HTTPS using TLS.
* SPC: no mention of HTTPS or TLS
* CIIBP: The project MUST have one or more mechanisms for discussion (including proposed changes and issues) that are searchable, allow messages and topics to be addressed by URL, enable new people to participate in some of the discussions, and do not require client-side installation of proprietary software.
* SPC: The project MUST have communication channels for users and developers, for example email lists
* searchable, addressed by url, no proprietary not covered -- issue?
----
CIIBP: Change Control
SPC: Maintain version control, Require review of contributions, Code in the open, Welcome Contributions, Pay attention to codebase maturity
* CIIBP: The project MUST have a version-controlled source repository that is publicly readable and has a URL.
* SPC: A codebase MUST be versioned. All source code for any policy and software in use (unless used for fraud detection) MUST be published and publicly accessible.
* mention URL as SHOULD?
* CIIBP: The project's source repository MUST track what changes were made, who made the changes, and when the changes were made.
* SPC: no specific menion of tracking who/when, rather: All decisions MUST be documented in commit messages
* expand to include more what/who/when ?
* CIIBP: To enable collaborative review, the project's source repository MUST include interim versions for review between releases; it MUST NOT include only final releases.
* SPC: All files in a codebase MUST be version controlled. All decisions MUST be documented in commit messages. Every commit message MUST link to discussions and issues wherever possible
* nothing about review between releases
* CIIBP: It is SUGGESTED that common distributed version control software be used (e.g., git) for the project's source repository.
* SPC: nothing about *distributed* rcs
* make this a SHOULD for Public Code?
----
CIIBP Unique version numbering
* CIIBP: The project results MUST have a unique version identifier for each release intended to be used by users.
* SPC: You SHOULD mark different versions of your codebase, for example using revision tags or textual labels
* CIIBP: It is SUGGESTED that the Semantic Versioning (SemVer) format be used for releases.
* SPC: A codebase that is not yet ready to use MUST have one of these labels: prototype, alpha, beta, pre-release
* does SPC want to mention Semantic Versioning? Probably not.
* consider adding further reading? https://github.com/coreinfrastructure/best-practices-badge/blob/master/doc/criteria.md#version_semver
* CIIBP: It is SUGGESTED that projects identify each release within their version control system. For example, it is SUGGESTED that those using git identify each release using git tags.
* SPC: You SHOULD mark different versions of your codebase, for example using revision tags or textual labels.
----
CIIBP: Release notes
SPC: Pay attention to codebase maturity
* CIIBP: The project MUST provide, in each release, release notes that are a human-readable summary of major changes in that release to help users determine if they should upgrade and what the upgrade impact will be. The release notes MUST NOT be the raw output of a version control log (e.g., the "git log" command results are not release notes).
* SPC: A codebase SHOULD contain a log of changes from version to version, for example in the CHANGELOG
* CIIBP: The release notes MUST identify every publicly known vulnerability with a CVE assignment or similar that is fixed in each new release, unless users typically cannot practically update the software themselves.
* SPC: has nothing around CVEs in release notes
----
CIIBP: Bug-reporting process
* CIIBP: The project MUST provide a process for users to submit bug reports (e.g., using an issue tracker or a mailing list).
* SPC: The codebase MUST allow anyone to submit suggestions for changes to the codebase. The documentation MUST link to both the public issue tracker and submitted codebase changes, for example in a README file
* CIIBP: The project SHOULD use an issue tracker for tracking individual issues.
* SPC: The codebase MUST have a public issue tracker that accepts suggestions from anyone
* CIIBP: The project MUST acknowledge a majority of bug reports submitted in the last 2-12 months (inclusive); the response need not include a fix.
* SPC: nothing specific about issue acknowledgement
* does SPC want/need an issue acknowledgement criterion?
* CIIBP: The project SHOULD respond to a majority (>50%) of enhancement requests in the last 2-12 months (inclusive).
* SPC: nothing about request responsiveness
* does SPC want/need a request responsiveness criterion?
* CIIBP: The project MUST have a publicly available archive for reports and responses for later searching.
* SPC: implied, not stated
* more specific?
----
CIIBP: Vulnerability report process
* CIIBP: The project MUST publish the process for reporting vulnerabilities on the project site.
* SPC: The codebase MUST include an email address for security issues and responsible disclosure
* CIIBP: If private vulnerability reports are supported, the project MUST include how to send the information in a way that is kept private.
* SPC: no statement
* does SPC want/need statement about private reporting of vulnearbility?
* CIIBP: The project's initial response time for any vulnerability report received in the last 6 months MUST be less than or equal to 14 days.
* SPC: no statement
* does SPC want/need criteria covering vulnerability reporting response times?
----
CIIBP: Working build system
* CIIBP: If the software produced by the project requires building for use, the project MUST provide a working build system that can automatically rebuild the software from source code.
* SPC: Continuous integration tests SHOULD validate that the source code and the policy are executed coherently
* SPC: The documentation of your codebase MUST contain a description of how to install and run the source code, examples demonstrating the key functionality
* CIIBP: It is SUGGESTED that common tools be used for building the software.
* SPC: no statement about using common build tools
* CIIBP: The project SHOULD be buildable using only FLOSS tools.
* SPC: no statement about using FOSS build tools
----
CIIBP: Automated test suite
* CIIBP: The project MUST use at least one automated test suite that is publicly released as FLOSS.
* SPC: All functionality in the source code MUST have automated tests. Contributions MUST pass all automated tests before they are admitted into the codebase.
* should add FOSS to tests?
* CIIBP: A test suite SHOULD be invocable in a standard way for that language.
* SPC: no mention
* CIIBP: It is SUGGESTED that the test suite cover most (or ideally all) the code branches, input fields, and functionality.
* SPC: All functionality in the source code MUST have automated tests.
* CIIBP: It is SUGGESTED that the project implement continuous integration
* SPC: Contributions MUST pass all automated tests before they are admitted into the codebase
----
CIIBP: New functionality testing
* CIIBP: the project MUST have a general policy (formal or not) that as major new functionality is added to the software produced by the project, tests of that functionality should be added to an automated test suite.
* SPC: All functionality in the source code MUST have automated tests
* CIIBP: The project MUST have evidence that the test_policy for adding tests has been adhered to in the most recent major changes to the software produced by the project.
* SPC: no mention of testing evidence or metrics
* CIIBP: It is SUGGESTED that this policy on adding tests (see test_policy) be documented in the instructions for change proposals.
* SPC: The codebase MUST include contribution guidelines explaining how contributors can get involved, for example in a CONTRIBUTING file
----
CIIBP: Warning flags
* CIIBP: The project MUST enable one or more compiler warning flags, a "safe" language mode, or use a separate "linter" tool to look for code quality errors or common simple mistakes, if there is at least one FLOSS tool that can implement this criterion in the selected language.
* SPC: no statement on compiler flags
* CIIBP: The project MUST address warnings.
* SPC: no statement on addressing warnings
* CIIBP: It is SUGGESTED that projects be maximally strict with warnings in the software produced by the project, where practical.
* SPC: no statement on maximal strictness with warnings
----
CIIBP: Secure development knowledge
* CIIBP: The project MUST have at least one primary developer who knows how to design secure software.
* SPC: nothing on Secure development knowledge?
* CIIBP: At least one of the project's primary developers MUST know of common kinds of errors that lead to vulnerabilities in this kind of software, as well as at least one method to counter or mitigate each of them.
* SPC: nothing on dev with vulnerabilities & mitigation knowledge?
----
CIIBP: Use basic good cryptographic practices
* CIIBP: The software produced by the project MUST use, by default, only cryptographic protocols and algorithms that are publicly published and reviewed by experts
* SPC: add only use cryptography publicly published and reviewed by experts?
* CIIBP: If the software produced by the project is an application or library, and its primary purpose is not to implement cryptography, then it SHOULD only call on software specifically designed to implement cryptographic functions; it SHOULD NOT re-implement its own.
* SPC: don't roll your own crypto?
* CIIBP: All functionality in the software produced by the project that depends on cryptography MUST be implementable using FLOSS.
* SPC: need only FOSS crypto?
* CIIBP: The security mechanisms within the software produced by the project MUST use default keylengths that at least meet the NIST minimum requirements through the year 2030 (as stated in 2012). It MUST be possible to configure the software so that smaller keylengths are completely disabled.
* SPC: crypto keylenghts?
* CIIBP: The default security mechanisms within the software produced by the project MUST NOT depend on broken cryptographic algorithms
* SPC: don't depend on known-to-be-broken crypto?
* CIIBP: The default security mechanisms within the software produced by the project SHOULD NOT depend on cryptographic algorithms or modes with known serious weaknesses (e.g., the SHA-1 cryptographic hash algorithm or the CBC mode in SSH).
* SPC: don't depend on known to be weak, if safer available?
* CIIBP: The security mechanisms within the software produced by the project SHOULD implement perfect forward secrecy for key agreement protocols so a session key derived from a set of long-term keys cannot be compromised if one of the long-term keys is compromised in the future.
* SPC: implement perfect forward secrecy?
* CIIBP: If the software produced by the project causes the storing of passwords for authentication of external users, the passwords MUST be stored as iterated hashes with a per-user salt by using a key stretching (iterated) algorithm (e.g., PBKDF2, Bcrypt or Scrypt).
* SPC: require password salting?
* CIIBP: The security mechanisms within the software produced by the project MUST generate all cryptographic keys and nonces using a cryptographically secure random number generator, and MUST NOT do so using generators that are cryptographically insecure.
* SPC: only cryptographically secure PRNGs for security?
----
CIIBP: Secured delivery against man-in-the-middle (MITM) attacks
* CIIBP: The project MUST use a delivery mechanism that counters MITM attacks. Using https or ssh+scp is acceptable.
* SPC: avoid MITM via https or ssh?
* CIIBP: A cryptographic hash (e.g., a sha1sum) MUST NOT be retrieved over http and used without checking for a cryptographic signature.
* SPC: check cryptographic hash signatures & use https
----
CIIBP: Publicly known vulnerabilities fixed
* CIIBP: There MUST be no unpatched vulnerabilities of medium or high severity that have been publicly known for more than 60 days.
* SPC: no unpatch known vulnerabilities older than 60 days?
* CIIBP: Projects SHOULD fix all critical vulnerabilities rapidly after they are reported.
* SPC: rapidly fix all reported critical vulnerabilities
----
CIIBP: Other security issues
* CIIBP: The public repositories MUST NOT leak a valid private credential (e.g., a working password or private key) that is intended to limit public access.
* SPC: Contributors MUST NOT upload sensitive information regarding users, their organization or third parties to the repository. Examples of sensitive information include configurations, usernames and passwords, public keys and other real credentials used in the production system.
----
CIIBP: Static code analysis
* CIIBP: At least one static code analysis tool (beyond compiler warnings and "safe" language modes) MUST be applied to any proposed major production release of the software before its release, if there is at least one FLOSS tool that implements this criterion in the selected language.
* SPC: Static code analysis?
* CIIBP: It is SUGGESTED that at least one of the static analysis tools used for the static_analysis criterion include rules or approaches to look for common vulnerabilities in the analyzed language or environment.
* SPC: rules approach to look for common vulnerabilities?
* CIIBP: All medium and high severity exploitable vulnerabilities discovered with static code analysis MUST be fixed in a timely way after they are confirmed.
* SPC: timely fixing of severity exploitable vulnerabilities discovered with static code analysis?
* CIIBP: It is SUGGESTED that static source code analysis occur on every commit or at least daily.
* SPC: add static code analysis to continuous integration?
----
CIIBP: Dynamic code analysis
* CIIBP: It is SUGGESTED that at least one dynamic analysis tool be applied to any proposed major production release of the software before its release.
* SPC: suggest fuzz testing or Zed Attack Proxy?
* CIIBP: It is SUGGESTED that if the software produced by the project includes software written using a memory-unsafe language (e.g., C or C++), then at least one dynamic tool (e.g., a fuzzer or web application scanner) be routinely used in combination with a mechanism to detect memory safety problems such as buffer overwrites.
* SPC: scan and test for memory safety violations?
* CIIBP: It is SUGGESTED that the software produced by the project include many run-time assertions that are checked during dynamic analysis.
* SPC: suggest dynamic asserts?
* CIIBP: All medium and high severity exploitable vulnerabilities discovered with dynamic code analysis MUST be fixed in a timely way after they are confirmed.
* SPC: "timely" fixes of medium and high severity exploitable vulnerabilities discovered with dynamic code analysis?
----
Misc notes:
----