OpenSSF Scorecard / ソースコードの守り方

SAST
静的解析が行われているか

コードを実行せずに問題を探す静的解析ツールが CI に組み込まれているかを見るチェックです。Scorecard が認識できるツールの一覧が決まっているため、別のツールを使っていても低く出ます。

何を見るチェックか

SAST は Static Application Security Testing の略で、 コードを動かさずに、書かれた内容から問題を探すやり方のことです。

Scorecard は、直近の Pull Request に静的解析ツールの実行記録が付いているか、 または設定ファイルがあるかを調べます。

認識される代表的なツールは次のとおりです。

  • CodeQL(GitHub の github/codeql-action
  • Snyk
  • Sonar / SonarCloud
  • Qodana
  • PySA(Python)
  • 一部の pre-commit フック

実行の記録が Pull Request に付いていた割合が点になります。

点が低いと何を意味するか

点が低いということは、自動でコードを検査する仕組みが確認できない、という意味です。

静的解析が拾えるのは、たとえば次のような書き方です。

  • 入力をそのまま SQL やコマンドに渡している
  • 例外を握りつぶして処理を続けている
  • 使われていない変数や到達しない分岐
  • 暗号関連の古い書き方

人のレビューでも見つかるものですが、機械は毎回同じ精度で見ます。 Code-ReviewCI-Tests が どちらも薄いプロジェクトで、さらにこれも無い場合、 変更を検査する仕組みが1つも無いということになります。

誤解しやすい点

Scorecard が認識できるツールの一覧は限られています。ここが最大の落とし穴です。

たとえば、次のような構成は静的解析として十分に機能しますが、 Scorecard では評価されないか、されにくいものです。

  • PHPStan / Psalm(PHP の静的解析)
  • mypy / Ruff / Bandit(Python)
  • golangci-lint / staticcheck(Go)
  • ESLint の型安全系ルール + TypeScript の strict
  • Clippy(Rust)

日常的に最も使われている型検査やリンタが、この項目にはほとんど入っていません。 つまり、実際にはかなり厳しく検査しているプロジェクトが 0点 になります。

また逆に、CodeQL を有効にしただけで一度も指摘を直していなくても 10点 になります。

もう1つ。SAST は「脆弱性が無いこと」を示しません。 静的解析が得意なのは既知のパターンの検出で、 設計上の問題や、複数のファイルにまたがるロジックの誤りは苦手です。

この項目は、他の項目より「点数と実態のずれ」が大きいと考えてください。

採用する側が確認すべきこと

  1. リポジトリの CI 設定を実際に開く。 .github/workflows/ を見れば、型検査やリンタが走っているかが分かります。 Scorecard が認識しないだけで、実は厳しく検査していることは珍しくありません。

  2. 言語ごとの定番ツールがあるかを見る。 PHP なら phpstan.neon、Python なら pyproject.toml[tool.ruff][tool.mypy]、 Go なら .golangci.yml といった設定ファイルの有無が実質的な指標になります。

  3. リポジトリの Security タブを見る。 CodeQL が有効なら、検出結果と対応状況が見えることがあります。

  4. この項目単独では判断しない。 CI-TestsCode-Review と 合わせて「検査の仕組みが何かしらあるか」を見るのが実用的です。

メンテナーなら何を改善できるか

Scorecard の点を上げたいだけであれば、CodeQL を有効にするのが最短です。 GitHub のリポジトリ設定 Security → Code scanning → Set up から数クリックで入ります。

name: CodeQL

on:
  push:
    branches: [main]
  pull_request:
  schedule:
    - cron: '0 3 * * 1'

permissions:
  contents: read
  security-events: write

jobs:
  analyze:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: github/codeql-action/init@v3
        with:
          languages: javascript    # 対応言語を指定
      - uses: github/codeql-action/analyze@v3

ただし、点のためだけに入れることは勧めません。 指摘を誰も見ないなら、CI の時間を使うだけになります。

実質的に価値があるのは、その言語で標準的な静的解析を CI に入れ、 失敗したらマージできない状態にすることです。 PHPStan や mypy を厳しめの設定で通すほうが、 CodeQL を有効にして放置するより、コードの質にはずっと効きます。

両方やるのが理想ですが、順番としては後者が先です。

あわせて読む