FLOSSベストプラクティス基準(すべてのレベル)

これは、合格、シルバー、およびゴールドバッジレベルでコアインフラストラクチャイニシアチブ(CII)ベストプラクティスバッジを達成するための、フリー/リブレおよびオープンソースソフトウェア(FLOSS)プロジェクトのベストプラクティスのセットです。このリストは、基準のみまたは追加情報とともに表示できます。 合格シルバーゴールドの基準だけでなく、 基準の統計も表示できます。

これらの基準の詳細については、 基準の説明を参照してください。

合格

基本的情報

基本的なプロジェクト ウェブサイトのコンテンツ

  • プロジェクトのウェブサイトは、ソフトウェアが何をするのか(何の問題を解決するのか)を簡潔に記述しなければなりません。 [description_good]
    詳細:
    これは、潜在的なユーザーが理解できる言語でなければなりません(例えば、それは最小限の専門用語を使用します)。
  • プロジェクトのウェブサイトは、取得方法、フィードバックの提供方法(バグ報告や拡張機能)、ソフトウェアへの貢献方法に関する情報を提供しなければなりません。 [interact]
  • 貢献する方法に関する情報は、貢献プロセス(たとえばプル リクエストが使用されか、など)を説明する必要があります。 {Met URL} [contribution]
    詳細:
    別段の記載がない限り、GitHub上のプロジェクトは、(GitHubが提供する)課題管理とプルリクエストを使用することを想定します。この情報は不足しているかもしれません。すなわち、プロジェクトがプルリクエストと課題追跡ツールを使うことか、メーリングリストへの投稿を言及している。(どちら?)
  • 貢献する方法に関する情報は、貢献を受け入れるための要件(たとえば、必要なコーディング標準への参照)を含むべきです。 {Met URL} [contribution_requirements]

FLOSSライセンス

  • プロジェクトによって作成されたソフトウェアは、FLOSSとしてリリースされなければなりません。 [floss_license]
    詳細:
    FLOSSは、オープンソース定義またはフリーソフトウェア定義を満たす方法でリリースされたソフトウェアです。そのようなライセンスの例としては、CC0MIT2項型BSD 3項型BSD Apache 2.0 Less GNU General Public License(LGPL)、および GNU General Public License(GPL)を参照してください。私たちの目的のためには、これはライセンスが以下のものでなければならないことを意味します: ソフトウェアは他の方法でライセンスされているかもしれません(たとえば、「GPLv2またはプロプライエタリ」は許容されます)。
  • プロジェクトによって作成されたソフトウェアに必要なライセンスは、オープンソース・イニシアチブ(OSI)によって承認されていることが推奨されています。 [floss_license_osi]
    詳細:
    OSIは、厳格な承認プロセスを使用して、どのライセンスがOSSであるかを判断します。
  • プロジェクトは、結果のライセンスをソースリポジトリの標準的な場所に投稿しなければなりません。 {Met URL} [license_location]
    詳細:
    たとえば、LICENSEまたはCOPYINGという名前の最上位ファイルです。ライセンスファイル名の後に ".txt" や ".md" などの拡張子を付けることができます。別の規則は、ライセンスファイルを含むLICENSESという名前のディレクトリを持つことです。これらのファイルは通常、 REUSE仕様で説明されているように、SPDXライセンス識別子とそれに続く適切なファイル拡張子として名前が付けられます。この基準は、ソースリポジトリの要件にすぎないことに注意してください。ソースコード(実行可能ファイル、パッケージ、コンテナなど)から何かを生成するときに、ライセンスファイルを含める必要はありません。たとえば、Comprehensive R Archive Network(CRAN)のRパッケージを生成するときは、標準のCRANプラクティスに従います。ライセンスが標準ライセンスの場合は、標準の短いライセンス仕様を使用して(テキストのコピーをさらにインストールしないようにするため)、リストします。 .Rbuildignoreなどの除外ファイル内のLICENSEファイル。同様に、Debianパッケージを作成する場合、著作権ファイルに /usr/share/common-licenses のライセンス テキストへのリンクを配置し、作成したパッケージからライセンス ファイルを除外できます(たとえば、dh_auto_installを呼び出した後にファイルを削除します )。可能な場合は、生成された形式で機械可読ライセンス情報を含めることをお勧めします。

ドキュメンテーション

  • プロジェクトは、プロジェクトによって作成されたソフトウェアに関する基本的なドキュメンテーションを提供しなければなりません。 {N/A justification} [documentation_basics]
    詳細:
    このドキュメントは、インストール方法、起動方法、使用方法(可能であれば例示したチュートリアル)、および、そのソフトウェアの適切なトピックであれば安全に使用する方法(たとえば何をするべきで、何をすべきでないか)を記述し、メディア(たとえば、テキストやビデオなど)に収められている必要があります。セキュリティの文書は必ずしも長文である必要はありません。プロジェクトは、ドキュメンテーションとしてプロジェクト以外の素材へのハイパーテキストリンクを使用してもよいです。プロジェクトがソフトウェアを作成しない場合は、「該当なし」(N / A)を選択します。
  • プロジェクトは、プロジェクトによって作成されたソフトウェアの外部インタフェース(入力と出力の両方)を記述する参照ドキュメントを提供しなければなりません。 {N/A justification} [documentation_interface]
    詳細:
    外部インターフェイスのドキュメントは、エンドユーザーまたは開発者に、その使用方法を説明します。ドキュメントには、ソフトウェアにアプリケーション プログラム インターフェイス(API)が含まれている場合、アプリケーション プログラム インターフェイスが含まれます。ライブラリの場合、呼び出すことができる主要なクラス/型とメソッド/関数を文書化します。ウェブ アプリケーションの場合、URLインタフェース(多くの場合、RESTインタフェース)を定義します。コマンドラインインターフェイスの場合は、サポートするパラメータとオプションを文書化します。多くの場合、ドキュメントのほとんどを自動生成すると、ソフトウェアが変更されたときにドキュメントがソフトウェアと同期したままなので、最も良い方法ですが、これは必須ではありません。プロジェクトは、ドキュメンテーションとしてプロジェクト以外の素材へのハイパーテキストリンクを使用してもよいです。ドキュメンテーションは自動的に生成されるかもしれません(実際的に、しばしばこれを行う最良の方法です)。 RESTインタフェースのドキュメントは、Swagger / OpenAPIを使用して生成することができます。コード インタフェースのドキュメントは、 JSDoc (JavaScript)、 ESDoc (JavaScript)、pydoc(Python)、devtools (R)、pkgdown (R)、およびDoxygen(多数)のいずれかです。実装コードにコメントがあるだけでは、この基準を満たすには不十分です。すべてのソースコードを読むことなく情報を見るための簡単な方法が必要です。プロジェクトがソフトウェアを作成しない場合は、「該当なし」(N/A)を選択します。

その他

  • プロジェクトサイト(ウェブサイト、リポジトリ、およびダウンロードURL)は、TLSを使用したHTTPSをサポートしなければなりません。 [sites_https]
    詳細:
    これには、プロジェクトのホームページのURLとバージョン管理リポジトリのURLが「http:」ではなく「https:」で始まる必要があります。Let's Encryptからフリーの証明書を入手できます。プロジェクトは、(例えば) GitHubページ GitLabページ、またはSourceForgeプロジェクトページを使ってこの基準を実装してもよいです。HTTPをサポートしている場合は、HTTPトラフィックをHTTPSにリダイレクトすることを強くお勧めします。
  • プロジェクトは、議論(提案された変更や問題を含む)のための1つ以上の検索可能なメカニズムを持たなければならず、メッセージやトピックがURLでアドレス指定され、新しい人々がディスカッションのいくつかに参加できるようにしなければならず、クライアント側でプロプライエタリなソフトウェアのインストールを必要としないようにします。 [discussion]
    詳細:
    受け入れ可能なメカニズムの例には、アーカイブされたメーリングリスト、GitHubのイシューとプルリクエストの議論、Bugzilla、Mantis、Tracなどがあります。非同期ディスカッション メカニズム(IRCなど)は、これらの基準を満たしていれば許容されます。 URLアドレス可能なアーカイブ機構があることを確認してください。独自のJavaScriptは、推奨されませんが、許可されています。
  • プロジェクトは英語で文書を提供し、英語でコードに関するバグ報告とコメントを受け入れることができるべきです。 [english]
    詳細:
    現在、英語はコンピュータ技術のリンガ フランカです。英語をサポートすることで、世界中のさまざまな潜在的な開発者とレビュアーの数を増やします。コア開発者の主要言語が英語でなくても、プロジェクトはこの基準を満たすことができます。
  • プロジェクトはメンテナンスされている必要があります。 [maintained]
    詳細:
    少なくとも、プロジェクトは重大な問題と脆弱性の報告に対応するように努める必要があります。バッジを積極的に追求しているプロジェクトは、おそらくメンテナンスされているでしょう。すべてのプロジェクトや人のリソースには限りがあり、提案された変更をプロジェクトが拒否しなければならないこともあるため、リソースに限りがあることや、提案が拒否されることが、メンテナンスされていないプロジェクトを示すわけではありません。

    プロジェクトが今後メンテナンスされなくなることがわかった場合は、この基準を「不適合(Unmet)」に設定し、適切なメカニズムを使用して、メンテナンスされないことを人々に示す必要があります。たとえば、READMEの最初の見出しに「DEPRECATED」(将来のサポートが保証されないので使用すべきでない)を使用し、ホームページの先頭近くに「DEPRECATED」を追加し、コード リポジトリのプロジェクトの説明の先頭に「DEPRECATED」を追加し、そのREADMEおよび/またはホームページにno-maintenance-intendedバッジを追加し、すべてのパッケージ リポジトリでdeprecated(非推奨)としてマークしたり(例: npm deprecate )、コード リポジトリのマーキングシステムを使用してアーカイブします(例:GitHubの"archive" 設定、GitLabの"archived" マーキング、 Gerritの "readonly" ステータス、またはSourceForgeの"abandoned" プロジェクト ステータス)。詳細な説明については、こちらを参照してください。

変更管理

公開されたバージョン管理ソースリポジトリ

  • プロジェクトには、公開され、URLを持つ、バージョン管理のソース リポジトリがなければなりません。 [repo_public]
    詳細:
    URLはプロジェクトのURLと同じであってもよいです。プロジェクトは、変更が公開されていない間に(例えば、公開前に脆弱性を修正するため)、特定のケースでプライベート(非公開)ブランチを使用することができます。
  • プロジェクトのソース リポジトリは、どのような変更が行われたのか、誰が変更を行ったのか、いつ変更が行われたのかを追跡しなければなりません。 [repo_track]
  • 共同レビューを可能にするために、プロジェクトのソースリポジトリには、リリース間のレビューのための中間バージョンが含まれなければなりません。最終リリースのみを含めることはできません。 [repo_interim]
    詳細:
    プロジェクトは、公開ソース リポジトリから特定の暫定版を省略することを選択することができます。(たとえば、特定の非公開のセキュリティ脆弱性を修正するものは、公開されないか、または、合法的に投稿できないか、最終リリースに入らないです)
  • プロジェクトのソース リポジトリに共通の分散バージョン管理ソフトウェア(gitなど)を使用することを推奨します。 [repo_distributed]
    詳細:
    Gitが特別に必要とされているわけでなく、プロジェクトでは、集中型バージョン管理ソフトウェア(例:subversion)を正当とする証拠を持って使用できます。

一意的なバージョン番号

  • プロジェクトの結果には、ユーザーが使用することを意図されたリリースごとに固有のバージョン識別子が必要です。 [version_unique]
    詳細:
    これはコミットID(git commit idやmercurial changeset idなど)やバージョン番号(YYYYMMDDのようなセマンティックバージョニングや日付ベースのスキームを使用するバージョン番号を含む)など、さまざまな方法で対応できます。
  • リリースには、Semantic Versioning (SemVer)またはCalendar Versioning (CalVer)のバージョン番号形式を使用することが推奨されます。CalVerを使用する場合は、マイクロレベル値を含めることが推奨されます。 [version_semver]
    詳細:
    プロジェクトは一般的に、エコシステムで使用されている通常のフォーマットなど、ユーザーが期待しているフォーマットを優先するべきです。多くのエコシステムではSemVerが好まれており、一般的にSemVerはアプリケーションプログラマインターフェース(API)やソフトウェア開発キット(SDK)に好まれています。CalVerは、規模が大きく、独自に開発した依存関係が異常に多いプロジェクトや、スコープが常に変化するプロジェクト、時間的な制約があるプロジェクトで使用される傾向があります。CalVerを使用する際には、マイクロレベルの値を含めることが推奨されます。マイクロレベルを含めることで、必要になった場合にはいつでも同時にメンテナンスされるブランチをサポートできるからです。git commit ID や mercurial changeset ID など、バージョンを一意に識別できるものであれば、他のバージョン番号形式をバージョン番号として使用することができます。しかし、(git commit ID のような)いくつかの代替形式は、リリースの識別子として問題を引き起こす可能性があります。すべての受信者が最新バージョンを実行しているだけの場合 (たとえば、継続的な配信を介して常に更新されている単一のWebサイトまたはインターネットサービスのコード)には、バージョン ID の形式はソフトウェアのリリースを識別する上で重要ではないかもしれません。
  • プロジェクトがバージョン管理システム内の各リリースを特定することが推奨されています。たとえば、gitを使用しているユーザーがgitタグを使用して各リリースを特定することが推奨されています。 [version_tags]

リリースノート

  • プロジェクトは、各リリースにおいて、ユーザーがアップグレードすべきかどうか、また、アップグレードの影響を判断できるよう、そのリリースの主要な変更の要約を説明したリリースノートを提供しなければなりません(MUST)。リリースノートは、バージョン管理ログの生の出力であってはなりません(例えば、 "git log"コマンドの結果はリリースノートではない)。プロジェクトの成果物が複数の場所で再利用されることを意図していないプロジェクト(単独のウェブサイトやサービスのためのソフトウェアなど)で、かつ、継続的・断続的な配布を行う場合は、「該当なし」を選択することができます。 {N/A justification} {Met URL} [release_notes]
    詳細:
    リリースノートは様々な方法で実装できます(MAY)。多くのプロジェクトは、 "NEWS"、 "CHANGELOG"、または "ChangeLog"という名前のファイルでそれらを提供し、 ".txt"、 ".md"、 ".html"などの拡張子を付けることもあります。歴史的には、 "change log"という言葉はすべての変更のログを意味していましたが、本基準を満たすために必要なものは、人間が読める要約です。リリースノートは代わりに、 GitHubリリースのワークフローなどのバージョン管理システムのメカニズムによって提供してもよい(MAY)。
  • リリースノートでは、このリリースで修正された、リリースの作成時にすでにCVE割り当てなどがあった、公に知られているランタイムの脆弱性をすべて特定する必要があります。 ユーザーが通常、ソフトウェアを実際に更新できない場合(たとえば、カーネルの更新によくあることです)、この基準は該当なし(N/A)としてマークされる場合があります。 この基準はプロジェクトの結果にのみ適用され、依存関係には適用されません。 リリースノートがない場合、または公に知られている脆弱性がない場合は、[N/A]を選択します。 {N/A justification} [release_notes_vulns]
    詳細:
    この基準は、特定の更新によって一般に知られている脆弱性が修正されるかどうかをユーザーが判断するのに役立ち、ユーザーが情報に基づいて更新について決定できるようにします。ユーザーが通常、コンピューター上でソフトウェア自体を実際に更新することはできず、代わりに1つ以上の仲介者に依存して更新を実行する必要がある場合(カーネルお​​よびカーネルと絡み合っている下位レベルのソフトウェアの場合によくあることです)、この追加情報はそれらのユーザーには役立たないため、プロジェクトは「該当なし」(N/A)を選択する場合があります。同様に、すべての受信者が最新バージョンのみを実行している場合(継続的デリバリーによって絶えず更新される単一のWebサイトまたはインターネットサービスのコードなど)、プロジェクトはN/Aを選択できます。この基準はプロジェクトの結果にのみ適用され、依存関係には適用されません。プロジェクトのすべての推移的な依存関係の脆弱性を一覧表示することは、依存関係が増加および変化するにつれて扱いにくくなるため、不要です。依存関係を調べて追跡するツールがよりスケーラブルな方法でこれを実行できます。

報告

バグ報告プロセス

  • プロジェクトは、ユーザーが不具合報告を送信するプロセスを提供しなければなりません(たとえば、課題トラッカーやメーリングリストを使用します)。 {Met URL} [report_process]
  • プロジェクトは、個々の課題を追跡するための課題トラッカーを使用するべきです。 [report_tracker]
  • このプロジェクトは、過去2〜12か月間に提出された多数のバグ報告の受領を認めなければなりません。応答に修正を含める必要はありません。 [report_responses]
  • プロジェクトは、直近2〜12ヶ月(2ヶ月を含む)に増強要求の多数(> 50%)に対応すべきです。 [enhancement_responses]
    詳細:
    応答は、「いいえ」や、そのメリットについての議論であってもよいです。目標は、単にプロジェクトがまだ生きていることを示している、いくつかの要求に対する応答があることです。この基準のために、プロジェクトは偽のリクエスト(スパマーや自動システムなど)をカウントする必要はありません。プロジェクトで機能強化が行われていない場合は、「満足されない」(unmet)を選択し、この状況をユーザーに明確にするURLを含めてください。プロジェクトが強化要求の数によって圧倒される傾向がある場合は、「満足されない」(unmet)を選択して説明してください。
  • プロジェクトは、後で検索するために、レポートとレスポンスのアーカイブを公開する必要があります。 {Met URL} [report_archive]

脆弱性報告プロセス

  • プロジェクトは、脆弱性を報告するプロセスをプロジェクト サイトに公開しなければなりません。 {Met URL} [vulnerability_report_process]
    詳細:
    たとえば、https:// PROJECTSITE / securityの明示的に指定されたメール アドレスで、これはしばしばsecurity@example.orgの形式です。これはバグ報告プロセスと同じかもしれません。脆弱性レポートは常に公開される可能性がありますが、多くのプロジェクトでは、プライベート脆弱性を報告するメカニズムがあります。
  • プライベート脆弱性報告がサポートされている場合、プロジェクトは、プライベートに保持された方法で情報を送信する方法を含んでいなくてはなりません。 {N/A allowed} {Met URL} [vulnerability_report_private]
    詳細:
    例としては、HTTPS(TLS)を使用してWeb上に提出されたプライベート不具合報告や、OpenPGPを使用して暗号化された電子メールがあります。脆弱性報告が常に公開されている場合(プライベート脆弱性報告は存在しないため)、「該当なし」(N / A)を選択します。
  • 過去6ヶ月間に受け取った脆弱性報告に対するプロジェクトの初期応答時間は、14日以下でなければなりません。 {N/A allowed} [vulnerability_report_response]
    詳細:
    過去6か月間に脆弱性が報告されていない場合は、「該当なし」(N/A)を選択します。

品質

作業ビルドシステム

  • プロジェクトによって作成されたソフトウェアを利用するためにビルドが必要な場合、プロジェクトは、ソース コードからソフトウェアを自動的にリビルドできる作業ビルド システムを提供しなければなりません。 {N/A allowed} [build]
    詳細:
    ビルドシステムは、ソフトウェアをリビルドするのに必要なアクション(およびその順序)を決定し、それらのステップを実行します。たとえば、ビルドシステムは、ソースコードをコンパイルするためにコンパイラを呼び出すことができます。実行可能ファイルがソースコードから生成される場合、ビルドシステムは、プロジェクトのソースコードを変更でき、その変更を含む更新された実行ファイルを生成できなければなりません。プロジェクトによって生成されたソフトウェアが外部ライブラリに依存する場合、ビルドシステムはそれらの外部ライブラリをビルドする必要はありません。ソースコードが変更されても、ソフトウェアを使用するためにビルドする必要がない場合、「該当なし」(N/A)を選択します。
  • ソフトウエアをビルドするために、一般的なツールを使用することをお勧めします。 {N/A allowed} [build_common_tools]
    詳細:
    たとえば、Maven、Ant、cmake、autotools、make、rake (Ruby)、 devtools (R)などです。
  • プロジェクトは、FLOSSツールだけを使用してビルドができるようにするべきです。 {N/A allowed} [build_floss_tools]

自動テスト スイート

  • プロジェクトは、FLOSSとして公開されている自動テストスイートを少なくとも1つ使用する必要があります(このテストスイートは、別個のFLOSSプロジェクトとして維持される場合があります)。 プロジェクトは、テストスイートの実行方法を明確に示すか文書化する必要があります(たとえば、継続的インテグレーション(CI)スクリプトを介して、またはBUILD.md、README.md、CONTRIBUTING.mdなどのファイルの文書を介して)。 [test]
    詳細:
    プロジェクトでは、複数の自動化されたテストスイートを使用することができます(たとえば、迅速に実行するもの、より完全であるが特別な装置が必要なもの)。Selenium (ウェブブラウザの自動化)、Junit (JVM, Java)、RUnit (R)、testthat (R) など、多くのテストフレームワークやテスト支援システムが利用可能です。
  • テスト スイートは、その言語の標準的な方法で呼び出すことができるべきです。 [test_invocation]
    詳細:
    たとえば、「make check」、「mvn test」、「rake test」(Ruby)などです。
  • テスト スイートは、コードブランチ、入力フィールド、および機能のほとんど(または理想的にはすべて)をカバーすることが推奨されています。 [test_most]
  • プロジェクトは、継続的インテグレーション(新しいコードまたは変更されたコードが頻繁に中央コードリポジトリに統合され、その結果に対して自動テストが実行される)を実装することを推奨されています。 [test_continuous_integration]

新機能テスト

  • プロジェクトは、プロジェクトで作成されたソフトウェアに主要な新機能が追加されたときに、その機能のテストを自動化されたテスト スイートに追加する必要があるという一般的な方針(正式でも、正式でなくても構いません)を持っていなければなりません。 [test_policy]
    詳細:
    開発者はテストを自動テスト スイートに追加して、新しい機能を追加する必要があるというポリシーが、口頭でも(文書化されていなくても)、存在する限り、「満たしている」を選択してください。
  • プロジェクトによって作成されたソフトウェアの最新の大きな変更で、テストを追加するための test_policy が守られているという証拠がプロジェクトに存在しなければなりません。 [tests_are_added]
    詳細:
    主要な機能は、通常、リリースノートに記載されます。完璧は必要ないですが、プロジェクトによって生成されたソフトウェアに新しい主要機能が追加されたときに、自動テスト スイートに実際にテストが追加されているという証拠となります。
  • テストを追加するこのポリシー(test_policyを参照)を変更提案に関する手順で文書化することを推奨します。 [tests_documented_added]
    詳細:
    しかし、実際にテストが追加されている限り、非公式の規則でも許容されます。

警告フラグ

  • プロジェクトは、選択した言語でこの基準を実装することができる少なくとも1つのFLOSSツールがあれば、1つまたは複数のコンパイラ警告フラグ、「安全」言語モードを使用可能にするか、分離 「リンター」ツールを使用してコード品質エラーまたは共通の単純なミスを検索しなければなりません。 {N/A allowed} [warnings]
    詳細:
    コンパイラ警告フラグの例には、gcc / clang "-Wall"があります。 「安全」言語モードの例には、JavaScript「use strict」とperl5の「use warnings」があります。分離「リンター」ツールは、ソースコードを調べてコード品質のエラーや一般的な単純なミスを探すツールです。これらは、通常、ソースコードまたはビルド命令内で有効になります。
  • プロジェクトは警告を出さなければならない。 {N/A allowed} [warnings_fixed]
    詳細:
    これらは、警告基準の実装によって識別される警告です。プロジェクトは、警告を修正するか、ソースコード内で警告を誤検出としてマークするべきです。理想的には警告がないことがいいですが、プロジェクトはある程度の警告(通常は100行あたり1警告未満、または全体で10警告未満)を受け入れることができます。
  • プロジェクトによって作成されたソフトウェアにある警告に、実際的な場合には、最大限に厳格になることを推奨されています。 {N/A allowed} [warnings_strict]
    詳細:
    一部の警告は、あるプロジェクトでは効果的に有効にすることはできません。必要なのは、プロジェクトが可能な限り警告フラグを有効にするように努力しており、エラーが早期に検出されるという証拠です。

セキュリティ

セキュリティに関する開発知識

  • プロジェクトには、安全なソフトウェアを設計する方法を知っている少なくとも1人の主要な開発者が必要です。 (正確な要件については、「詳細」を参照してください。) [know_secure_design]
    詳細:
    これには、Saltzer and Schroeder の8つの原則を含む以下の設計原則を理解する必要があります。
    • メカニズムの経済性(たとえば、スイーピング シンプリフィケーションを採用して、メカニズムを実際的に単純化し小さくする)
    • フェイルセーフのデフォルト(アクセスの決定はデフォルトで拒否されるべきであり、プロジェクトのインストールはデフォルトで安全でなければならない)
    • 完全なメディエーション(制限されたすべてのアクセスは権限がチェックされ、バイパスされない)
    • オープンな設計(セキュリティメカニズムは攻撃者の設計に対する無知に依存するべきではなく、 簡単に保護ができて変更ができる鍵やパスワードのような情報に依存すべきです。
    • 特権の分離(理想的には、重要なオブジェクトへのアクセスは複数の条件に依存すべきで、1つの保護システムを破ることで完全なアクセスが可能にならないようにします。たとえば、パスワードとハードウェア トークンを必要とする多因子認証は単因子認証より強いです。
    • 最低限の権限(プロセスは最低限の権限で動作する必要がある)
    • 最低限の共通メカニズム(設計は、複数のユーザに共通のメカニズムや全てのユーザーに依存するメカニズムを最小限に抑えるべきです。)
    • 心理学的受容性(ヒューマンインタフェースは、使いやすく設計されていなければならない - 「驚きが最小限になる」という設計が助けになる)
    • 限られた攻撃面(攻撃面 - 攻撃者がデータを入力または抽出しようとする部分 - を制限する必要があります)
    • ホワイト リストで入力を検証します(入力は通常、この検証はブラックリスト(既知の不良値をリストする)ではなく、ホワイトリスト(既知の値のみを受け入れる)を使用する必要があります。
    プロジェクトの「主要な開発者」とは、プロジェクトのコードベースに精通していて、容易に変更を加えることができ、プロジェクトの他のほとんどの参加者によって認められている人です。主要な開発者は、通常、過去1年間に(コード、文書、または質問に回答して)多数の貢献を行います。ある開発者が、プロジェクトを開始している(3年以上プロジェクトから離れていない)、プライベート脆弱性報告チャネル(存在する場合)に関する情報を受け取る、プロジェクトを代表してコミットを受け入れる、最終リリースする、などを行う時主要な開発者とみなすことができます。開発者が1人だけの場合、その人物が主要開発者です。より安全なソフトウェアを開発し、設計について議論する方法を理解するのに役立つ多くの本やコースが利用可能です。 たとえば、 Secure Software Development Fundamentals コースは、3つのコースの無料セットです。 より安全なソフトウェアを開発する方法を説明しています。
  • プロジェクトの主要開発者の少なくとも1人は、この種のソフトウェアの脆弱性につながる一般的な種類のエラーを知っていなければならず、それぞれを対策または緩和する少なくとも1つの方法を知っていなければなりません。 [know_common_errors]
    詳細:
    例(ソフトウェアの種類によって異なります)には、SQLインジェクション、OSインジェクション、従来のバッファオーバーフロー、クロスサイトスクリプティング、認証の欠落、承認の欠落などがあります。一般的に使用されるリストについては、 CWE/SANSトップ25またはOWASPトップ10を参照してください。より安全なソフトウェアを開発する方法を理解し、脆弱性につながる一般的な実装エラーについて説明するのに役立つ多くの書籍やコースが用意されています。たとえば、 Secure Software Development Fundamentalsコースは、より安全なソフトウェアを開発する方法を説明する3つのコースの無料セットです(受講は無料です。追加料金を払うと、学習したことを証明する証明書を入手できます)。

優良な暗号手法を使用する

  • プロジェクトによって作成されたソフトウェアは、デフォルトで、一般に公開され、専門家によってレビューされている暗号プロトコルとアルゴリズムを使用しなければなりません。(暗号プロトコルとアルゴリズムが使用される場合) {N/A allowed} [crypto_published]
    詳細:
    ソフトウェアによっては暗号機能を直接使用する必要がないため、これらの暗号基準は常に適用されるわけではありません。
  • プロジェクトによって作成されたソフトウェアがアプリケーションまたはライブラリであり、主な目的が暗号の実装でない場合、暗号機能を実装するために特別に設計されたソフトウェアを呼び出すだけにするべきです。自分用に(暗号機能を)再実装するべきではありません。 {N/A allowed} [crypto_call]
  • 暗号に依存するプロジェクトによって作成されるソフトウェアのすべての機能は、FLOSSを使用して実装可能でなければなりません。 {N/A allowed} [crypto_floss]
    詳細:
    オープン ソース イニシアチブによるオープン スタンダード要件を参照して下さい。
  • プロジェクトによって作成されたソフトウェア内にあるセキュリティ メカニズムは、少なくとも、2030年までのNIST最小要件(2012年)を満たすデフォルト鍵長を使用しなければなりません。より小さな鍵長を完全に無効になるおうに、ソフトウェアを構成できなければなりません。 {N/A allowed} [crypto_keylength]
    詳細:
    これらの最小ビット長は、対称鍵112、ファクタリング係数2048、離散対数鍵224、離散対数群2048、楕円曲線224、ハッシュ224(パスワードハッシュはこのビット長でカバーされません。パスワードハッシュに関する詳しい情報は crypto_password_storage 基準にあります)です。さまざまな機関が出している推奨鍵長の比較については、https://www.keylength.comを参照してください。ソフトウェアは、 いくつかの構成ではより短い鍵長を許可するかもしれません(これはダウングレード攻撃を許すので、理想的には正しくありません。しかし、短い鍵長は、相互運用性のために時に必要となります)。
  • プロジェクトによって生成されたソフトウェア内のデフォルトのセキュリティメカニズムは、壊れた暗号化アルゴリズム(MD4、MD5、シングルDES、RC4、Dual_EC_DRBGなど)に依存したり、実装する必要がない限り、コンテキストに不適切な暗号化モードを使用したりしてはなりません。相互運用可能なプロトコル(実装されたプロトコルがネットワークエコシステムによって広くサポートされている標準の最新バージョンであり、そのエコシステムではそのようなアルゴリズムまたはモードの使用が必要であり、そのエコシステムはこれ以上安全な代替手段を提供しません)。これらの壊れたアルゴリズムまたはモードが相互運用可能なプロトコルに必要な場合、ドキュメントには、関連するセキュリティリスクと既知の緩和策を記載する必要があります。 {N/A allowed} [crypto_working]
    詳細:
    ECBモードは、 ECBペンギンによって示されるように暗号文内の同一のブロックを明らかにするため、ほとんど適切ではありません。また、CTRモードは、認証を実行せず、入力状態が繰り返されると重複を引き起こすため、不適切なことがよくあります。多くの場合、Galois / Counter Mode(GCM)やEAXなど、機密性と認証を組み合わせるように設計されたブロック暗号アルゴリズム モードを選択するのが最善です。プロジェクトは、互換性のために必要な場合、ユーザーが壊れたメカニズムを有効にすることを許可する場合があります(構成中など)が、ユーザーはそれを実行していることを認識します。
  • プロジェクトによって作成されたソフトウェア内のデフォルトのセキュリティ メカニズムは、既知の重大な脆弱性を持つ暗号アルゴリズムやモード(たとえば、SHA-1暗号ハッシュ アルゴリズムまたはSSHのCBC モード)に依存するべきではありません。 {N/A allowed} [crypto_weaknesses]
    詳細:
    SSHのCBCモードに関する懸念事項は、 CERT: SSH CBC 脆弱性にて議論されています。.
  • プロジェクトによって作成されたソフトウェア内のセキュリティ メカニズムは、鍵合意プロトコルのための完全な順方向秘密を実装するべきなので、もし長期鍵が将来侵害された場合でも、長期鍵のセットから導出されるセッション鍵は侵害されません。 {N/A allowed} [crypto_pfs]
  • プロジェクトによって作成されたソフトウェアが外部ユーザーの認証用のパスワードの保存を引き起こす場合、パスワードは、キーストレッチ(反復)アルゴリズム(Argon2id、Bcrypt、Scrypt、PBKDF2など)を使用して、ユーザーごとのソルトで反復ハッシュとして保存される必要があります。OWASP Password Storage Cheat Sheetも参照してください)。 {N/A allowed} [crypto_password_storage]
    詳細:
    この基準は、ソフトウェアがサーバー側Webアプリケーションなどの外部ユーザーのパスワードを使用してユーザーの認証(別名インバウンド認証)を実施している場合にのみ適用されます。ソフトウェアが他のシステムへの認証用のパスワードを保存している場合(別名、アウトバウンド認証、たとえば、ソフトウェアが他のシステムのクライアントを実装している場合)、そのソフトウェアの少なくとも一部がハッシュされていないパスワードにアクセスできる必要があるため、適用されません。
  • プロジェクトによって作成されたソフトウェア内のセキュリティ メカニズムは、暗号学的にセキュアな乱数発生器を使用して、すべての暗号鍵とナンスを生成しなければなりません。暗号学的にセキュアでない発生器を使用してはいけません。 {N/A allowed} [crypto_random]
    詳細:
    暗号学的にセキュアな乱数発生器は、ハードウェアの乱数発生器でも、Hash_DRBG、HMAC_DRBG、 CTR_DRBG、Yarrow、Fortunaなどのアルゴリズムを使用する暗号学的にセキュアな疑似乱数発生器(CSPRNG)でもよいです。セキュアでない乱数発生器には、Javaのjava.util.RandomとJavaScriptのMath.randomがあります。

MITM(man-in-the-middle:中間者)攻撃に対応できる安全な配信

  • プロジェクトは、MITM攻撃に対抗する配信メカニズムを使用しなければならない。httpsまたはssh+scpを使用することは許容されます。 [delivery_mitm]
    詳細:
    さらに強力な仕組みは、デジタル署名されたパッケージでソフトウェアをリリースすることです。配布システムへの攻撃を緩和するからです。しかし、これは、署名の公開鍵が正当なものであることをユーザーが確信でき、かつユーザーが実際に署名をチェックする場合にのみ有効です。
  • 暗号ハッシュ(たとえばSHA1SUM)は、http経由で運んではならず、暗号署名をチェックすることなしに使用してはいけません。 [delivery_unsigned]
    詳細:
    これらのハッシュは、送信中に変更することができます。

広く知られた脆弱性を修正

  • 60日を超えて公的に知られている中程度または重大度のパッチが適用されていない脆弱性は存在してはなりません。 [vulnerabilities_fixed_60_days]
    詳細:
    脆弱性は、プロジェクト自体によってパッチされ、リリースされなければなりません(パッチは他の場所で開発される可能性があります)。脆弱性が無料情報と共にCVE(共通脆弱性識別子)を持つとき(例えば、 National Vulnerability Database )、またはプロジェクトに情報が伝えられ、その情報が(おそらくプロジェクトによって)一般に公開されたとき、脆弱性は一般に知られるようになります。Common Vulnerability Scoring System (CVSS)の定性的スコアが中程度以上であれば、脆弱性は中程度以上の深刻度とみなされます。CVSS のバージョン 2.0 から 3.1 では、これは CVSS のスコア 4.0 以上に相当します。プロジェクトは、広く利用されている脆弱性データベース(国家脆弱性データベースなど)で公開されているCVSSスコアを、そのデータベースで報告されている最新バージョンのCVSSを用いて使用することができます。代わりに、プロジェクトは、脆弱性が公表された時点で計算入力内容が公開されている場合には、脆弱性が公表された時点でのCVSSの最新版を用いて深刻度を計算することができます。注意:これは、ユーザーが最大60日間、世界中のすべての攻撃者に対して脆弱なままになる可能性があることを意味します。この基準は、責任ある開示の再起動でGoogleが推奨しているものよりも、はるかに簡単に満たすことができることが多いです。なぜなら、Googleはレポートが公開されていなくても、プロジェクトが通知された時点で60日間の期間が開始されることを推奨しているためです。また、このバッジの基準は、他の基準と同様に、個々のプロジェクトに適用されることにも注意してください。プロジェクトの中には、より大きな包括組織や大規模プロジェクトの一部であり、複数のレイヤーに分かれている場合もあります。また、多くのプロジェクトでは、複雑なサプライチェーンの一部として、他の組織やプロジェクトに成果を提供しています。個々のプロジェクトは、多くの場合、残りの部分をコントロールできませんが、個々のプロジェクトは、脆弱性パッチをタイムリーにリリースするための作業を行うことができます。そのため、私たちは個々のプロジェクトの対応時間に焦点を当てています。 一旦、個々のプロジェクトからパッチが利用可能になると、他のプロジェクトはそのパッチにどのように対処するかを決定することができます(たとえば、新しいバージョンにアップデートすることもできますし、選別されたソリューションのパッチだけを適用することもできます)。
  • プロジェクトは、すべての重要な脆弱性を、報告された後迅速に修正するべきです。 [vulnerabilities_critical_fixed]

その他のセキュリティ上の課題

  • 公開リポジトリは、パブリックアクセスを制限するための有効なプライベートクレデンシャル(たとえば、有効なパスワードやプライベートキー)を漏らしてはなりません。 [no_leaked_credentials]
    詳細:
    プロジェクトは、パブリック アクセスを制限する意図がない限り、テスト用や重要でないデータベース用の「サンプル」資格情報を漏らす可能性があります。

分析

静的コード解析

  • 選択した言語でこの基準を実装するFLOSSツールが少なくとも1つある場合、少なくとも1つの静的コード分析ツール(コンパイラの警告と「安全な」言語モード以外)を、ソフトウェアの主要な製品リリースの提案に、リリース前に適用する必要があります。 {N/A justification} {Met justification} [static_analysis]
    詳細:
    静的コード解析ツールは、ソフトウェアコードを実行せずに特定の入力を用いて(ソースコード、中間コード、または実行可能ファイルとして)調べます。この基準のために、コンパイラの警告と「安全な」言語モードは、静的コード解析ツールとしてカウントされません(これらは通常、速度が重要なため深い解析を行いません)。このような静的コード解析ツールの例には、cppcheck (C, C++)、clang静的解析 (C, C++)、SpotBugs (Java)、FindBugs (Java) (FindSecurityBugsを含む)、PMD (Java)、Brakeman (Ruby on Rails)、lintr (R)、goodpractice (R), Coverity Quality AnalyzerSonarQubeCodacyおよび HP Enterprise Fortify Static Code Analyzer.大きなツールのリストは、静的コード解析のためのWikipediaツール一覧, 静的コード解析に関するOWASP情報 NISTソースコードセキュリティアナライザのリスト、およびウィーラーの静的解析ツール一覧などがあります。 SWAMPは、さまざまなツールを使用してソフトウェアの脆弱性を評価する無償のプラットフォームです。使用する実装言語で使用できるFLOSS静的解析ツールがない場合は、「該当なし」(N/A)を選択します。
  • static_analysis基準に使用される静的解析ツールの少なくとも1つが、分析された言語または環境における共通の脆弱性を探すためのルールまたはアプローチを含むことが、推奨されています。 {N/A allowed} [static_analysis_common_vulnerabilities]
    詳細:
    一般的な脆弱性を探すために特別に設計された静的解析ツールは、それらを見つける可能性が高いです。つまり、静的ツールを使用すると、通常は問題を見つけるのに役立ちますので、利用を提案しますが、「合格」レベルのバッジには要求しません。
  • 静的コード解析で発見された中程度および重大度の悪用可能な脆弱性はすべて、それらが確認された後、適時に修正されなくてはなりません。 {N/A allowed} [static_analysis_fixed]
    詳細:
    Common Vulnerability Scoring System (CVSS)の基本的な定性的なスコアが中程度以上であれば、脆弱性は中程度以上の深刻度とみなされます。CVSS のバージョン 2.0 から 3.1 では、これは CVSS のスコア 4.0 以上に相当します。プロジェクトは、広く利用されている脆弱性データベース(国家脆弱性データベースなど)で公開されているCVSSスコアを、そのデータベースで報告されている最新バージョンのCVSSを用いて使用することができます。また、脆弱性が公開された時点で計算入力が公開されている場合には、脆弱性が公開された時点でのCVSSの最新バージョンを用いて深刻度を計算することもできます。基準 vulnerabilities_fixed_60_days では、公開後 60 日以内にすべての脆弱性を修正することが要求されていることに注意してください。
  • 静的ソースコード解析は、コミットごと、または少なくとも毎日実行することをお勧めします。 {N/A allowed} [static_analysis_often]

動的コード分析

  • リリース前に、ソフトウェアの主要な製品リリースに少なくとも1つの動的解析ツールを適用することが示唆されています。 [dynamic_analysis]
    詳細:
    動的解析ツールは、ソフトウェアを特定の入力で実行して検査します。たとえば、プロジェクトは、ファジングツール(アメリカンファジーロップなど)やウェブ アプリケーション スキャナ(例: OWASP ZAP または w3af )です。場合によっては、 OSS-Fuzz プロジェクトがプロジェクトにファズテストを適用する可能性があります。この基準のために、動的分析ツールは、様々な種類の問題を探すために何らかの方法で入力を変更するかまたは少なくとも80%のブランチ カバレッジを持つ自動テスト スイートである必要があります。 動的解析に関するWikipediaのページ ファジングに関するOWASPページで、いくつかの動的解析ツールを特定しています。解析ツールは、セキュリティの脆弱性を探すことに重点を置くことができますが、これは必須ではありません。
  • プロジェクトで作成されたソフトウェアにメモリ安全でない言語(CやC ++など)を使用して作成されたソフトウェアが含まれている場合、少なくとも1つの動的ツール(たとえば、ファジーまたはウェブ アプリケーション スキャナ)を、バッファの上書きなどのメモリの安全性の問題を検出するメカニズムと一緒にいつも使用します。プロジェクトがメモリ安全でない言語で書かれたソフトウェアを作成しない場合は、「該当なし」(N/A)を選択します。 {N/A allowed} [dynamic_analysis_unsafe]
    詳細:
    メモリの安全性の問題を検出するメカニズムの例としては、アドレスサニタイザー(ASAN)(GCCおよびLLVMで利用可能)、 Memory Sanitizer 、および valgrind が含まれます。他に使用される可能性のあるツールには、スレッドサニタイザ定義されていない動作サニタイザを参照してください。広範なアサーションも機能します。
  • プロジェクトでは、多くのアサーションを可能にする少なくとも一部の動的分析(テストやファジングなど)の構成を使用することをお勧めします。多くの場合、これらのアサーションは本番ビルドでは有効にしないでください。 [dynamic_analysis_enable_assertions]
    詳細:
    この基準は、本番環境でアサーションを有効にすることを示唆するものではありません。それは完全にプロジェクトとそのユーザーが決定することです。この基準の焦点は、展開の動的分析中の障害検出を改善することです。プロダクション環境でのアサーションの有効化は、動的分析(テストなど)中にアサーションを有効にすることとはまったく異なります。場合によっては、プロダクション環境でアサーションを有効にすることは非常に賢明ではありません(特に高整合性コンポーネントの場合)。プロダクション環境でアサーションを有効にすることには多くの議論があります。たとえば、ライブラリは呼び出し元をクラッシュさせてはなりません。ライブラリが存在するとアプリストアによる拒否が発生する可能性があります。また、プロダクション環境でアサーションをアクティブにすると、秘密鍵などの秘密データが公開される可能性があります。多くのLinuxディストリビューションではNDEBUGが定義されていないため、これらのディストリビューションのプロダクション環境ではデフォルトで C/C++ assert() が有効になります。これらの環境でのプロダクション環境では、別のアサーションメカニズムを使用するか、 NDEBUGを定義することが重要です。
  • 動的コード分析で発見されたすべての中程度および重大度の悪用可能な脆弱性は、確認された後、適時に修正されなければなりません。 {N/A allowed} [dynamic_analysis_fixed]
    詳細:
    動的コード分析を実行しておらず、この方法で脆弱性が見つからない場合は、「該当なし」(N/A)を選択してください。 Common Vulnerability Scoring System (CVSS)の基本的な定性的スコアが中以上の場合、脆弱性は中程度以上の重大度と見なされます。 CVSSバージョン2.0から3.1では、これは4.0以上のCVSSスコアに相当します。プロジェクトは、広く使用されている脆弱性データベース( National Vulnerability Databaseなど)で公開されているCVSSスコアを、そのデータベースで報告されている最新バージョンのCVSSを使用して使用できます。代わりに、脆弱性が公表された後に計算入力が公開された場合、プロジェクトは脆弱性の開示時に最新バージョンのCVSSを使用して重大度を自ら計算することができます。

シルバー

基本的情報

前提要件

  • プロジェクトは合格レベルバッジに達成しなければなりません。 [achieve_passing]

基本的なプロジェクト ウェブサイトのコンテンツ

  • 貢献する方法に関する情報には、受け入れ可能な貢献の要件(例えば、必要なコーディング標準への言及)が含まれなければなりません。 {Met URL} [contribution_requirements]

プロジェクトの管理・運営

  • プロジェクトは、プロジェクト ソフトウェアのそれなりの量を開発しているすべての開発者が、これらの貢献を行うことが法的に認められていると主張すりょうな法的な仕組みを持っていなければなりません。これを行うための最も一般的で簡単に実装されたアプローチは、開発者証明書(DCO)を使用することです。ユーザーは、 DCOのウェブサイトへのプロジェクトのリンクが表示されます。ただし、これはコントリビュータ ライセンス契約(CLA)またはその他の法的な仕組みとして実装することができます。 {Met URL} [dco]
    詳細:
    DCOは、実装が容易で、ソースコードで追跡され、gitが "commit -s"を使用して "サインオフ"機能を直接サポートするため、推奨されるメカニズムです。最も効果的であるためには、プロジェクト文書が、そのプロジェクトに対して「サインオフ」とは何を意味するのかを説明するのが最善です。 CLAは、知的著作物が組織またはプロジェクトにライセンスされている条件を定義する法的合意です。コントリビュータ アサイン アグリーメント(CAA)は、知的著作物の権利を他の当事者に移転する法的合意です。プロジェクトはCAAを必ずしも持つ必要はありません。なぜなら、CAAは、特に受領者が営利目的の組織である場合には、潜在的な貢献者が貢献しないリスクを高めます。 Apache Software Foundation CLA(個々のコントリビュータ ライセンスと法人CLA)は、この種のCLAのリスクを判断するプロジェクトにとって、リスクが便益よりも小さいのCLAの例です。
  • プロジェクトは、プロジェクト ガバナンス モデル(主要な役割を含む意思決定方法)を明確に定義し、文書化しなければなりません。 {Met URL} [governance]
    詳細:
    決定を下し、論争を解決するための十分に確立された文書化された方法が必要です。小規模なプロジェクトでは、これは「プロジェクトオーナーとリーダーがすべての最終決定を下す」という単純なものです。慈愛の強い独裁者や正式な能力主義を含む様々な統治モデルが存在します。詳細については、統治モデルを参照してください。集中化された(例えば、単一メインテナー)および分散された(例えば、グループ メインテナー)アプローチの両方が、プロジェクトにおいて成功のうちに使用されています。統治情報は、プロジェクトフォークを作成する可能性について文書化する必要はありません。なぜなら、これはFLOSSプロジェクトでは常に可能であるからです。
  • プロジェクトは、行動規範を採択し、標準的な場所に掲示しなければなりません。 {Met URL} [code_of_conduct]
    詳細:
    プロジェクトは、地域社会の礼儀正しさを向上させることと、行動規範を採択することで受け入れられる行動についての期待を設定すること、ができるかもしれません。これにより、問題が発生する前に問題を回避し、プロジェクトをより貢献を促す場所にすることができます。これは、プロジェクトのコミュニティ内や職場内の行動にのみ焦点を当てるべきです。行動規範の例としては、以下のようなものがあります。Linuxカーネル行動規範コントリビューター規約行動規範Debian行動規範Ubuntu行動規範Fedora行動規範GNOME行動規範KDEコミュニティ行動規範Pythonコミュニティ行動規範Rubyコミュニティ行動指針、およびRust 行動規範
  • プロジェクトは、プロジェクトでの重要な役割と役割が実行しなければならないタスクを含む責任を明確に定義し、公的に文書化しなければなりません。誰がどの役割を持っているかは明確でなければなりませんが、これは同じ方法で文書化されていない可能性があります。 {Met URL} [roles_responsibilities]
    詳細:
    統治と役割と責任に関する文章は1か所にあるのが良いでしょう。
  • いずれかの人が仕事を継続できなくなるまたは死亡した場合、プロジェクトは最小限の中断で継続することができなければなりません。特に、プロジェクトは、課題の作成と終了、提案された変更の受け入れ、およびバージョンのソフトウェアのリリース、1週間内に個人が仕事を継続できくなったことまたは死亡したことの確認、行うことができなければならない。これは、他の誰かがプロジェクトを継続するのに必要な鍵、パスワード、法的権利を持っていることを保証することによって行うことができます。 FLOSSプロジェクトを実行する個人は、ロックボックスにキーを提供し、必要な法的権利を提供する意志(例えば、DNS名のために)を提供することによって、これを行うことができます。 {Met URL} [access_continuity]
  • プロジェクトは2以上の "バス ファクタ"を持っているべきです。 {Met URL} [bus_factor]
    詳細:
    「バス ファクタ」(別名「トラック ファクタ」)は、知見があり有能な人材が離脱して、プロジェクトが停止に至る時に、プロジェクトから突然消失する(「バスに当たった」)プロジェクトメンバーの最小人数です。 トラック ファクタツールは、GitHub上のプロジェクトに対してこれを見積もることができます。詳細については、Cosentino et al。の Gitリポジトリのバス ファクタの評価を参照してください。

ドキュメンテーション

  • プロジェクトは、少なくとも翌年に、プロジェクトが何をしたいか、やるつもりはないかを記述した文書化されたロードマップを持っていなければなりません。 {Met URL} [documentation_roadmap]
    詳細:
    このプロジェクトはロードマップを達成できないかもしれません。それは問題ありません。ロードマップの目的は、潜在的なユーザーや貢献者がプロジェクトの意図された方向を理解するのを助けることです。詳細にする必要はありません。
  • プロジェクトは、プロジェクトによって作成されたソフトウェアのアーキテクチャー(いわゆる高水準設計)の文書を含まなければなりません。プロジェクトでソフトウェアが作成されない場合は、「該当なし」(N/A)を選択します。 {N/A justification} {Met URL} [documentation_architecture]
    詳細:
    ソフトウェア アーキテクチャは、プログラムの基本的な構造、すなわちプログラムの主な構成要素、それらの間の関係、およびこれらの構成要素および関係の主要な特性を説明します。
  • プロジェクトは、ユーザーが、プロジェクトによって作成されたソフトウェアからセキュリティの観点から期待できるものと期待できないものを文書化しなければなりません。(セキュリティ要件) {Met URL} [documentation_security]
    詳細:
    これらは、ソフトウェアが満たすことが意図されているセキュリティ要件です。
  • プロジェクトでは、新規ユーザーがソフトウェアで何かをすばやく実行できるようにするための「クイックスタート」ガイドを提供する必要があります。 {N/A justification} {Met URL} [documentation_quick_start]
    詳細:
    このアイデアは、ユーザーにソフトウェアを始動させる方法と何かをさせる方法を示すことです。これは潜在的なユーザーが開始するために非常に重要です。
  • プロジェクトは、現行バージョンのプロジェクト結果(プロジェクトによって作成されたソフトウェアを含む)とドキュメントの整合性を保つために努力しなければならない。 不一致を招く既知のドキュメントの欠陥は、修正しなければなりません。ドキュメントが一般的に最新のものですが、古い情報が誤って含まれて、もはや正しくない場合は、それを欠陥として扱い、通常どおりに追跡して修正してください。 {N/A justification} {Met justification} [documentation_current]
    詳細:
    ドキュメントには、ソフトウェアのバージョン間の相違点や変更点、および/またはドキュメントの古いバージョンへのリンクに関する情報が含まれていてもよいです。この基準の意図は、ドキュメントが完璧である必要があることではなく、ドキュメントの一貫性を保つための努力がなされていることです。
  • プロジェクトのリポジトリのフロントページおよび/またはウェブサイトは、このベストプラクティスのバッジを含め、成果が達成されたことを一般に認められてから48時間以内に特定し、ハイパーリンクする必要があります。 {Met URL} [documentation_achievements]
    詳細:
    達成とは、いくつかのバッジを含めて、プロジェクトが具体的に満たしている外部基準のセットです。この情報は、プロジェクトのウェブサイトのフロントページにある必要はありません。 GitHubを使用するプロジェクトは、READMEファイルに追加することで、リポジトリのフロントページに成果を置くことができます。

アクセシビリティと国際化

  • プロジェクト(プロジェクト サイトとプロジェクト結果の両方)は、アクセシビリティのベストプラクティスに従い、障害のある人が引き続きプロジェクトに参加し、プロジェクトの結果を合理的な範囲で使用することができるようにするべきです。 {N/A justification} {Met justification} [accessibility_best_practices]
    詳細:
    ウェブアプリケーションについては、ウェブ コンテンツ アクセシビリティ ガイドライン(WCAG 2.0)とそのサポート ドキュメント WCAG 2.0の理解; W3Cアクセシビリティ情報を参照してください。 GUIアプリケーションの場合は、環境固有のアクセシビリティ ガイドラインの使用を検討して下さい(GnomeKDEXFCE Android bility/ios/" > iOS Mac Windows )。いくつかのTUIアプリケーション(例えば、「ncurses」プログラム)は、「alpine」の 「force-arrow-cursor」設定のような、よりアクセスしやすくするためにいくつかのことを行うことができます。ほとんどのコマンドライン アプリケーションは、そのままの状態でかなりアクセス可能です。この基準は、例えば、プログラム ライブラリの場合、「該当なし」(N/A)であることが多いです。取り上げるべき行動や考慮すべき課題の例を以下に示します。
    • テキスト以外のコンテンツの代替テキストを提供するkotode, 人々が必要とする他の形式に変更することができます。大きな印刷物、点字、スピーチ、記号またはより単純な言語などです。( WCAG 2.0ガイドライン1.1
    • アクションを示したり、応答を促したり、または視覚的要素を区別するために、色が唯一の視覚的な伝達手段として使用されるわけではありません。( WCAG 2.0ガイドライン1.4.1
    • 大文字、付随的なテキストとロゴタイプを除いて、テキストの視覚的提示とテキストのイメージには、少なくとも4.5:1の比率のコントラストがあります( WCAG 2.0ガイドライン1.4.3
    • キーボードからすべての機能を利用できるようにする(WCAGガイドライン2.1)
    • GUIまたはウェブ ベースのプロジェクトは少なくとも1つターゲットプラットフォーム上のスクリーンリーダーでテストするべきです(例えば、NVDA、Jaws、またはWindows上のWindowEyes; MacとiOSのVoiceOver Linux / BSDのOrca;AndroidのTalkBack)。 TUIプログラムは、スクリーンリーダーによる冗長な読み取りを防止するために、オーバードローを減らせるかもしれません。
  • プロジェクトによって作成されたソフトウェアは、ターゲット オーディエンスの文化、地域、または言語へのローカリゼーションを容易にするために国際化されるべきです。国際化(i18n)が適用されない場合(たとえば、ソフトウェアがエンドユーザー向けのテキストを生成せず、人間が読めるテキストを扱わない場合)、「該当なし」(N/A)を選択します。 {N/A justification} {Met justification} [internationalization]
    詳細:
    ローカリゼーションとは、「特定のターゲット市場(ロケール)の言語、文化、およびその他の要件を満たす、製品、アプリケーションまたはドキュメントのコンテンツの適合を指します」。国際化とは、「文化、地域、言語によって異なるターゲットオーディエンスに対してローカライズを容易にする製品、アプリケーション、またはドキュメントコンテンツの設計と開発」のことです。 ( W3Cの「ローカリゼーションと国際化」を参照してください。)ソフトウェアは国際化されるだけでこの基準を満たします。いったんソフトウェアが国際化されると、他の人がローカライゼーションに取り組むことができるので、別の特定の言語のローカリゼーションは必要ありません。

その他

  • プロジェクト サイト(ウェブサイト、リポジトリ、およびダウンロードURL)が外部ユーザーの認証用のパスワードを格納する場合、パスワードは、キーストレッチ(反復)アルゴリズム(PBKDF2、Bcrypt、Scrypt、PBKDF2など)を使用してユーザーごとのソルトで反復ハッシュとして保存する必要があります。プロジェクトサイトがこの目的のためにパスワードを保存しない場合は、「該当なし」(N/A)を選択します。 {N/A justification} {Met justification} [sites_password_security]
    詳細:
    GitHub の使用はこの基準を満たしていることに注意してください。この基準は、プロジェクト サイトへの外部ユーザーの認証に使用されるパスワードにのみ適用されます(別名インバウンド認証)。プロジェクト サイトが他のサイトにログインしなければならない場合(別名:アウトバウンド認証)、その目的のために別の方法で認証トークンを保存する必要があるかもしれません(ハッシュを保存しても意味がないため)。これは、crypto_password_storage の基準を sites_httpsと同様にプロジェクトサイトに適用します。

変更管理

以前のバージョン

  • プロジェクトは、最も頻繁に使用される古いバージョンの製品を維持するか、または新しいバージョンへのアップ グレードを提供しなければなりません。アップ グレード方法が困難な場合は、プロジェクトは、アップグレード方法(変更されたインターフェイスや、アップグレードに役立つ詳細な手順など)を記載しなければなりません。 {N/A justification} {Met justification} [maintenance_or_update]

報告

バグ報告プロセス

  • プロジェクトは、個々の課題を追跡するための課題トラッカーを使用する必要があります。 {N/A justification} {Met justification} [report_tracker]

脆弱性報告プロセス

  • プロジェクトは、匿名の報告者を除いて、過去12ヶ月間に解決されたすべての脆弱性の報告者に信用していることを伝えなければなりません。過去12ヶ月間に解決された脆弱性がない場合は、「該当なし」(N / A)を選択します。 {N/A justification} {Met URL} [vulnerability_report_credit]
  • プロジェクトには、脆弱性レポートに対応するための文書化されたプロセスがなければなりません。 {Met URL} [vulnerability_response_process]
    詳細:
    これはvulnerability_report_processに強く関連しており、脆弱性を報告するための文書化された方法が必要です。これは、特定の時間枠内の脆弱性レポートへの応答を必要とする、vulnerability_report_responseにも関連しています。

品質

コーディング標準

  • プロジェクトは、使用する主要な言語のための特定のコーディング スタイル ガイドを指定しなければなりませんし、貢献が一般にそれに準拠することを要求しなければなりません。 {N/A justification} {Met URL} [coding_standards]
    詳細:
    ほとんどの場合、これはいくつかの既存のスタイル ガイドを参照し、おそらく差異をリストすることによって行われます。これらのスタイル ガイドには、可読性を向上させる方法や、欠陥(脆弱性を含む)の可能性を減らす方法が含まれています。多くのプログラミング言語には、広く使用されているスタイル ガイドが1つ以上あります。スタイルガイドの例には、 Googleスタイル ガイド SEI CERTコーディング標準を参照してください。
  • 選択した言語において行うことができるFLOSSツールが少なくとも1つあれば、プロジェクトは自動的に選択したコーディングスタイルを適用しなければなりません。 {N/A justification} {Met justification} [coding_standards_enforced]
    詳細:
    これは、静的解析ツールを使用して、および/またはコード再フォーマットを介してコードを強制することによって実装することができます。多くの場合、ツールの設定は、プロジェクトのリポジトリに含まれます(プロジェクトによって異なる設定が選択される可能性があるため)。プロジェクトはスタイルの例外を許可するかもしれません(通常はそうなります)。例外が発生した場合は、それらの場所のコードでまれで、文書化されていなければなりませんので、それらの例外が再検討され、ツールが将来自動的にそれらを処理できるようにできます。このようなツールの例には、ESLint(JavaScript)、Rubocop(Ruby)、および devtools check (R)があります。

作業ビルドシステム

  • ネイティブ バイナリのビルドシステムは、それらに渡される関連するコンパイラおよびリンカ(環境)変数(CC、CFLAGS、CXX、CXXFLAGS、LDFLAGSなど)を受け入れ、コンパイラおよびリンカ呼び出しに渡す必要があります。ビルド システムは追加のフラグでそれらを拡張するかもしれません。提供された値を単にそれ自身のものに置き換えてはいけません。ネイティブバイナリが生成されていない場合は、「該当なし」(N/A)を選択します。 {N/A justification} {Met justification} [build_standard_variables]
    詳細:
    Address Sanitizer(ASAN)などの特別なビルド機能を有効にするか、ディストリビューション ハードニングのベスト プラクティス(コンパイラフラグを簡単にオンにするなど)を遵守するのが、簡単であるべきです。
  • ビルドとインストール システムは、関連するフラグ(例えば、 "install -s"が使用されていない)で要求されたデバッグ情報を保存しておくべきです。ビルドやインストール システムがない場合(例:一般的なJavaScriptライブラリ)は、「該当なし」(N/A)を選択します。 {N/A justification} {Met justification} [build_preserve_debug]
    詳細:
    すなわち、CFLAGS(C)またはCXXFLAGS(C ++)を設定すると、それらの言語が使用されている場合に、関連デバッグ情報が作成されるべきですし、インストール時には削除するべきではありません。デバッグ情報は、サポートと分析のために必要であり、コンパイルされたバイナリのハードニング機能の存在を測定するのにも役立ちます。
  • プロジェクトによって作成されたソフトウェアのビルド システムは、サブディレクトリに相互依存関係がある場合、再帰的にサブディレクトリをビルドしてはなりません。ビルドやインストール システムがない場合(例:一般的なJavaScriptライブラリ)は、「該当なし」(N/A)を選択します。 {N/A justification} {Met justification} [build_non_recursive]
    詳細:
    プロジェクトのビルド システムの内部依存情報は、正確でなければなりません。そうでないと、プロジェクトへの変更が正しくビルドされないことがあります。ビルドが正しくないと、欠陥(脆弱性を含む)が発生する可能性があります。大規模ビルドシステムでよく見られる間違いは、ソースファイルを含むサブディレクトリの階層で、各サブディレクトリが独立してビルドされるとき、「再帰的ビルド」か「再帰的Make」を使用することです。各サブディレクトリが完全に独立していない限り、依存関係の情報が正しくないため、これらを使用することは間違いです。
  • プロジェクトは、ソースファイルから情報を生成するプロセスを繰り返すことができなければならず、ビット単位でまったく同じ結果を得ることができなければなりません。ビルドが発生しない場合(例えば、ソースコードをコンパイルする代わりに直接使用するスクリプト言語)は、「該当なし」(N/A)を選択します。 {N/A justification} {Met justification} [build_repeatable]
    詳細:
    GCCとclangのユーザーには、-frandom-seedオプションが有用であるかもしれません。場合によっては、ソート順を強制することで解決できます。 再現可能なビルドサイトで、より多くの提案を見つけることができます。

インストールシステム

  • プロジェクトは、プロジェクトで作成されたソフトウェアを一般的に使用されているやり方で簡単にインストールおよびアンインストールする方法を提供する必要があります。 {N/A justification} {Met justification} [installation_common]
    詳細:
    たとえば、パッケージマネージャー(システムまたは言語レベル)、「make install / uninstall」(DESTDIRをサポート)、標準形式のコンテナー、または標準形式の仮想マシンイメージを使用することが挙げられます。インストールとアンインストールのプロセス(たとえば、パッケージング)は、FLOSSである限り、サードパーティによって実装されてもよいです。
  • エンドユーザ用のインストール システムは、インストール時にビルドされる生成物が書き込まれる場所を選択するための標準的な規則を守らなければなりません。たとえば、POSIXシステムにファイルをインストールする場合は、DESTDIR環境変数を守らなければなりません。インストール システムがない場合や標準的な規約がない場合は、「該当なし」(N / A)を選択します。 {N/A justification} {Met justification} [installation_standard_variables]
  • プロジェクトは、潜在的な開発者がすべてのプロジェクト結果を迅速にインストールし、テストやテスト環境を含む変更を行うために必要な環境を迅速にインストールする方法を提供しなければなりません。これは、一般に使用されている手法で実行する必要があります。 {N/A justification} {Met justification} [installation_development_quick]
    詳細:
    これは生成されたコンテナおよび/またはインストール スクリプトを使用して実装できます。外部依存部分は、典型的には、external_dependenciesごとにシステムおよび/または言語パッケージマネージャを呼び出すことによってインストールされます。

外部で維持管理されるコンポーネント

  • プロジェクトは、外部依存関係をコンピュータ処理可能な方法でリストしなければなりません。 {N/A justification} {Met URL} [external_dependencies]
    詳細:
    通常、これはパッケージ マネージャーやビルドシステムのやり方を使用して行われます。これは installation_development_quick の実装に役立ちます。
  • プロジェクトは、既知の脆弱性を検出し、悪用可能な脆弱性を修正したり、悪用できない脆弱性として確認するために、外部の依存先(コンビニエンス コピーを含む)を監視または定期的にチェックしなければなりません。 {N/A justification} {Met justification} [dependency_monitoring]
    詳細:
    これは、 OWASPのDependency-Check SinatypeのNexus Auditor SynopsysのBlack Duck Software Composition Analysis Bundler-audit (Rubyの場合)などのオリジンアナライザー/依存性検査ツールを使用して行うことができます。パッケージ マネージャーには、これを行うためのメカニズムが含まれています。コンポーネントの脆弱性を悪用することはできない場合、分析が難しいが、単に更新または修正する方が簡単なであれば、それは許容できます。
  • プロジェクトは
    1. 再使用された外部管理コンポーネントの識別と更新を容易にできるようにしている、 または
    2. システムまたはプログラミング言語によって提供される標準コンポーネントを使用している
    のどちらかでなければなりません。そうすれば、再利用されたコンポーネントに脆弱性が見つかった場合に、そのコンポーネントを簡単に更新することができます。 {N/A justification} {Met justification} [updateable_reused_components]
    詳細:
    この基準を満たす典型的な方法は、システムおよびプログラミング言語のパッケージ管理システムを使用することです。多くのFLOSSプログラムは、標準ライブラリーのローカルコピーである "コンビニエンス ライブラリー"と一緒に頒布されます(フォークされている可能性があります)。それ自体は、それでいいです。しかし、プログラムがこれらのローカルな(フォークされた)コピーを使用しなければならない場合、 セキュリティ アップデートとして"標準"ライブラリをアップデートすると、これらの追加のコピーは依然として脆弱のままです。これは、特にクラウド ベース システムの問題です。クラウド プロバイダが "標準"ライブラリを更新してもプログラムがそれらを使用しない場合、更新プログラムは実際には役に立ちません。たとえば、「Chromium:適切なパッケージとしてFedoraにまだない理由は何ですか?」Tom Callaway著を参照してください。
  • プロジェクトは、使用するテクノロジ セット(その "テクノロジ スタック")において、プロジェクトがサポートするユーザの超大多数がFLOSSの代替案を利用可能な(ユーザが代替手段にアクセスしている)場合には、評価の低いまたは時代遅れの機能とAPIの使用を避けるべきです。 {N/A justification} {Met justification} [interfaces_current]

自動テスト スイート

  • 少なくとも1つのブランチの共有リポジトリへの各チェックインに対して、自動テスト スイートが適用される必要があります。このテスト スイートは、テストの成功または失敗に関するレポートを生成しなければなりません。 {Met justification} [automated_integration_testing]
    詳細:
    この要件は、test_continuous_integrationのサブセットと見ることができますが、継続的な統合を範囲外として、テストだけに焦点を当てています。
  • プロジェクトは、過去6ヶ月以内に修正されたバグの少なくとも50%について、自動テスト スイートに回帰テストを追加しなければなりません。 {N/A justification} {Met justification} [regression_tests_added50]
  • プロジェクトは、選択された言語でこの基準を測定できる少なくとも1つのFLOSSツールがある場合、少なくとも80%のステートメントカバレッジを提供するFLOSS自動テストスイートを備えていなければなりません。 {N/A justification} {Met justification} [test_statement_coverage80]
    詳細:
    gcov/lcov、Blanket.js、Istanbul、JCov、covr (R) など、多くのFLOSSツールが、テストカバレッジを測定できます。この基準を満たすことは、テスト スイートが徹底していることを保証するものではないですが、それよりも、この基準を満たさないことは、貧弱なテスト スイートであることを示す強い指標であることに注意してください。

新機能テスト

  • プロジェクトには、主要な新機能が追加されると、新しい機能のテストが自動化されたテスト スイートに追加されなければならないという正式な文書化されたポリシーがなければなりません。 {N/A justification} {Met justification} [test_policy_mandated]
  • プロジェクトは、変更提案のための文書化された手順に、重要な新機能用にテストを追加するという方針を含まなければなりません。 {N/A justification} {Met justification} [tests_documented_added]

警告フラグ

  • プロジェクトによって作成されたソフトウェアにある警告に、実際的な場合には、最大限に厳格にならなければなりません。 {N/A justification} {Met justification} [warnings_strict]

セキュリティ

セキュリティに関する開発知識

  • 適用できる場合、プロジェクトはセキュア設計原則(「know_secure_design」から)を実装しなければなりません。プロジェクトでソフトウェアが作成されていない場合は、「該当なし」(N / A)を選択します。 {N/A justification} {Met justification} [implement_secure_design]
    詳細:
    たとえば、プロジェクトの結果は、フェール セーフのデフォルト値を持つべきです(デフォルトではアクセスの決定は拒否されるべきで、プロジェクトのインストールはデフォルトでセキュリティ保護されているべきです)。また、完全なメディエーションであるべきです(制限されているすべてのアクセスは、権限がチェックされバイパス不可能でなければなりません)。原則が矛盾する場合があります。その場合、選択が必要です(たとえば、多くの仕組みは、「機構の節約」に反して複雑にすることも、単純にすることもできます)。

優良な暗号手法を使用する

  • プロジェクトによって作成されたソフトウェア内のデフォルトのセキュリティ メカニズムは、既知の重大な脆弱性を持つ暗号アルゴリズムやモード(たとえば、SHA-1暗号ハッシュ アルゴリズムまたはSSHのCBC モード)に依存してはいけません。 {N/A allowed} {Met justification} [crypto_weaknesses]
  • プロジェクトは複数の暗号アルゴリズムをサポートするべきですので、ユーザーは破られた場合に素早く切り替えることができます。一般的な対称鍵アルゴリズムには、AES、Twofish、およびSerpentがあります。一般的な暗号化ハッシュ アルゴリズムには、SHA-2(SHA-224、SHA-256、SHA-384およびSHA-512を含む)およびSHA-3があります。 {N/A allowed} {Met justification} [crypto_algorithm_agility]
  • プロジェクトは、他の情報(構成ファイル、データベース、ログなど)とは別にしたファイルに、認証資格情報(パスワードやダイナミックトークンなど)やプライベート暗号鍵を格納することをサポートしなければなりませんし、ユーザーがコードの再コンパイルなしにそれらを更新や置き換えできるように許可しなければなりません。プロジェクトが認証資格情報とプライベート暗号化鍵を決して処理しない場合は、「該当なし」(N/A)を選択します。 {N/A allowed} {Met justification} [crypto_credential_agility]
  • プロジェクトで作成されたソフトウェアは、ネットワーク通信すべてに対して、SSHv2以降、TLS1.2以降 (HTTPS)、IPsec、SFTP、SNMPv3などのセキュア プロトコルをサポートするべきです。FTP、HTTP、telnet、SSLv3以前、およびSSHv1などのセキュアでないプロトコルは、デフォルトで無効にし、ユーザーが特別に設定した場合のみ有効にするべきです。プロジェクトによって作成されたソフトウェアがネットワーク通信をサポートしない場合は、「該当なし」(N/A)を選択します。 {N/A allowed} {Met justification} [crypto_used_network]
  • プロジェクトによって作成されたソフトウェアは、TLSをサポートあるいは使用する場合、少なくともTLSバージョン1.2をサポートするべきです。TLSの前身は、SSLと呼ばれていたことに注意して下さい。ソフトウェアがTLSを使用ない場合、「該当なし」(N/A)を選択します。 {N/A allowed} {Met justification} [crypto_tls12]
  • TLSをサポートしている場合、プロジェクトで作成されたソフトウェアは、TLSを使う時には、サブリソースを含めて、デフォルトでTLS認証を受けなければなりません。ソフトウェアがTLSを使用しない場合、「該当なし」(N/A)を選択します。 {N/A allowed} {Met justification} [crypto_certificate_verification]
    詳細:
    誤ったTLS認証の検証は、よくある間違いであることに注意して下さい。詳細については、「世界でもっとも危険なコード:非ブラウザー ソフトウェアでのSSL認証の検証」Martin Georgiev et al著「このアプリケーションを信頼しますか?」Michael Catanzaro著.を参照して下さい。
  • TLSをサポートしている場合、プロジェクトによって作成されたソフトウェアは、(たとえばセキュアクッキーなど)プライベートな情報をHTTPヘッダと共に送信する前に、証明書の検証をしなければなりません。ソフトウェアがTLSを使用しない場合は、「該当なし」(N/A)を選択します。 {N/A allowed} {Met justification} [crypto_verification_private]

公開物の安全性

  • プロジェクトは、広く普及することを意図しているプロジェクト結果のリリースには暗号で署名しなければなりませんし、パブリック署名鍵を入手して署名を検証する方法をユーザに説明するプロセスがなければなりません。これらの署名の秘密鍵は、ソフトウェアを一般に直接配布するために使用されるサイトにあってはなりません。リリースが広く普及することを意図していない場合は、「該当なし」(N/A)を選択します。 {N/A justification} {Met justification} [signed_releases]
    詳細:
    プロジェクトの結果には、ソースコードと生成された成果物(実行可能ファイル、パッケージ、コンテナなど)が含まれます。生成された成果物は、ソースコードとは別に署名することができます。これらは、(暗号デジタル署名を使用して)署名付きgitタグとして実装できます。プロジェクトはgitのようなツールとは別に生成された結果を提供するかもしれませんが、そのような場合、別々の結果を別々に署名しなければなりません。
  • バージョン管理システムでは、 signed_releases で説明されているように、重要なバージョンタグ(メジャーリリース、マイナーリリース、または公開されている脆弱性の一部であるタグ)を暗号署名して検証することが推奨されています。 {Met justification} [version_tags_signed]

その他のセキュリティ上の課題

  • プロジェクトの結果は、潜在的に信頼できないソースからのすべての入力をチェックして有効であること(*allowlist*)を確認し、データに何らかの制限がある場合は無効な入力を拒否しなければなりません。 {N/A justification} {Met justification} [input_validation]
    詳細:
    攻撃者はしばしばブラックリストを回避することができるので、入力を "不正な形式" のリスト(別名*denylist*)と比較するのは、通常十分ではないことに注意してください。特に、数値は内部形式に変換され、最小値と最大値の間であるかがチェックされますし、文字列は、有効なテキストパターン(有効なUTF-8、長さ、構文など)であることを確認するためにチェックされます。一部のデータは「何でもよい」(たとえばファイル アップローダー)ことがありますが、通常はまれです。
  • プロジェクトによって作成されたソフトウェアで強化メカニズムを使用するべきですので、ソフトウェア欠陥がセキュリティ上の脆弱性を引き起こす可能性が低くなります。 {N/A justification} {Met justification} [hardening]
    詳細:
    強化メカニズムは、Content Security Policy(CSP)などのHTTPヘッダー、攻撃を緩和するコンパイラ フラグ(-fstack-protectorなど)、または未定義の動作を排除するためのコンパイラ フラグを含みます。私たちの目的のために、最低限の特権は強化メカニズムとはみなされません(最低の特権は重要ですが、別の話です)。
  • プロジェクトは、そのセキュリティ要件が満たされていることを証明する保証ケースを提供しなければならない。保証ケースには、脅威モデルの説明、信頼境界の明確な識別、セキュアな設計原則が適用されていることの議論、共通の実装セキュリティの弱点が対処されたことの議論が含まれなければならない。 {Met URL} [assurance_case]
    詳細:
    保証ケースは、「システムのプロパティに関する特定の一連の重大なクレームが、特定の環境とアプリケーションに対して適切に正当化されていることを説得力のある正当な議論で示す証拠」である(「構造化された保証ケースモデルを使用したソフトウェア保証」、Thomas Rhodes他、NIST Interagency Report 7608 )。信頼境界は、データまたは実行がその信頼レベル、例えば、典型的なウェブアプリケーションにおけるサーバの境界、を変更する境界である。安全な設計原則(SaltzerやSchroeerなど)と一般的な実装セキュリティの弱点(OWASPトップ10やCWE / SANSトップ25など)をリストし、それぞれがどのように対抗しているかを示すのは一般的です。 BadgeAppの保証ケースは良い参考例になるかもしれません。これは、documentation_security、documentation_architecture、およびimplement_secure_designに関連しています。

分析

静的コード解析

  • プロジェクトは、選択された言語でこの基準を実装できる少なくとも1つのFLOSSツールがある場合、解析された言語または環境で共通の脆弱性を探すためのルールまたはアプローチを備えた少なくとも1つの静的解析ツールを使用しなければならなりません。 {N/A justification} {Met justification} [static_analysis_common_vulnerabilities]

動的コード分析

  • もしプロジェクトで作成されたソフトウェアにメモリ安全でない言語(CやC ++など)を使用して作成されたソフトウェアが含まれているならば、そのときには 少なくとも1つの動的ツール(たとえば、ファジーまたはウェブ アプリケーション スキャナ)を、バッファの上書きなどのメモリの安全性の問題を検出するメカニズムと一緒にいつも使用します。プロジェクトがメモリ安全でない言語で書かれたソフトウェアを作成しない場合は、「該当なし」(N/A)を選択します。 {N/A justification} {Met justification} [dynamic_analysis_unsafe]

ゴールド

基本的情報

前提要件

  • プロジェクトは、シルバー レベル バッジを達成しなければなりません。 [achieve_silver]

プロジェクトの管理・運営

  • プロジェクトは2以上の "バス ファクタ"を持つ必要があります。 {Met URL} [bus_factor]
  • プロジェクトには少なくとも2人の関係を持たない重要な貢献者がいなければなりません。 {Met URL} [contributors_unassociated]
    詳細:
    同じ組織によって作業に対しに支払われ(従業員または請負業者)、組織がプロジェクトの成果の恩恵を受ける場合、貢献者は関連します。財務補助金が他の組織を通過する場合、同じ組織のものであると見なされません(例えば、共通の政府やNGOのソースから異なる組織に支払われた科学補助金は、貢献者を関連させません)。過去1年間にプロジェクトに些細でない貢献をしていれば、その人は大きな貢献をしています。重要な貢献者の良い指標の例としては、少なくとも1,000行のコード、50個のコミット、または少なくとも20ページの文書化が挙げられます。

その他

  • プロジェクトは、少なくとも1つの関連する年と著作権者を特定する著作権記述書を各ソースファイルに含まなければなりません("[プロジェクト名] 貢献者" のように )。 {Met justification} [copyright_per_file]
    詳細:
    これは、各ファイルの先頭近くに以下のコメントを含めることによって行うことができます: "Copyright the [project name] contributors."。"Copyright Notices in Open Source Software Projects" by Steve Winslowを参照してください。
  • プロジェクトは、各ソースファイルにライセンスステートメントを含まなければなりません。これは、各ファイルの先頭近くに次のコメントを含めることによって行うことができます: SPDXライセンス識別子:[プロジェクトに対するSPDXライセンス表現] {Met justification} [license_per_file]
    詳細:
    これは、ライセンスを特定する自然言語での記述を含めることによっても行うことができます。プロジェクトには、ライセンス テキストまたは完全なライセンステキストを指し示す安定したURLを含めることもできます。 license_location基準は、プロジェクトライセンスが標準の場所にあることを要求します。 SPDXライセンスの詳細については、このSPDXチュートリアルを参照してください。 copyright_per_file との関係に注意してください。その内容は通常、ライセンス情報に先行します。

変更管理

公開されたバージョン管理ソースリポジトリ

  • プロジェクトのソースリポジトリは、共通の分散バージョン管理ソフトウェア(gitやmercurialなど)を使用しなければなりません。 {Met justification} [repo_distributed]
  • プロジェクトは、新規または偶に参加する貢献者によって実行できる小さなタスクを明確に識別しなければなりません。 {Met URL} [small_tasks]
    詳細:
    この特定は、通常、課題トラッカーの選択された課題に対して、プロジェクトがそのために使用する1つまたは複数のタグ、たとえば、 up-for-grabs(誰でも使用可能)first-timers-only(初心者専用)、Small fix(小修正)、microtask(小タスク)、またはIdealFirstBug(理想的な最初のバグ)のいずれかをマークすることによって行われます。 これらの新しいタスクには機能を追加する必要はありません。ドキュメントを改善したり、テストケースを追加したり、プロジェクトを支援したり、プロジェクトの詳細を貢献者が理解できるようにすることができます。
  • プロジェクトは、中央リポジトリを変更したり、機密データ(プライベート脆弱性レポートなど)にアクセスするために、開発者に対して二要素認証(2FA)を要求する必要があります。推奨されませんが、2FAメカニズムは、SMSのような暗号化メカニズムを持たないメカニズムを使用することができます。 {Met justification} [require_2FA]
  • プロジェクトの2要素認証(2FA)は、偽装を防ぐために暗号化メカニズムを使用すべきです。ショート メッセージ サービス(SMS)ベースの2FA自体は、暗号化されていないため、この基準を満たしていません。 {Met justification} [secure_2FA]
    詳細:
    この基準を満たす2FAメカニズムは、一定時間後に変更される認証コードを自動的に生成するタイムベースのワン タイム パスワード(TOTP)アプリケーションです。 GitHubはTOTPをサポートしています

品質

コーディング標準

  • プロジェクトは、コードレビューの実施方法、チェックする必要があるもの、受け入れられる必要があるものなど、コードレビュー要件を文書化しなければなりません。 {N/A justification} {Met URL} [code_review_standards]
    詳細:
    two_person_review とcontribution_requirementsも参照してください。
  • プロジェクトは、公開する前に、提案されたすべての変更の少なくとも50%を著作者以外の人がレビューして、それが価値のある変更であり、取り込みに反対する既知の問題がないかどうかを判断しなければなりません。 {Met justification} [two_person_review]

作業ビルドシステム

  • プロジェクトが再現可能なビルドを持たなければなりません。ビルドが発生しない場合(たとえば、コンパイルされないでソースコードが直接使用されるスクリプト言語)、「該当なし」(N/A)を選択します。 {N/A justification} {Met URL} [build_reproducible]
    詳細:
    再現可能なビルドは、複数の当事者がソース ファイルから情報を生成するプロセスを独立にやり直し、ビット単位でまったく同じ結果を得られることを意味します。ある場合には、これ(再現可能なビルド)は、あるソート順を強いることで解決されます。Javaスクリプトの開発者は、npm shrinkwrapとwebpack OccurenceOrderPluginの使用を検討するかもしれません。GCCとclangのユーザーは、-frandom-seedオプションが有用であることを見つけるかもしれません。ビルド環境(ツールセットを含む)は、リビルドに使用できる特定のコンテナや仮想マシンの暗号化ハッシュを指定することによって、外部パーティのために、しばしば定義可能です。再現可能なビルド プロジェクトは、これを行う方法を記載したドキュメントを有します

自動テスト スイート

  • テストスイートは、その言語の標準的な方法で呼び出すことができなければなりません。 {Met URL} [test_invocation]
  • プロジェクトは、新しいコードまたは変更されたコードが頻繁に中央コードリポジトリに統合され、その結果に対して自動化されたテストが実行される、継続的な統合を実装しなければなりません。 {Met URL} [test_continuous_integration]
    詳細:
    ほとんどの場合、これは、プロジェクトでフルタイムで働く各開発者が少なくとも1日に1回統合作業をすることを意味します。
  • プロジェクトは、選択された言語でこの基準を測定できる少なくとも1つのFLOSSツールがある場合、少なくとも80%のステートメント カバレッジを提供するFLOSS自動テストスイートを備えていなければなりません。 {N/A justification} {Met justification} [test_statement_coverage90]
  • 選択された言語でこの基準を測定できる少なくとも1つのFLOSSツールがあれば、少なくとも80%のブランチカバレッジを提供するFLOSS自動テストスイートがプロジェクトに存在しなければなりません。 {N/A justification} {Met justification} [test_branch_coverage80]

セキュリティ

優良な暗号手法を使用する

  • プロジェクトで作成されたソフトウェアは、ネットワーク通信すべてに対して、SSHv2以降、TLS1.2以降 (HTTPS)、IPsec、SFTP、SNMPv3などのセキュア プロトコルをサポートしなければなりません。FTP、HTTP、telnet、SSLv3以前、SSHv1などのセキュアでないプロトコルは、デフォルトで無効にしておき、ユーザーが特別に設定した亜場合のみ有効にしなければなりません。プロジェクトによって作成されたソフトウェアがネットワーク通信をサポートしない場合は、「該当なし」(N/A)を選択します。 {N/A allowed} {Met justification} [crypto_used_network]
  • プロジェクトによって作成されたソフトウェアは、TLSをサポートあるいは使用する場合、少なくともTLSバージョン1.2をサポートしなければなりません。TLSの前身は、SSLと呼ばれていたことに注意して下さい。ソフトウェアがTLSを使用ない場合、「該当なし」(N/A)を選択します。 {N/A allowed} {Met justification} [crypto_tls12]

MITM(man-in-the-middle:中間者)攻撃に対応できる安全な配信

  • プロジェクトウェブサイト、リポジトリ(ウェブからアクセス可能な場合)、およびダウンロードサイト(別々の場合)には、許容できない値を持つキー強化ヘッダーが含まれていなければなりません。 {Met URL} [hardened_site]
    詳細:
    GitHubやGitLabはこれを満たしていることが知られているので注意してください。https://securityheaders.com/ のようなサイトは、これをすぐに確認することができます。重要なセキュリティ強化ヘッダーは以下の通りです。Content Security Policy (CSP)、HTTP Strict Transport Security (HSTS)、X-Content-Type-Options (「nosniff」として)、および X-Frame-Options 。Web ページからログインする機能のない完全に静的な Web サイトでは、いくつかの強化ヘッダーを省略してもリスクは少なくて済みますが、そのようなサイトを検出する信頼できる方法がないため、完全に静的なサイトであってもこれらのヘッダーが必要です。

その他のセキュリティ上の課題

  • プロジェクトは過去5年間にセキュリティレビューを実施していなければなりません。このレビューは、セキュリティ要件とセキュリティ境界を考慮しなければならりません。 {Met justification} [security_review]
    詳細:
    これは、プロジェクトメンバーおよび/または独立した評価によって行うことができます。この評価は、静的および動的解析ツールによってサポートされることができますが、ツールが検出できない問題(特に設計上)を特定するためには、人間によるレビューが必要です。
  • プロジェクトによって作成されたソフトウェアで強化メカニズムを使用しなければならないので、ソフトウェア欠陥がセキュリティ上の脆弱性を引き起こす可能性が低くなります。 {N/A justification} {Met URL} [hardening]

分析

動的コード分析

  • プロジェクトは、リリース前にプロジェクトによって作成されたソフトウェアの主要な製品リリースに対して、少なくとも1つの動的解析ツールを適用しなければなりません。 {N/A justification} {Met justification} [dynamic_analysis]
  • プロジェクトは、生成するソフトウェアに多くの実行時アサーションを含めるべきであり、動的分析中にそれらのアサーションをチェックするべきです。 {N/A justification} {Met justification} [dynamic_analysis_enable_assertions]