2020-10-26 23:22:13 +03:00
# Security Scorecards
2021-01-11 21:14:06 +03:00
2021-01-07 22:40:55 +03:00
![build ](https://github.com/ossf/scorecard/workflows/build/badge.svg?branch=main )
![CodeQL ](https://github.com/ossf/scorecard/workflows/CodeQL/badge.svg?branch=main )
2021-01-27 01:17:31 +03:00
[![codecov ](https://codecov.io/gh/ossf/scorecard/branch/main/graph/badge.svg?token=PMJ6NAN9J3 )](https://codecov.io/gh/ossf/scorecard)
2020-10-09 17:47:59 +03:00
2020-11-06 20:36:23 +03:00
< img align = "right" src = "artwork/openssf_security.png" width = "200" height = "400" >
2021-02-23 18:27:36 +03:00
<!-- vim - markdown - toc GFM -->
2021-02-23 18:01:49 +03:00
* [Motivation ](#motivation )
* [Goals ](#goals )
* [Public Data ](#public-data )
* [Usage ](#usage )
* [Package manager support ](#package-manager-support )
* [Docker ](#docker )
* [Caching ](#caching )
* [Blob Cache ](#blob-cache )
* [Disk Cache ](#disk-cache )
2021-03-13 01:57:44 +03:00
* [Gitcache ](#gitcache )
* [In the initial run ](#in-the-initial-run )
* [On the subsequent runs ](#on-the-subsequent-runs )
2021-02-23 18:01:49 +03:00
* [Authentication ](#authentication )
* [GITHUB_AUTH_TOKEN ](#github_auth_token )
* [Checks ](#checks )
* [Results ](#results )
* [Running specific checks ](#running-specific-checks )
* [Formatting Results ](#formatting-results )
* [Requirements ](#requirements )
* [Contributing ](#contributing )
2021-02-23 18:27:36 +03:00
<!-- vim - markdown - toc -->
2020-10-16 18:08:43 +03:00
## Motivation
2020-10-09 21:28:31 +03:00
A short motivational video clip to inspire us: https://youtu.be/rDMMYT3vkTk "You passed! All D's ... and an A!"
2020-10-09 20:39:00 +03:00
2020-10-16 18:08:43 +03:00
## Goals
2021-01-05 03:47:02 +03:00
1. Automate analysis and trust decisions on the security posture of open source projects.
2020-10-09 20:39:00 +03:00
1. Use this data to proactively improve the security posture of the critical projects the world depends on.
2020-11-12 21:26:38 +03:00
## Public Data
If you're only interested in seeing the results over time, we run this program nightly and publish the results in
2020-11-13 05:13:34 +03:00
`json` format.
2020-11-12 21:26:38 +03:00
2020-11-13 06:29:55 +03:00
This data is available on Google Cloud Storage and can be downloaded via the
[`gsutil` ](https://cloud.google.com/storage/docs/gsutil_install )
command-line tool.
2020-11-12 21:26:38 +03:00
```shell
$ gsutil ls gs://ossf-scorecards/
2020-11-13 05:13:34 +03:00
gs://ossf-scorecards/11-11-2020.json
2020-11-12 21:26:38 +03:00
...
```
2021-03-15 19:16:33 +03:00
The latest results are also always available at https://storage.googleapis.com/ossf-scorecards/latest.json
2020-11-13 20:06:46 +03:00
2020-11-13 06:29:55 +03:00
The list of projects that are checked each night is available in the
2021-06-04 18:08:30 +03:00
[`cron/data/projects.csv` ](https://github.com/ossf/scorecard/blob/main/cron/data/projects.csv )
2020-11-13 06:29:55 +03:00
file in this repository. If you would like us to track more, please feel free to
send a Pull Request with others.
2020-11-12 21:26:38 +03:00
2020-10-09 17:47:59 +03:00
## Usage
The program only requires one argument to run, the name of the repo:
```shell
2020-10-16 17:54:29 +03:00
$ go build
$ ./scorecard --repo=github.com/kubernetes/kubernetes
2020-10-19 18:09:10 +03:00
Starting [Active]
2021-01-05 03:47:02 +03:00
Starting [Branch-Protection]
2020-10-17 09:48:25 +03:00
Starting [CI-Tests]
2020-10-16 17:54:29 +03:00
Starting [CII-Best-Practices]
Starting [Code-Review]
Starting [Contributors]
Starting [Frozen-Deps]
Starting [Fuzzing]
2021-01-15 19:29:07 +03:00
Starting [Packaging]
2020-10-16 21:22:28 +03:00
Starting [Pull-Requests]
2020-10-19 19:58:51 +03:00
Starting [SAST]
2020-10-16 17:54:29 +03:00
Starting [Security-Policy]
2020-10-17 09:48:25 +03:00
Starting [Signed-Releases]
2020-10-16 17:54:29 +03:00
Starting [Signed-Tags]
Finished [Fuzzing]
2020-10-19 18:09:10 +03:00
Finished [CII-Best-Practices]
2021-01-05 03:47:02 +03:00
Finished [Branch-Protection]
2021-01-15 19:29:07 +03:00
Finished [Packaging]
Finished [Security-Policy]
Finished [Frozen-Deps]
2020-10-18 03:08:53 +03:00
Finished [Signed-Tags]
2021-01-15 19:29:07 +03:00
Finished [Signed-Releases]
2020-10-19 19:58:51 +03:00
Finished [SAST]
2021-01-15 19:29:07 +03:00
Finished [CI-Tests]
2020-10-19 19:58:51 +03:00
Finished [Active]
2021-01-15 19:29:07 +03:00
Finished [Contributors]
Finished [Pull-Requests]
Finished [Code-Review]
2020-10-09 18:26:43 +03:00
RESULTS
-------
2020-10-19 18:09:10 +03:00
Active: Pass 10
2021-01-15 19:29:07 +03:00
Branch-Protection: Fail 10
2020-10-19 18:09:10 +03:00
CI-Tests: Pass 10
CII-Best-Practices: Pass 10
Code-Review: Pass 10
Contributors: Pass 10
Frozen-Deps: Pass 10
Fuzzing: Pass 10
2021-01-15 19:29:07 +03:00
Packaging: Fail 0
2020-10-19 18:09:10 +03:00
Pull-Requests: Pass 10
2021-01-15 19:29:07 +03:00
SAST: Fail 10
2020-10-19 18:09:10 +03:00
Security-Policy: Pass 10
Signed-Releases: Fail 10
2021-01-15 19:29:07 +03:00
Signed-Tags: Fail 10
2020-10-09 17:47:59 +03:00
```
2021-02-02 19:29:31 +03:00
### Package manager support
2021-03-01 19:21:20 +03:00
scorecard has an option to provide either `--npm` / `--pypi` / `--rubygems`
package name and it would run the checks on the corresponding GitHub source
code.
For example:
2021-02-02 19:29:31 +03:00
2021-02-23 18:27:36 +03:00
``` shell
2021-02-02 19:29:31 +03:00
./scorecard --npm=angular
Starting [Active]
Starting [Branch-Protection]
Starting [CI-Tests]
Starting [CII-Best-Practices]
Starting [Code-Review]
Starting [Contributors]
Starting [Frozen-Deps]
Starting [Fuzzing]
Starting [Packaging]
Starting [Pull-Requests]
Starting [SAST]
Starting [Security-Policy]
Starting [Signed-Releases]
Starting [Signed-Tags]
Finished [Signed-Releases]
Finished [Fuzzing]
Finished [CII-Best-Practices]
Finished [Security-Policy]
Finished [CI-Tests]
Finished [Packaging]
Finished [SAST]
Finished [Code-Review]
Finished [Branch-Protection]
Finished [Frozen-Deps]
Finished [Signed-Tags]
Finished [Active]
Finished [Pull-Requests]
Finished [Contributors]
RESULTS
-------
Active: Fail 10
Branch-Protection: Fail 0
CI-Tests: Pass 10
CII-Best-Practices: Fail 10
Code-Review: Pass 10
Contributors: Pass 10
Frozen-Deps: Fail 0
Fuzzing: Fail 10
Packaging: Fail 0
Pull-Requests: Fail 9
SAST: Fail 10
Security-Policy: Pass 10
Signed-Releases: Fail 0
Signed-Tags: Fail 10
```
2021-02-23 18:27:36 +03:00
### Docker
`scorecard` is available as a Docker container:
The `GITHUB_AUTH_TOKEN` has to be set to a valid [token ](#github_auth_token )
``` shell
2021-05-11 17:11:06 +03:00
docker run -e GITHUB_AUTH_TOKEN=token gcr.io/openssf/scorecard:latest --show-details --repo=https://github.com/ossf/scorecard
2021-02-23 18:27:36 +03:00
```
2021-02-22 20:18:28 +03:00
### Caching
Scorecard uses `httpcache` with < https: // docs . github . com / en / rest / overview / resources-in-the-rest-api # conditional-requests > for caching httpresponse. The default cache is in-memory.
2021-02-23 18:01:49 +03:00
Some details on caching < https: / / github . com / ossf / scorecard / issues / 80 # issuecomment-782723182 >
#### Blob Cache
Scorecard results can be cached into a blob for increasing throughput for subsequent runs.
To use blob cache two env variables have to be set `USE_BLOB_CACHE=true` and `BLOB_URL=gs://scorecards-cache/` .
The code uses < https: / / github . com / google / go-cloud > for blob caching. It is compatible with GCS,S3 and Azure blob.
2021-02-22 20:18:28 +03:00
#### Disk Cache
Scorecard results can be cached into a disk for increasing throughput for subsequent runs.
To use disk cache two env variables have to be set `USE_DISK_CACHE=true` and `DISK_CACHE_PATH=./cache` .
There is no TTL on cache.
2021-02-23 18:01:49 +03:00
The default cache size is 10GB.
2021-03-13 01:57:44 +03:00
### Gitcache
Gitcache reduces the GitHub API usage by cloning the Git repository without authentication and checking for updates.
#### In the initial run
- Clone the repository anonymously (not using GitHub API token).
- Tarball and compress it.
- Store the compressed file into a blob store GCS.
- Store the last commit date within the blob.
- Also compress the folder without .git for the consumers.
#### On the subsequent runs
- pull gzip from GCS
- unzip git repo
- git pull origin
- update metadata (last sync, etc.)
- gzip, reupload to GCS
[gitcache ](gitcache/README.md ) documentation for more details.
2021-02-22 20:18:28 +03:00
2020-11-13 20:06:46 +03:00
### Authentication
2020-11-13 05:14:59 +03:00
Before running Scorecard, you need to
[create a GitHub access token ](https://docs.github.com/en/free-pro-team@latest/developers/apps/about-apps#personal-access-tokens )
and set it in environment variable `GITHUB_AUTH_TOKEN` .
This helps to avoid the GitHub's
[api rate limits ](https://developer.github.com/v3/#rate-limiting )
with unauthenticated requests.
2020-10-09 17:47:59 +03:00
```shell
2020-11-13 05:14:59 +03:00
# For posix platforms, e.g. linux, mac:
2020-10-16 17:54:29 +03:00
export GITHUB_AUTH_TOKEN=< your access token >
2020-11-13 05:14:59 +03:00
# For windows:
set GITHUB_AUTH_TOKEN=< your access token >
2020-10-09 17:47:59 +03:00
```
2021-01-11 21:14:06 +03:00
#### GITHUB_AUTH_TOKEN
Multiple `GITHUB_AUTH_TOKEN` can be provided separated by comma to be utilized in a round robin fashion.
2020-11-13 20:06:46 +03:00
As an alternative to personal access tokens, we also support GitHub App Installations
for higher rate-limit quotas.
If you have an installed GitHub App and key file, you can use these three environment
variables, following the commands shown above for your platform.
```
GITHUB_APP_KEY_PATH=< path to the key file on disk >
GITHUB_APP_INSTALLATION_ID=< installation id >
GITHUB_APP_ID=< app id >
```
These can be obtained from the GitHub [developer settings ](https://github.com/settings/apps ) page.
2020-10-09 17:47:59 +03:00
## Checks
The following checks are all run against the target project:
2021-01-05 03:47:02 +03:00
| Name | Description |
| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2021-02-14 20:43:21 +03:00
| Security-Policy | Does the project contain a [security policy ](https://docs.github.com/en/free-pro-team@latest/github/managing-security-vulnerabilities/adding-a-security-policy-to-your-repository )? |
2021-01-05 03:47:02 +03:00
| Contributors | Does the project have contributors from at least two different organizations? |
| Frozen-Deps | Does the project declare and freeze [dependencies ](https://docs.github.com/en/free-pro-team@latest/github/visualizing-repository-data-with-graphs/about-the-dependency-graph#supported-package-ecosystems )? |
| Signed-Releases | Does the project cryptographically [sign releases ](https://wiki.debian.org/Creating%20signed%20GitHub%20releases )? |
| Signed-Tags | Does the project cryptographically sign release tags? |
| CI-Tests | Does the project run tests in CI, e.g. [GitHub Actions ](https://docs.github.com/en/free-pro-team@latest/actions ), [Prow ](https://github.com/kubernetes/test-infra/tree/master/prow )? |
| Code-Review | Does the project require code review before code is merged? |
| CII-Best-Practices | Does the project have a [CII Best Practices Badge ](https://bestpractices.coreinfrastructure.org/en )? |
| Pull-Requests | Does the project use [Pull Requests ](https://docs.github.com/en/free-pro-team@latest/github/collaborating-with-issues-and-pull-requests/about-pull-requests ) for all code changes? |
2021-01-11 21:14:06 +03:00
| Fuzzing | Does the project use fuzzing tools, e.g. [OSS-Fuzz ](https://github.com/google/oss-fuzz )? |
2021-01-05 03:47:02 +03:00
| SAST | Does the project use static code analysis tools, e.g. [CodeQL ](https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/enabling-code-scanning-for-a-repository#enabling-code-scanning-using-actions ), [SonarCloud ](https://sonarcloud.io )? |
2021-01-11 21:14:06 +03:00
| Active | Did the project get any commits in the last 90 days? |
2021-01-27 01:17:31 +03:00
| Branch-Protection | Does the project use [Branch Protection ](https://docs.github.com/en/free-pro-team@latest/github/administering-a-repository/about-protected-branches ) ? |
| Packaging | Does the project build and publish official packages from CI/CD, e.g. [GitHub Publishing ](https://docs.github.com/en/free-pro-team@latest/actions/guides/about-packaging-with-github-actions#workflows-for-publishing-packages ) ? |
2020-10-09 17:47:59 +03:00
2021-01-27 10:42:57 +03:00
To see detailed information about each check and remediation steps,
2021-04-16 21:15:56 +03:00
check out the [checks documentation page ](checks/checks.md ).
2020-10-22 17:38:33 +03:00
2020-10-14 22:42:05 +03:00
If you'd like to add a check, make sure it is something that meets the following criteria:
2021-01-05 03:47:02 +03:00
- automate-able
- objective
- actionable
2020-10-14 22:42:05 +03:00
and then create a new GitHub Issue.
2020-10-09 17:47:59 +03:00
## Results
2020-11-10 05:29:37 +03:00
Each check returns a **Pass / Fail** decision, as well as a confidence score between **0 and 10** .
2020-10-09 17:47:59 +03:00
A confidence of 0 should indicate the check was unable to achieve any real signal, and the result
should be ignored.
A confidence of 10 indicates the check is completely sure of the result.
Many of the checks are based on heuristics, contributions are welcome to improve the detection!
2020-11-10 05:29:37 +03:00
### Running specific checks
To use a particular check(s), add the `--checks` argument with a list of check
names.
For example, `--checks=CI-Tests,Code-Review` .
### Formatting Results
2020-11-12 21:59:02 +03:00
There are three formats currently: `default` , `json` , and `csv` . Others may be added in the future.
2020-11-10 05:29:37 +03:00
These may be specified with the `--format` flag.
## Requirements
2021-01-05 03:47:02 +03:00
- The scorecard must only be composed of automate-able, objective data. For example, a project having 10 contributors doesn’ t necessarily mean it’ s more secure than a project with say 50 contributors. But, having two maintainers might be preferable to only having one - the larger bus factor and ability to provide code reviews is objectively better.
- The scorecard criteria can be as specific as possible and not limited general recommendations. For example, for Go, we can recommend/require specific linters and analyzers to be run on the codebase.
- The scorecard can be populated for any open source project without any work or interaction from maintainers.
- Maintainers must be provided with a mechanism to correct any automated scorecard findings they feel were made in error, provide "hints" for anything we can't detect automatically, and even dispute the applicability of a given scorecard finding for that repository.
- Any criteria in the scorecard must be actionable. It should be possible, with help, for any project to "check all the boxes".
- Any solution to compile a scorecard should be usable by the greater open source community to monitor upstream security.
2020-11-05 23:27:10 +03:00
2021-01-05 20:32:06 +03:00
2021-01-05 16:45:15 +03:00
2020-11-05 23:27:10 +03:00
## Contributing
If you want to get involved or have ideas you'd like to chat about, we discuss this project in the [OSSF Best Practices Working Group ](https://github.com/ossf/wg-best-practices-os-developers ) meetings.
See the [Community Calendar ](https://calendar.google.com/calendar?cid=czYzdm9lZmhwNWk5cGZsdGI1cTY3bmdwZXNAZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ ) for the schedule and meeting invitations.
See the [Contributing ](CONTRIBUTING.md ) documentation for guidance on how to contribute.