Skip to main content

Golangのセキュリティ:JWTのアクセス制限を回避する脆弱性

著者

Leeya Shaltiel

snykgo header

2020年12月22日

0 分で読めます

7月、SnykのセキュリティチームはJWTパッケージに潜在的なセキュリティ問題があるとの報告を受けました。このパッケージはJSON Web TokenのGo実装を提供するもので、発見された問題は、期待どおりに動作しないVerifyAudience関数に関するものでした。この関数では二重引用符(“”)の値を渡せてしまい、本来は成功すべきでないオーディエンス検証が成功する可能性がありました。

興味深いことに、この問題が報告されるbeforeに、脆弱性自体はすでに修正されていました(ValidateAudienceAgainst関数を使ってaud値を追加検証する修正です)。しかし、この修正はpkg.go.devで公開されている特定バージョン(v4.0.0-preview1)にのみ反映され、リポジトリのmasterブランチには反映されていませんでした。

他のエコシステムと同様、多くのGo開発者はGitHubリポジトリのmasterブランチをそのままクローンすることを好みます。この場合、それは次の2つのことを意味しました。

  1. 修正済みバージョンが公開されたafter、問題が報告されたのです。

  2. この脆弱性の影響を受けるプロジェクトは依然として多くありました。多くのプロジェクトが、修正が適用された特定のタグではなくmasterブランチを使用していたことが主な理由です。

脆弱性として評価・確認した後、パッケージのメンテナーに通知しました。返信がなく、セキュリティリサーチチームがリスクの高い問題だと判断したため、SnykはCVEを割り当て、9月初めに公開しました。

この脆弱性は、今年Snykのセキュリティリサーチチームが発見した、数百件に及ぶ独自のGolangセキュリティ脆弱性の一例にすぎません。この記事では、急速に成長し人気が高まっているこのエコシステムで、Snykが用いている調査プロセスや把握している傾向についてご紹介します。

Golangの人気の高まりと増大するセキュリティリスク

ここ数年のGolangの成長ぶりには、目を見張るものがあります。Golangは、一般にGoと呼ばれ、StackOverflowの年次開発者調査で毎年、最も愛されている言語、最も使いたい言語の上位5位にランクインしています。GitHubでの活動も活発で、GoはプルリクエストとIssueで4位、スター数で3位、プッシュ数で7位にランクされています。

実用性、使いやすさ、パフォーマンス。開発者がGoでの開発を好む主な理由として、こうした点がよく挙げられます。では、セキュリティについてはどうでしょうか。2019年のGoコミュニティ調査によると、Go開発者の75%がセキュリティを重要視しています。またGoチームは最近、Golang用のセキュリティスキャナーと連携し、既知の脆弱性データベースを開発する計画を発表しました。Golangのセキュリティリスクは現実に存在しており、こうした取り組みは、この言語でより安全に開発するための重要な一歩となります。

Snykも同じ目標の実現に向けて、多大な投資を行ってきました。Snykのセキュリティリサーチチームの取り組みにより、2019年以降、新たに数百件のGolangセキュリティ脆弱性がSnyk Intel Vulnerability Databaseに追加されています。この脅威インテリジェンスを活用して、Golangプロジェクトの脆弱性をテスト・監視するSnykユーザーは増えています。しかし、情報の収集は容易ではありませんでした。比較的新しいエコシステムであり、脆弱性の発見プロセスは、より成熟したプログラミング言語の場合とは大きく異なるためです。

Golangのセキュリティリサーチが独特な理由

新たな脆弱性の発見やセキュリティリサーチ全般において、Goには際立った特徴がいくつかあります。

まず、セキュリティ脆弱性の総数です。比較的短期間で、脆弱性の数が大幅に増加していることが分かりました。JavaやJavaScriptなどの成熟したプログラミング言語と比べると、Goエコシステムには、脆弱性に関する長い歴史があるわけではありません。しかし、収集したデータからは、パッケージやモジュールの数が増えていることに加え、Goコミュニティでセキュリティ問題への認識が全体的に高まっていることが分かります。2020年にSnyk Intel Vulnerability Databaseへ追加されたGolangのセキュリティ脆弱性は、2015年から2019年までに追加された全脆弱性のほぼ2倍に達しています。

脆弱性、影響を受けるパッケージ、プログラミング言語、公開日を掲載したSnyk Vulnerability DBのウェブページ

もう一つ注目すべき点は、他の言語と比べて、脆弱性の種類がかなり多岐にわたることです。2020年に追加された脆弱性だけでも、44種類のCWEがあります。脆弱性の数が多いことに加え、これほど幅広い種類があるため、セキュリティリサーチは非常に興味深いものになります。

CVEにとどまらない、SnykによるGolangセキュリティ脆弱性の調査

すべての脆弱性が公開され、CVEを割り当てられるわけではありません。新しいCVEを追跡するだけでなく、Snykのセキュリティチームは、まだ正式に公開されていないものの、たとえば公開フォーラムで議論されている脆弱性も特定できます。この調査は、Snyk Intel Vulnerability Databaseの網羅性を支える柱の一つです。公開情報や公式のCVEレポートを超えた、包括的なセキュリティカバレッジを提供します。

こうした脆弱性は、最も危険なものとなることが少なくありません。悪意のある攻撃者は、脆弱性が議論されてから公式に公表されるまでの期間を狙い、早期に得た情報を悪用します。脆弱性が公開されれば、修正が提供されるまでに時間がかからないと分かっているためです。

この期間を最小限に抑えるため、Snykは技術フォーラム、GitHubのIssueやプルリクエスト、ソーシャルメディアのフィードなど、さまざまなオンラインリソースを調査し、脆弱性のライフサイクルのごく早い段階で、できる限り迅速に新たな脆弱性を特定します。脆弱性のトリアージを行い、深刻度やアップグレードによる修正の有無を確認します。確認後、データベースに追加し、ユーザーに通知します。

Goについて、Snykには新たに特定された可能性のあるセキュリティ脆弱性のアラートが毎日何十件も届きます。アラートは最初の手がかりにすぎません。その後、問題を詳しく調査し、脆弱性かどうかを判断します。セキュリティレポートをトリアージする際には、問題を実証するための概念実証(POC)を作成し、脆弱性と確認できた場合はCVEを割り当てます。また、適切な対策をできるだけ早く講じられるよう、該当するオープンソースパッケージのメンテナーにも連絡します。

こうした独自の脆弱性を発見する調査は、アプリケーションの保護において重要な役割を果たしています。実際、Snykのお客様の間でよく見つかるGoのセキュリティ脆弱性トップ10のうち7件は、Snykが発見した独自の脆弱性で、いずれのCVEデータベースにも登録されていませんでした。

Golang向けSnyk

Golangアプリケーションを開発しながら安全性を確保したい開発チームやセキュリティチームに、Snykは簡単に導入でき、迅速な修正を可能にする、正確なセキュリティインテリジェンスを活用したソリューションを提供します。

  • 開発者にとって使いやすい - Snykは既存の開発ワークフローにシームレスに統合でき、プロジェクトを数秒でスキャンします(Kubernetes規模のプロジェクトでも可能です!)。非常に使いやすく、利用の定着と生産性の最大化を実現します。

  • 包括的なカバレッジ - SDLCのさまざまな段階でセキュリティ脆弱性とライセンスの問題を特定します。コンテナ内で稼働するものを含め、Go Modulesを使ったアプリケーションをサポートします。

  • 深いセキュリティ知見 - 2019年以降、Snykは数百件の独自のGoセキュリティ脆弱性をSnyk Intel Vulnerability Databaseに追加しています。その多くは独自に発見されたもので、NVDには登録されていません。Snykのセキュリティリサーチチームによる調査の成果です。

Goを使っていますか?Snykを無料でお試しください。

Capture the Flagを始めよう

オンデマンドのバーチャル入門ワークショップを見て、Capture the Flagの課題の解き方を学びましょう。