Upgrade to Pro — share decks privately, control downloads, hide ads and more …

OpenSSF Scorecardの紹介

OpenSSF Scorecardの紹介

日立製作所 研究開発グループ 下沢 拓氏
2025年2月21日開催 ソフトウェアサプライチェーンセキュリティミートアップ : OSSセキュリティMeetup & CNCJ Collab Event 講演資料

Linux Foundation Japan

February 27, 2025
Tweet

More Decks by Linux Foundation Japan

Other Decks in Technology

Transcript

  1. 2 How to try it? • OpenSSFが定期的にチェックしているサイトについては、結果をWeb から確認ができる – https://scorecard.dev/viewer/

    • Webapp/API: https://github.com/ossf/scorecard-webapp • GitHub Actionsとして組み込む – https://github.com/ossf/scorecard-action • CLIツールをローカルでも実行可能 – 対象のリポジトリ管理サービス(GitHubなど)にアクセス可能なトークンが必要 – 対象リポジトリ • GitHub • GitLab • ローカル (算出できるスコアは限られる) [対象] • scorecard-actionを有効にしている or • /cron/internal/data/projects.csvに記載されている
  2. 3 What kind of scores can you see? • Scorecardのリポジトリに対して実行した結果

    総合スコア 内訳 各項目の重要度 (リスクレベル) https://scorecard.dev/viewer/?uri=git hub.com%2Fossf%2Fscorecard
  3. 4 スコア一覧 (High以上) 項目名 リスクレベル チェック内容 (具体的な項目) Dangerous- Workflow Critical

    ワークフローに危険なパターンがないか (GitHub Actionワークフローの設定) Webhooks Critical Webhookの設定で認証が有効になっているか (GitHub Webhookの設定) Maintained High アクティブにメンテされているか? (最近のコミット数, issueに対する活動, アーカイブ状態など) Dependency- Update-Tool High 依存関係のアップデートツールを使っているか? (dependabot, renovate, pyupのいずれか) Binary-Artifacts High 生成されるバイナリをリポジトリに含んでいるか? (.classや.pycなどのファイルの存在) EXPERIMENTAL LOCAL EXPERIMENTAL 試験的機能。SCORECARD_EXPERIMENTAL環境変数を設定したときのみ有効 LOCAL GitLab それぞれGitLab, ローカルリポジトリで対応している項目 (GitHubはすべてに対応しているので省略) GitLab LOCAL 凡例 LOCAL
  4. 5 スコア一覧 (High以上) 項目名 リスクレベル チェック内容 (具体的なチェック項目) Branch-Protection High デフォルト・リリースブランチが保護されているか?

    (ブランチの保護設定) Code-Review High 人によるコードレビューを必須としているか? (直近のコミットのApproval状態、authorとcommitterが同一か) Signed-Releases High リリース成果物に電子署名を付加しているか (直近のリリース成果物での*.sig, *.asc等の存在) Token-Permissions High ワークフローで指定されたトークンが最低権限の 原則に従っているか (workflowのpermissionsの指定) Vulnerabilities High プロジェクト及びその依存関係に未修正の脆弱性 が存在しているか (OSVの脆弱性データベース) GitLab LOCAL
  5. 6 スコア一覧 (Medium) 項目名 リスクレベル チェック内容 (具体的な項目) Fuzzing Medium Fuzzingを利用しているか

    (OSS-Fuzz, ClusterFuzzLite, 一部の言語ごとのFuzzer) Packaging Medium パッケージの形で成果物を提供しているか (GitHub packaging workflow, 各パッケージマネージャごとの GitHub Actions) Pinned- Dependencies Medium 依存関係に対してバージョンを固定しているか (Dockerfile・GitHub workflowsなどの依存関係設定) SAST Medium SASTツールを利用しているか (CodeQL, SonarCloud, LGTMなどを直近のPRやWorkflowで利用 しているか) SBOM Medium SBOMをソース中のファイルやリリース成果物とし て提供しているか (リポジトリかリリース成果物内でのSBOMファイルの存在) EXPERIMENTAL LOCAL GitLab
  6. 7 スコア一覧 (Medium~Low) 項目名 リスクレベル チェック内容 (具体的な項目) Security-Policy Medium セキュリティポリシーを定めているか

    (SECURITY.mdのリポジトリ内の存在、内容) CI-Tests Low PRのマージの前にCIテストが動いているか? (直近のコミットのCheckRuns・Statuses(GitHub)) CII-Best-Practices Low OpenSSFのBest Practices Badgeを取得しているか (Best Practices badge APIでチェック) Contributors Low 複数の組織からのコントリビューターがいるか (コントリビューターのGitHubのCompanyフィールド) License Low プロジェクトがライセンスを提供しているか (GitHub License API、LICENSEファイル等) GitLab LOCAL
  7. 8 スコア例 (scorecardのGitHubリポジトリ例) (1) Dangerous-Workflow 10 No dangerous workflow detected

    Code-Review 8 Found 8/9 approved changesets Vulnerabilities 8 2 existing vulnerabilities detected Warn: Project is vulnerable to: GO-2022-0635 Warn: Project is vulnerable to: GO-2022-0646 Binary-Artifacts 10 No binaries found in the repo Dependency-Update-Tool 10 Detected update tool: Dependabot: .github/dependabot.yml:1 Maintained 10 30 commit(s) and 18 issue activity found in the last 90 days Signed-Releases 10 5 out of the last 5 releases have a total of 5 signed artifacts. Info: provenance for release artifact: multiple.intoto.jsonl: https://api.github.com/repos/ossf/scorecard/releases/assets/180656635 Token-Permissions 10 Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql-analysis.yml:45….
  8. 9 スコア例 (2) Pinned-Dependencies 9 Dependency not pinned by hash

    detected 56 out of 56 GitHub-owned GitHubAction dependencies pinned 44 out of 46 third-party GitHubAction dependencies pinned 25 out of 25 containerImage dependencies pinned 1 out of 1 goCommand dependencies pinned Fuzzing 10 Project is fuzzed OSSFuzz integration found GoBuiltInFuzzer integration found: checks/raw/fuzzing_test.go:179 Packaging 10 Packaging workflow detected SAST 10 SAST tool is run on all commits SAST configuration detected: CodeQL all commits (29) are checked with a SAST tool Security-Policy 10 security policy file detected: SECURITY.md:1 Found linked content: SECURITY.md:1 Found disclosure, vulnerability, and/or timelines in security policy CII-Best-Practices 5 badge detected: Passing
  9. 10 スコア例 (3) CI-Tests 10 29 out of 29 merged

    PRs checked by a CI test Contributors 10 project has 67 contributing companies or organizations License 10 license file detected project has a license file: LICENSE:0 FSF or OSI recognized license: Apache License 2.0: LICENSE:0 Branch-Protection --
  10. 11 How to execute it? • ローカルリポジトリ • GitHubリポジトリ •

    GitLabリポジトリ $ ./scorecard --local (リポジトリのディレクトリ) $ export GITHUB_AUTH_TOKEN=(GitHubのアクセストークン) $ ./scorecard --repo github.com/(owner)/(repo) $ export GITLAB_AUTH_TOKEN=(GitLabのアクセストークン) $ ./scorecard --repo gitlab.com/(owner)/(repo) $ export GITLAB_AUTH_TOKEN=(GitLabのアクセストークン) $ ./scorecard --repo (self-hosted server host name)/(owner)/(repo) ※トップレベルにない場合には、GL_HOST=foo.com/bar のように環境変数を設定する セルフホストの場合 GitLab.comの場合
  11. 12 Project Goals / Non-Goals • ゴール – オープンソースプロジェクトのセキュリティへの姿勢の分析と信頼の決定 を自動化する

    – このデータを利用し、世の中が依存するような極めて重要なプロジェクト のセキュリティへの姿勢を積極的に改善する – 既存のポリシーに対する評価ツールとして動作する • ノン・ゴール – 決定的なレポート、すべてのプロジェクトが従わなければならないような 要件となる • One-size-fits-allなソリューションをめざすわけではない。チェックは opinionatedであり、false positive / false negativeも存在する • スコアの数値は各プロジェクトが何をしているか・してないかを表すものでは ない。Scorecardの基準が変わることで変化しうる https://github.com/ossf/scorecard/blob/main/README.md
  12. 13 Scorecard: Internals • 下記のコンポーネントからなる – 各チェック項目に対応するChecker – リポジトリから取得したデータのヒューリスティックであるProbe •

    スコアの算出は下記の通り – Checkerが、必要なデータ(Raw Result)をリポジトリから取得する • 各リポジトリサービスを抽象化したRepoClientを介して取得 – それぞれのProbesに取得したデータを与えて、その結果(Outcome)を発見 (Finding)として取得 – Findingを収集し、それを評価してスコアを算出する – さらに各Checkerのスコアを集約し、リスクレベルで重みづけをして10点に正 規化して最終的なスコアを算出 • 重み: Critical 10.0, High: 7,5, Medium: 5, Low: 2.5
  13. 14 Scorecard: a little bit internals Probe (例) • archived

    • hasRecentCommits probe: “hasRecentCommits” text: “Found a contribution within the threshold” outcome: True … Checker RepoClient GitHub, GitLab, … GitHub API etc. Repository information (メソッド例) • IsArchived() • ListCommits() RawResult Finding 10.0 / 10.0 Evaluate 𝑆𝑐𝑜𝑟𝑒 ≔ 10 × コミット数 + 更新された𝑖𝑠𝑠𝑢𝑒数 1 × 90 7 (90日以内) hasRecentCommitsのFinding例 Maintainedの場合のスコアの計算式 (10以上は10になる)
  14. 15 Structured Result • Structured Result – Scorecardの各Probeの結果(Finding)をJSON形式で出力したもの • 導入の目的

    – 結果に対して、ユーザーごとのポリシーを適用できるようにするため • セキュリティのリスク評価は、場合によって異なる • Scorecardではデフォルトのスコアポリシーを持っているが、ユーザーがそれ 以外の経験則・ポリシーを当てはめる必要があることがある – スコアだけだと内訳がわからず、適切にポリシーの評価ができない
  15. 16 Structured Result: 実行例と出力例 $ ./scorecard --repo github.com/ossf/scorecard ¥ --probes

    hasOSVVulnerabilities --format probe hasOSVVulnerabilitiesのprobeを実行し、その結果をStructured result として出力 { ... "repo": { "name": "github.com/ossf/scorecard", "commit": "2adbb8876cfa8d41a9bfce61968550afd646eb31" }, "findings": [ { "remediation": { "text": "Fix the GO-2022-0635 by following information from https://osv.dev/GO-2022-0635...”, "effort": 3 }, "probe": "hasOSVVulnerabilities", "message": "Project is vulnerable to: GO-2022-0635", "outcome": "True" }, ... ] }
  16. 18 まとめ • OpenSSF scorecard: GitHub / GitLabリポジトリを分析し、そのソ フトウェアのセキュリティリスクを数値化 –

    オープンソースのリポジトリを対象としており、コミットだけでなく、イ シューの状況やCI・CDパイプラインの中身など、様々な観点の情報を利用 – 分析の内容・数値の基準は、オープンソース以外では必ずしも良く当ては まるものではないが、分析するコードなどを活用することも可能 – 特にLF系のプロジェクトでは、成熟度を図るために利用が推奨される ケースも増加 • GitHub・GitLab以外のリポジトリサービスへの対応は発展途上、 Probeの改善などいろいろ貢献なネタはありそう • オープンソースのプロジェクトに、Actionsを組み込む提案をする など、利用拡大するのもよいかも