カバーのセキュリティ対策ーーSAST製品の選定

※本記事は2024年8月15日にカバー公式noteにて公開された記事を再掲載したものです。

全VTuber1超絶かわいいのは誰だ!?
ドドンドドンドンドン!ぺこちゃん!!!👯‍♀️

はじめまして、CTO室インフラチームのKと申します。
現在は、内定者インターンとして業務に取り組んでいます。
本記事では、インターンで取り組んだ、SAST製品の選定についてご説明させていただきます。

SASTとは

SAST (Static Application Security Testing)とは、ソフトウェアのソースコードを静的に解析し、脆弱性を検出する手法です。

SASTが解決する課題

SASTはソースコードを静的に解析することにより、開発段階で脆弱性を早期検出します。
そのため、外部のセキュリティベンダに依頼して行うブラックボックステストと比較して、脆弱性の発見時の手戻りが小さく、対処に掛かるコストを低減できます。
また、ソースコードを分析するため、ブラックボックステストでは検出できない脆弱性を検出できる可能性があります。

SASTの導入目的

カバー株式会社ではコミュニティアプリのホロプラス、メタバースのホロアースなどのソフトウェアを自社で開発しています。
既にこれらのソフトウェアのセキュリティ対策として、ブラックボックステストは行われています。
SASTの導入によって脆弱性を早期に検出し、プロダクトのセキュリティを向上させ、将来的なセキュリティインシデントを防止することを目的とします。

その他のセキュリティリスクの検出手法

SAST以外の静的解析によるセキュリティリスクの検出手法として、SCAとシークレットスキャンがあります。
SCA(Software Composition Analysis)は、パッケージマネージャーが使用するファイルを参照して、サプライチェーンのセキュリティリスクを検出します。
シークレットスキャンは、リポジトリ中にハードコードされたシークレットを検出します。
シークレットとは、例えばGitHubのpersonal access tokenなど、他者に公開してはいけない機密情報を指します。
SAST製品の中には、SASTと合わせてこれらの機能を持つものも存在します。

要件定義

SAST製品の選定にあたり、以下の要件を定めました。

  • SAST・SCA・シークレットスキャンによって、ソースコード・リポジトリからセキュリティリスクを検出できること
  • 社内で開発に使用している言語、特にGoとC#をサポートしていること
  • 開発者の生産性を下げないこと
  • 全社的に導入し、プロジェクト横断的に脆弱性の管理ができること

これらの要件に加えて、料金とのバランスも考慮します。

選定候補の製品

SAST機能のある製品を調査し、その中から要件を満たす製品を選びました。

商用製品

GitHub Advanced Security
GitHub Advanced SecurityはGitHubのセキュリティ機能です。Code scanning(SAST)やSecret scanning(シークレットスキャン)、Dependabot・Dependency-Review(SCA)などの複数の機能で構成されます。

Datadog Code Analysis
Datadog Code AnalysisはDatadog社が提供するセキュリティ機能です。Static Analysis(SAST)とSoftware Composition Analysis(SCA)の機能で構成されます。

Snyk
SnykはSnyk社が提供するセキュリティ製品です。Snyk Code(SAST)とSnyk Open Source(SCA)の機能で構成されます。

OSS

上記の商用製品に加え、同様の機能を実現できるOSSも調査しました。OSSの選定には、ライセンスと継続的に開発が行われているかを考慮しました。

Semgrep
Semgrepはソースコードを解析し脆弱性を検出するSASTツールです。ライセンスはLGPL-2.1 Licenseですが、商用制限はSemgrepのコードを含んだ製品を販売する場合です。スキャンを目的とする場合は、料金はかかりません。詳しくはこちらのFAQを参考にしてください。

gitleaks
gitleaksはリポジトリ中にハードコードされたシークレットを検出するツールです。ライセンスはMIT Licenseです。

この2つのOSSと、すでに社内で利用しているGitHubのDependabot(SCA)を組み合わせることで、商用製品と同様のセキュリティリスクを検出できます。この2つも選定の候補としました。

まとめ

選定候補の製品についてまとめます。本記事のテーマはSAST製品の選定ですが、SCAとシークレットスキャンが製品に含まれている場合は、合わせてまとめています。

表1. SAST製品別の機能まとめ
表1. SAST製品別の機能まとめ

商用製品には各機能で検出されたセキュリティリスクを一元的に管理するためのダッシュボードがあります。こちらはOSSを組み合わせる場合にはありません。
なお、以下の製品は調査しましたが、選定候補としませんでした。

Semgrep Pro
SemgrepにはOSS版の他に、コードスキャン、SCA、シークレットスキャンが使えるPro版があります。要件は全て満たしていますが、1コントリビューターあたり月額$110の料金がかかります。こちらは弊社の環境においては、料金とのバランスが取れないと判断しました。

Sonar Cloud
Goを対象としたSecurityルールが2件しかなく、セキュリティリスクを検出するという要件を満たせないためです。弊社が調査した範囲では、こちらはセキュリティに特化した製品ではなく、コードの品質を全般的に向上させる製品だと考えました。(参考)

選定方法

以下に製品の選定時に考慮した観点を示します。

定量的観点

  • ライセンス料金
  • SASTの言語サポート
  • SASTが検出する脆弱性のカバレッジ
  • SASTの検出能力
  • シークレットスキャンの機能

定性的観点

  • 導入の容易さ
  • 脆弱性の検出結果の分かりやすさ
  • ダッシュボードの使いやすさ
  • シークレットスキャンの安心感
  • 脆弱性の修正のしやすさ

定量的観点と定性的観点の両面から検証項目を定めて比較しました。
特に定性的観点は、開発者の生産性を低下させる要因とならないかの確認のために重要な視点だと考えます。
SCAについては既にDependabotを導入しているため、SASTとシークレットスキャンを中心に検証項目を作成しました。

ライセンス料金

表2. ライセンス料金比較
表2. ライセンス料金比較

ライセンス料金は、年間でかかるトータルの料金を示しています。
GitHub Advanced Securityは、プライベートリポジトリのアクティブなコミッターごとに1つのライセンスが使用されます。アクティブなコミッターとは、コミットが最初に作成された時期に関係なく、過去90日以内にコミットをpushした開発者です。導入する必要性のあるリポジトリを把握し、当該リポジトリへの過去90日以内のコミッター数から料金を概算しました。(参考)
Datadog Code AnalysisはPublic betaのため現時点では無料で使用できます。しかし、正式リリース後の課金形態は未定となっています。(2024年6月現在)
Snykの料金は、過去 90 日以内にプライベートリポジトリにコミットした開発者数とチームプランの料金から概算しました。(参考)
OSSのSemgrep OSSとgitleaksを組み合わせて使用する場合は無料です。

SASTの言語サポート

表3. SASTの言語サポート比較
表3. SASTの言語サポート比較
※記事執筆時点での情報です。

SASTの言語サポートで優位性があるといえるのは、サポート言語数の多いSemgrep OSS、GitHub Advanced Security、Snykです。Semgrep OSSはコミュニティのサポートによって、30を超える言語に対応しています。
また、RustをサポートしているGitHub Advanced SecurityとSemgrep OSSは特に優位といえます。これはRustがホロアースの開発に用いられており、セキュリティ強化のニーズがあるためです。

言語サポートの参考リンク

・GitHub Advanced Security
 https://docs.github.com/ja/get-started/learning-about-github/github-language-support
・Datadog Code Analysis
 https://docs.datadoghq.com/ja/code_analysis/static_analysis/
・Snyk
 https://docs.snyk.io/supported-languages-package-managers-and-frameworks
・Semgrep OSS
 https://github.com/semgrep/semgrep?tab=readme-ov-file#language-support

SASTのカバレッジ

SASTが検出する脆弱性は、ルールとして公開されています。

・GitHub Advanced Security
 https://codeql.github.com/codeql-query-help/codeql-cwe-coverage/
・Datadog Code Analysis
 https://docs.datadoghq.com/ja/code_analysis/static_analysis_rules/
・Snyk
 https://docs.snyk.io/scan-using-snyk/snyk-code/snyk-code-security-rules
・Semgrep OSS
 https://semgrep.dev/r

ルールには、CWEが記載されています。CWEは脆弱性の種類を識別するための共通の基準です。ルールを確認することにより、網羅的に様々な脆弱性を検出できるかという点を比較しました。
GitHub Advanced SecurityとSnyk、Semgrepはルール数が多く、Webアプリケーションで発生する多くの脆弱性をカバーしています。
Datadog Code Analysisは他の製品と比較してSSRFや、オープンリダイレクトに関するルールがありませんでした。

SASTの検出能力

コードスキャンの脆弱性の検出能力を確認するため、意図的に脆弱性を含んでいるソースコードに対してスキャンを実行し、その検出結果を比較しました。
検証環境を以下に示します。

表4. SASTの検出能力比較における検証環境
表4. SASTの検出能力比較における検証環境

ソースコードは以下の2つをお借りさせていただきました。

https://github.com/ShiftLeftSecurity/shiftleft-go-demo
https://github.com/Contrast-Security-OSS/go-test-bench

この2つに加え、ホロプラスのAPIサーバーのリポジトリに対してもスキャンを行いました。

2つのリポジトリに対して、SASTを実行した結果は以下のようになりました。
検出できた脆弱性を⚪︎、できなかったものを×として示しています。

表5. ShiftLeftSecurity/shiftleft-go-demoに対するSASTの結果
表5. ShiftLeftSecurity/shiftleft-go-demoに対するSASTの結果
表6. Contrast-Security-OSS/go-test-benchに対するSASTの結果
表6. Contrast-Security-OSS/go-test-benchに対するSASTの結果

ホロプラスのAPIサーバーのリポジトリへのスキャン結果は詳細な回答を差し控えさせていただきます。
本検証で使用したテストケースでは、SASTの検出能力はSemgrep OSSが最も高いという結果となりました。ただし、テストケースによっては結果が変化する可能性もあります。
また、GitHub Advanced Securityは誤検出を防ぐ仕様になっていることにも留意する必要があります。

シークレットスキャンの機能

GitHub Advanced SecurityのSecret scanningは、リポジトリ中のシークレットを検出する機能です。GitHub Advanced SecurityにはPush protectionという機能があります。Push protectionは、リモートリポジトリにシークレットがpushされる前に防ぎます。

gitleaksも同じくリポジトリ中のシークレットを検出するOSSです。pushを防ぐ場合には、Git hooksのpre-commit hookを使用します。ローカルでコミット時にシークレットを検出しpushを防ぎます。しかし、開発者に導入してもらう必要があるため、強制力という意味では、GitHub Advanced SecurityのPush protectionがより強力です。

このような理由から、シークレットスキャンの機能においては、GitHub Advanced Securityに優位性があると判断しました。

ここまでの評価

ここまでの評価を比較すると以下のようになります。

表7. ここまでの評価
表7. ここまでの評価

選定の候補をGitHub Advanced SecurityとOSSに絞り込みました。その理由は大きく3つあります。

1つ目は、無料もしくは料金の見積もりが可能なためです。GitHub Advanced Securityはリポジトリの把握と、コミッター数の計算によって料金を計算できます。Semgrep OSSを使用する場合は、無料です。
Datadog Code Analysisは現時点では無料ですが、今後有料化する可能性があります。課金方法も未定のため、全社導入する場合の料金が試算できません。

2つ目は、SASTがRustをサポートしているためです。
言語サポートの要件に含めていませんでしたが、GitHub Advanced SecurityのCode scanningとSemgrep OSSはRustのサポートしている点で優位性があります。

3つ目は、SASTのカバレッジが高いためです。
GitHub Advanced SecurityのCode scanningとSemgrep OSSはルール数が多く、Webアプリケーションで発生する脆弱性をカバーしています。

さらに、Semgrep OSSはSASTの検出能力において最も高い検出能力を示しています。GitHub Advanced Securityはダッシュボード機能がある点と、Push protectionが強力です。

GitHub Advanced Securityの検証

ここからは、GitHub Advanced Securityの使用感を定性的に検証します。
検証の目的は、ここまでの検証項目で明らかにできなかった使用感をOSSと比較し、定性的な部分での優位性を明らかにするためです。

Code scanningの検証

Code scanningの有効化手順と、スキャン結果の分かりやすさを検証しました。

Code scanningの有効化は、リポジトリの設定から有効化ボタンを押すだけのため、非常に簡単です。
また、GoやC#といったビルドが必要な言語では、スキャン時にビルドが必要とドキュメントに記載されています。Goのリポジトリでは、Some packages could not be foundという警告が表示されたもののスキャンできました。C#のリポジトリでは、ビルドせずにスキャンを行うモードがあり、そちらを使うことでスキャンできました。(参考)
これらの検証から、ビルドが必要な言語のリポジトリでも容易に導入できることが分かりました。
ただし、C#のリポジトリにおけるビルド無しのスキャンは、記事執筆時点ではベータ版の機能となっています。(参考)

スキャン結果の分かりやすさについては、以下の図に示します。
脆弱性のある箇所の指摘、内容、修正方法、AIによる修正方法が分かりやすく表示されます。

図1. Pull Requestに対するCode scanningの結果
図1. Pull Requestに対するCode scanningの結果

また、検出結果が偽陽性だった場合には、ボタンで選択することで、アラートを無視できます。

リポジトリのSecurityダッシュボードの検証

リポジトリのダッシュボードからCode scanningで検出された脆弱性の検出ルール、重大度、対応状況を把握できます。
Filterで条件を設定することで、ブランチやPRごとの結果を見ることができます。

図2. リポジトリのSecurityダッシュボードのCode scanningの画面
図2. リポジトリのSecurityダッシュボードのCode scanningの画面

Org全体のSecurityダッシュボードの検証

Org全体のダッシュボードは、Org全体のセキュリティリスクを把握し、横断的に管理ができます。
例えば、Org全体のセキュリティリスクの発生状況と解決状況を日付毎のグラフとして可視化できます。また、検出されたセキュリティリスクの多い順にソートすることで、セキュリティのサポートが必要なリポジトリを簡単に識別できます。

Secret scanningの検証

検証用のリポジトリにおいて、ダミーのAWS IDとPWをpushし、その際のSecret scanningの動作を検証しました。
Push protectionを有効化している場合、そもそもpushができないため、開発者にとって安心感があります。

図3. Push protection有効化時にシークレットをpushした際の動作
図3. Push protection有効化時にシークレットをpushした際の動作

Push protectionを無効化している場合でも、シークレットをpushした際にGitHubから即座にメールが送られてくるため、pushしてしまったことに気づくことができます。

検出されたシークレットは、リポジトリのSecurityダッシュボードから確認できます。

図4. 検出されたシークレットの確認画面
図4. 検出されたシークレットの確認画面

修正フローの検証

脆弱性の検出後、修正するまでのフローを検証しました。

脆弱性の修正はAIが提案する修正コードを採用する方法と、修正コードを自分で書く方法の2つがあります。

AIが提案したコードを採用する場合は、Commit fixボタンを押します。Commit メッセージを入力し、Commitを実行します。Code scanningが再度実行され、問題がなければ修正済みとなります。
ボタン1つで手軽に修正できるため、開発者にとって親切な機能だと感じました。
ただし、AIによる修正コードの提案は、Pull Request作成時のみ行われます。初回スキャンで発見される脆弱性に対しては、AIは修正コードを提案しません。また、AIによる修正コードの提案は、現時点では全ての脆弱性の修正をカバーしているわけではありません。今後サポート範囲を拡大していく予定とされています。

脆弱性の修正を自分で行う場合、検出されている箇所を自分で修正します。
pushするとCode scanningが再度実行され、問題がなければ修正済みとなります。

図5. AIが提案する修正方法とそれを受け入れる画面
図5. AIが提案する修正方法とそれを受け入れる画面

結論

GitHub Advanced Securityの費用対効果を判断した結果、弊社の環境においては、SemgrepのOSS版とgitleaksを選定しました。

まず、GitHub Advanced Securityの優位性は以下の4点だと考えました。

1)Orgのセキュリティダッシュボード
プロジェクトを横断したセキュリティリスクの管理ができるようになります。

2)導入のしやすさ
設定画面から有効化ボタンを押すだけで導入できます。
SemgrepのOSSとgitleaksをCIに組み込むには、GitHub Actionsを実装する必要があります。

3)Secret scanningのPush protection
シークレットのpushを防ぐことができます。gitleaksよりも強制力を持ちます。

4)AIによるコードの修正方法の提案
LLMを用いてAIが修正方法を提案してくれるため、生産性を下げずに修正できます。SemgrepのOSS版も、単純な修正はできますが、高度な修正はできません。イメージとしては、Linterの修正です。

次に、GitHub Advanced Securityの費用対効果を判断しました。

GitHub Advanced Securityの料金は、コミッターごとにかかります。そのため、導入対象を絞り込む必要性があります。
しかし、導入対象を絞り込むほど、1番目のOrgのセキュリティダッシュボードの効果が小さくなります。なぜならば、セキュリティダッシュボードの効果が発揮されるのは、多くのリポジトリに導入している場合だからです。逆に、多くのリポジトリに導入し、セキュリティダッシュボードの有効性を高めようとすると、料金が高くなってしまいます。

2の導入のしやすさですが、Semgrep OSSとgitleaksをGitHub Actionsで実装する難易度もそれほど高くはありません。実装方法はSemgrepのドキュメントとgitleaksのworkflows/gitleaks.ymlに記載されており、とてもシンプルに導入できることが分かります。

3のSecret scanningのPush protectionですが、弊社ではパブリックで公開しているリポジトリはありません。そのためpushしてしまったとしてもgitleaksで即座に検出してRevokeすることで対応できると考えました。

4のAIによるコードの修正方法の提案ですが、生産性を下げないという点で、効果的な機能だと考えます。しかし、AIによる優位性はあるものの、総合的に見たときにOSSの優位性が上回ると考えました。

GitHub Advanced Securityには他の製品には無い強みがあると考えますが、料金以上にインパクトのあるユースケースを見つけることができませんでした。
これらの理由から、SASTとしてはSemgrepのOSS版、シークレットスキャンとしてgitleaksを選定することにしました。SCAはGitHubのdependabotを引き続き利用します。

まとめ

本記事では、SAST製品の選定について解説させていただきました。
SASTを導入することで、プロダクトのセキュリティを向上させることができます。
今後もタレントやファンの皆様に安心してサービスを使っていただけるように、セキュリティの取り組みを継続的に行ってまいります。

以下はインターンの感想になります。
今回のインターンでは、インターンという身分でありながら、全社的に導入するセキュリティ製品の導入というインパクトの大きいことに携わることができました。導入目的から要件を定め、そして具体的な検証項目を定めていくという、技術選定のやり方を学ぶことができました。

また、インターンを通じて様々な部署の方と議論する機会がありました。特に、検証作業では、ホロプラスのサーバーサイドのリポジトリに試験的に導入して進めたのですが、開発者の方から選定において参考になるご意見をいただきました。
さらに、GitHub社様には、GitHub Advanced Securityの質問や試用後のレビューのためのミーティングの場を設けていただきました。相手が何を知りたいと考えているかを考えた上で、自分が伝えるべき事を言語化するなど、重要な経験ができて良かったです。
このように、コミュニケーションの部分でも自分自身の成長に繋がったと感じています。

カバー株式会社では、エンジニアのインターン・新卒採用をしています。
こちらの記事を読んで興味を持たれた方は、以下のリンクからぜひご応募お願い致します。

カバー株式会社 インターン・新卒採用サイト
https://cover-corp.com/recruit/newgraduate