GitHubで依存関係のセキュリティの脆弱性を指摘された


プログラミングの勉強日記

2020年8月5日 Progate Lv.226
RailsのアプリをGitHubにプッシュしたら「One of your dependencies has a security vulnerability」というメールがたくさんきて、GitHubを見てみたら警告が出ていた。この対処法をまとめる。

セキュリティアラートの確認

「We found potential security vulnerabilities in your dependencies.
Only the owner of this repository can see this message.」

という警告が出ている。
(メールにもセキュリティ警告のメールがたくさん届いた。)

「See Dependabout alerts」をクリックすると詳細がわかる。(スクショを取り忘れてしまった、、)

私の場合は「Gemfile.lock」を書きかえるよう言われていた。Gemfile.lockなんていじったことないのに、なんで…?という感じだったのでいろいろ調べてみた。

対処法

 ネットで調べてみた結果、コマンドでbundle updateを実行すれば解決するらしい。

ターミナル
bundle update

 いくつかの警告は減ったが、それでも警告が残ってしまっていた。

 警告内容を詳しく見てみると、railsとpumaを最新のバージョンにアップデートすればいいみたいだったので、Gemfileを書きかえた。(バージョンを指定しないと最新のgemがインストールされる)

Gemfile
#gem 'rails', '5.0.3' 
#以下に書きかえる
gem 'rails'

#gem 'puma', '3.6.2'
#以下に書きかえる
gem 'puma'

 Gemfileを書きかえたあとにbundle updateを実行する。

ターミナル
bundle update

 実行したら、GemfileGemfile.lockをプッシュする。
 警告が消えた!!

以上が解決方法である。
Gemfileはこちらの記事で触れているので、なんとなく理解しているが、Gemfile.lockがよくわからないので調べてみた。

GemfileとGemfile.lockの違い

Gemfileとは

 インストールしたいgemを記述するファイル。
 gem 'gemの名前'と記述する。rails newコマンドで生成されたGemfileにはすでにいくつかのgemが書かれてインストールされている。
 gem 'gemの名前', 'gemのバージョン' とすると、そのバージョンがインストールされる。バージョンを指定しないと、最新のgemがインストールされる。

Gemfile.lockとは

 bundle installした時に作られるもの。Gemfileと似ているが、Gemfileに書いていたgemが必要としている別のgemも含め、動作に必要な全てのgemが展開される。つまり、Gemfile.lockはGemfile には書いてなくても,依存している gem は書かれている。
  gem 自体がインストールされたかされていないかに関わらず、bundle installしたときに「Gemfile」に書かれたgemについてのバージョンや名前は「Gemfile.lock」に書かれている。

Bundlerについて

 Bundlerはgemを管理するためのgemのこと。bundle installbundle updateなどを使用することができる。
 Bundlerは「Gemifile」に書かれてあるgemの他に必要なgemもあり、それらを自動でインストールして「Gemifile.lock」に記述する。

違い

  • Gemfileは、インストールするgemを指定するファイル。
  • Gemfile.lockは、実際にインストールされたものを記載したファイル(全部のgemが書かれている)。Bundlerでインストールされるgemパッケージの依存関係の解決結果とバージョンを固定する役割がある。単にgemだけ書いてあるGemfileと違って、バージョンまで書いてある。

gem updateとbundle updateの違い

 gem コマンドは「Gemfile」や「Gemfile.lock」とは無関係である。gem update はシステムにインストールされている gem について、それより新しいバージョンがあればその最新版をインストールする。

 bundleコマンドは「Gemfile」と「Gemfile.lock」と関係している。「Gemfile.lock」は、bundle installすることで書き込まれる。(インストールを行った後に更新されている)

bundle install と bundle updateについて

bundle install:「Gemfile.lock」を元にgemのインストールを行う。新しい環境や、gemfileに新しくgemを記述したときに使う。

bundle update:「Gemfile」を元にgemのインストールを行う。

参考文献

GitHubでセキュリティ脆弱性のアラートが来てビビりながら対応した話
Githubから脆弱性を指摘されたのでメモ
Gemfile.lock が更新されるタイミングはいつなのか?
bundle installとupdateの使い方について