唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

Chromeの拡張機能のバージョンを固定したかった

Chromeに入れた拡張機能(エクステンション)は自動的に更新されてしまう
自動更新を停止してバージョンを固定して使う方法はないかな、と軽く調べてみたらよい方法が見つからなかったメモ

経緯

この前記事に書いたけどChrome拡張があるバージョンにアップデートしてからマルウェアになって悪質な動作をし始める、という問題にひっかかってしまった
sucrose.hatenablog.com

なのでChrome拡張のバージョンを固定する方法がないか調べてみた
Firefoxのアドオンは自動更新をオフにできるみたいですが、Chromeについて調べてみたらあまり実用的な方法は見つからなかった
denpa-shinbun.com

方法1: デベロッパーモードでローカルから読み込んで無理矢理バージョンを固定する方法

Chromeから拡張機能をインストールするのではなく、ローカルからインストールすれば自動更新はされない

この方法にはChrome間で同期されない、起動時に警告が出るなどの問題があり実用的ではない

パッケージ化されていない拡張機能を読み込む

拡張機能の内容が入っているディレクトリを用意してデベロッパーモードで読み込めばバージョンを固定することができます
ただしこの方法で読み込むと毎回Chrome起動時に「無効にしてください」という警告が出る
f:id:sucrose:20161112191550j:plain

ちなみにcrxファイルから直接インストールする方法も試したが次にChromeを起動したときに無効化されてしまいました。野良拡張の対策らしい(Windowsだけ?)
f:id:sucrose:20161112191604j:plain

手順

まずインストールしたい拡張機能のパッケージのディレクトリを用意する

一旦Chromeウェブストア経由か何かで拡張をインストールして、インストール先の場所から中身をコピーしてくるのが簡単です

まず最初に拡張機能のIDを調べます
IDは拡張機能のURLの最後の部分、以下のURLだとmagchgoilgdbbjilbkkofigdaaakaafdになります
https://chrome.google.com/webstore/detail/pixiv-tag-suggest/magchgoilgdbbjilbkkofigdaaakaafd?hl=ja
またはChromeのメニューの「その他のツール」→「拡張機能」から拡張機能の一覧に表示されているIDを調べても良いです
f:id:sucrose:20161112201134j:plain

拡張機能はWindowsではC:\Users\(ユーザー名)\AppData\Local\Google\Chrome\User Data\Default\Extensions\(拡張機能のID)\(バージョン番号)\にあります
(Macでは~/Library/Application Support/Google/Chrome/以下辺りにあるらしい(Chrome/以下はWindowsと同様))
バージョン番号のディレクトリをコピーして、新しくコピーでできたディレクトリの中から_metadataというディレクトリを削除する必要があります

一応もう一つの方法として、拡張機能のcrxファイルをダウンロードしてきて拡張子をzipに変えてから解凍するという方法もあります

パッケージを読み込む

「パッケージ化されていない拡張機能を読み込む」機能で拡張機能を読み込む場合には、パッケージのディレクトリを移動したら動かなくなってしまうので最初にどこかよい場所を決めてそこに置いておきます

Chromeのメニューの「その他のツール」→「拡張機能」から拡張機能の一覧を開きます
右上の「デベロッパーモード」をクリックして有効にします
f:id:sucrose:20161112201134j:plain

デベロッパーモードで使えるようになった「パッケージ化されていない拡張機能を読み込む」で用意しておいた拡張機能のパッケージのディレクトリを指定すれば一応拡張機能が動くようになります

方法2: Chromeの拡張の更新チェックの間隔を長くする(効果は未確認)

chrome.exe --extensions-update-frequency=45の用に指定するとChromeは45秒毎にChrome拡張の更新チェックを行うらしい
ここを非常に大きな値にしておけば更新を防げるかもしれない(試してない

方法3: manifest.jsonのupdate_urlを書き換える(手元の環境で試したら効果はなかった)

インストールされている拡張機能のディレクトリに行って試しにmanifest.jsonupdate_urlhttps://clients2.google.com/service/update2/crxからhttps://localhost/に書き換えてみたけど普通にアップデートされてしまって意味がなかった
もしかしたらアップデート確認用のURLへのアクセスをブロックすればアップデートを防げるようになるかもしれないけど、どんな副作用があるかはわからない

まとめ

簡単に特定のChrome拡張だけバージョンを固定する方法は見つけられなかった
ローカルから拡張機能のパッケージを読み込むことで無理矢理実現することはできるが、あまり実用的ではなさそう
もっと簡単にできる方法ないのかな?

そもそも悪質なChrome拡張の対策としては、Chrome拡張自体をあまり入れないようにするしかなさそう
拡張自体が更新されなくても、外部から読み込んでいるファイルのほうが変更されるというのもありそうだし