kdnakt blog

hello there.

自動でセキュリティ対策! / GitHub の automated security fixes を試した

久しぶりにGitHubの画面を開くと見知らぬアラートが表示されていたので、早速対応してみた。 

help.github.com

 

 

[GitHubのセキュリティアラート]

ある日、GitHubにある自分のリポジトリを開くと次のような警告が表示されていた。

f:id:kidani_a:20190901010038p:plain

 

⚠️ We found potential security vulnerabilities in your dependencies.

Only the owner of this repository can see this message.

訳出すると、「利用しているライブラリにセキュリティの脆弱性がある可能性があります。リポジトリの所有者のみにこのメッセージが表示されます」といったところ。

 

「View security alerts」のボタンを押すと画面が変わり、「Security」タブが表示され、セキュリティアラートの一覧がずらりと並んでいる。これは感動ものだ。

脆弱性対応をやったことのある人なら分かると思うが、そもそもソフトウェアの依存関係にあるライブラリや、ミドルウェアに何が使われているかを正しく把握するのは一苦労である。さらにそれらの脆弱性cvedetails.comなどで定期的にチェックし、問題が報告されていれば詳細を解読して影響を調べてバージョンアップやテストを行い、リリースする……という一連の業務はまさに「Undifferentiated Heavy Lifting(差別化に繋がらない重労働)」だ。

f:id:kidani_a:20190901012305p:plain

 

GitHubにはこの差別化に繋がらない重労働を簡略化してくれる機能がある。それが「automated security fixes(自動的なセキュリティ修正)」だ。 

 

[自動的なセキュリティ修正]

一覧から、修正したいアラートを選択してクリックすると詳細が表示される。

f:id:kidani_a:20190901021032p:plain

今回対象となっているライブラリは、yarn.lockファイルに記述されていた。package.jsonで明示的に記載しているライブラリでなくても検出してくれるのはありがたい。

 

この画面では、問題のライブラリをどのバージョンまで上げれば良いか、どのバージョンにどういう問題があったか、を知ることができる。このライブラリには任意のコードを実行できる関数が存在していたらしい。恐ろしい……。

そのほかにも、脆弱性を回避するためのワークアラウンドも紹介してくれている。素晴らしい。

f:id:kidani_a:20190901021352p:plain


アラートの詳細画面右上に表示されている「Create automated security fix」をクリックすると、自動的に問題を修正するPull Requestを生成してくれる。ジョブを実行中は次のような画面になる。

f:id:kidani_a:20190901022343p:plain


混み具合にもよるが、早ければ数分程度で修正のPull Requestが作成される。あとはこれをマージしたらセキュリティ対策は完了である(もちろん、必要に応じてテストやリリース作業はあるだろうが)。

f:id:kidani_a:20190901022706p:plain

 

リポジトリの通知設定を有効にしていれば、Pull Requestが作成されたタイミングでメールによる通知を受け取ることができるので、ジョブの実行が終わるまではのんびり待っているのが良さそう。

f:id:kidani_a:20190901024648j:plain

 

[スマホで簡単ワンクリック修正]

この機能はスマートフォン版のUIでも利用することができる。

デスクトップ版と異なり、リポジトリのトップに「We found potential security vulnerabilities ...」の文言は表示されないものの、「Security」タブを開くとデスクトップ版同様にアラートの一覧を見ることができる。

f:id:kidani_a:20190901024055j:plain

 

アラートの詳細画面を開くと、こちらもデスクトップ版と同様に「Create automated security fix」のボタンが表示されており、修正Pull Requestを生成できる。

f:id:kidani_a:20190901024414j:plain

 

[自動修正が上手くいかないケースも……]

いくつかのアラートを試してみたが、上手くPull Requestが作成されない場合もあるようだ。

 

利用しているライブラリの依存関係で必要とされているバージョンの制約によって、脆弱性問題の解決されたバージョンのライブラリを利用できない場合には、次のように「Dependabot cannot update to the required version」というメッセージが表示される。

f:id:kidani_a:20190901023103p:plain

「View details about this error」をクリックすると、詳細が表示される。「one or more other dependencies require a version that is incompatible with this update」とあり、ライブラリの互換性が問題になっていることが分かる。

f:id:kidani_a:20190901023122p:plain

この場合には、力技で依存関係を変更するか、あるいは利用しているライブラリがバージョンアップしてくれるのを待つしかなさそうだ。

 

また、まれにジョブの実行に失敗してしまうこともあるようだ。

f:id:kidani_a:20190901023142p:plain

「Dependabot encountered an unknown error」という表示が出たので、詳細を表示してみたが、特に何も分からない。GitHub側にも通知が飛んで、そのうちジョブの失敗の原因について修正してくれるらしいことは分かる。

f:id:kidani_a:20190901023201p:plain

どうしようもないので、再度「Create automated security fix」のボタンを押してジョブを実行すると、今度は上手くPull Requestが作成された。ジョブの実行に失敗したときは、再実行することで解決する場合もあるようだ。

 

[まとめ]

  • GitHubの automated security fixes を試した
  • 自動的に脆弱性をリストアップしてくれるのは最高
  • 自動的に修正するPull Requestを作成してくれるのも最高
  • ライブラリの依存関係によってはバージョンを自動で上げられない場合もある

 

[おまけ]

自己所有でないリポジトリの場合には、「Security」タブを開いても次のようにアラート一覧は表示されない。

f:id:kidani_a:20190901012909p:plain

 

ただし、自己所有でないリポジトリをフォークした上で設定を変更すると、アラートを表示させることができるようになる。

セキュリティの問題を所有者以外に知らせないという意味では、フォークするとアラートが見えてしまう仕様はいかがなものかと思ってしまうが、他人のリポジトリソースコードを丸ごとコピーして自分のリポジトリにプッシュすれば同じセキュリテイアラートを受け取ることができる筈なので、そこまで細かく制御する必要はないのかもしれない。