hexo-tag-google-photos-album をアップデートした
metascraperにおけるXSS対応と、その影響
自作のHexo向けプラグインであるhexo-tag-google-photos-albumでは、metascraperというnpmライブラリを利用しています。
Google Photosの共有リンクから辿って、いくつかのメタデータを抽出するためです。
そのmetascraperで、XSS脆弱性の報告がありました。(現時点では修正対応済)
その解決に伴い、hexo-tag-google-photos-albumでは、修正済みバージョンを利用するように、修正をしました。
- metascraperのGitHubリポジトリにおけるイシュー
- npmのセキュリティ勧告
- 報告の元になったレポート
- [metascraper] Stored XSS in Open Graph meta properties read by metascrapper hackerone.com #309367
- isnot/hexo-tag-google-photos-album 修正の差分
- metascraper up to @5.4.2 #02366cc
修正後の確認
hexo-tag-google-photos-album$ npm audit |
特に問題なし。
Hexo 内部探訪 (6) DevToolsを使ったデバッグ
恥ずかしながらデバッカーを使い慣れておらず、こういった実行時コンテキストの解析に、手間取っていました。
今回は、DevToolsプロトコルを使って解析してみよう。
$ cd <path-to-your-blog-dir> |
このようにinspectを有効化してから、ブラウザ(Chromiumを利用)でchrome://inspect
を開き、Remote Target
の中に現れるinspect this
から、デバッカーを開始する。
これだと、デバッカーに馴れていない私にとっては、見たいところにたどり着くまでに手間取ってしまった。
そこで、自身で開発中のプラグインの中に、任意のブレークポイントをあらかじめ挿入してしまう。
debugger; |
そして
$ node --inspect node_modules/hexo-cli/bin/hexo g --debug |
-brk の有無が異なる点に注意。
これで、ようやく調査がやりやすくなりました。
デバッカーの使い方は、これが詳しい。
コードをステップ実行する方法 | Tools for Web Developers | Google Developers
Hexo 内部探訪 (5) ライフサイクル
Hexoでは、なにはともあれ、コマンドライン(インタラクティブなコマンド・シェル、例えばBash)環境において、hexo
コマンドを利用することで処理が始まる。
hexo-cliにある、コマンドラインの処理が始まる場所
- hexo-cli/lib/hexo.js
- hexo-cli/lib/context.js
- hexo-cli/lib/extend/console.js
Hexo オブジェクト
Hexo 内部探訪 (3) コンテキストとしての"hexo"変数
調査の開始にあたって
プラグイン(さしあたりTagプラグインを想定)の実装中にて参照できる変数やオブジェクトを、調べてまとめよう。
ドキュメント | Node.js、 Process 等もためになる。
ところで、Node.jsでは、グローバルな空間を参照するためのキーワードがある。global
である。
また、次のようなやり方で参照する方法もあるようだ。
const { inspect } = require('util'); |
これらを駆使しつつ、Hexoの場合には、私が見たところほとんど全ての場所で、hexo
という、トップレベルの変数が見えるので、これを足がかりにしたい。
また、他にも使える要素がもしあるなら、確かめたい。
グローバル汚染はなかった
調査を進めてから理解できたことだが、Hexoではグローバル変数、またはグローバル・オブジェクトを使ってはいない。
何らかのプラグインで、グローバルを意図して使うのならばともかくとして、少なくともHexoの本体と言える範囲や、純正/バンドルされた各プラグインでは、グローバル変数は使わないようだ。いわゆる「グローバル汚染」はない。
プラグイン含めて各所で見かけるhexo
という変数が存在し、トップレベルの階層にあるし、自ら呼び出しているわけでもないので、私は当初これがグローバル変数なのかな?と勘違いしていました。
しかしこれは、実際には、module.exports
の仕組みによって与えられたもので、各モジュール(概ね各jsファイルに相当)毎にそれぞれエクスポートされていました。
私はこれまでmodule.exports
について理解していないままでしたが、今回勉強になりました。
(調査中)
Hexoオブジェクト
{ |
(進捗途中)
Hexo 内部探訪 (2) 準備 npm linkメモ
npm linkを使いこなすには
npm linkという、ありがたい仕組みがあって、非公開のモジュール(または開発中のバージョン)を、node_modulesの中に配置することができる。
基本的には、シンボリック・リンクである。
ここまでは、すぐに把握できたけど、実はうまく動作させるための、さらなる条件があった。
モジュールを読み込む側と、読み込まれる側のモジュールが、ファイルシステム上で同階層になるように配置されている必要があるのだった。
私の場合だけど、開発中のリポジトリは、ある場所にまとめてある。
例:~/repository/hexo-tag-google-photos-album/
これが、Hexoプラグインを開発する場所。
一方で、ただ使うだけのものは、別の場所にある。
Hexoで構成しているブログの作業場所は、こんな感じ。
例:~/www/MyBlog/
つまり、自分のブログに自分のプラグインを組み込むとすると、
例:~/www/MyBlog/node_modules/hexo-tag-google-photos-album/
ということになる。
しかしながら、npm link的には、上記の2箇所を直接リンクすることはできないわけだ。
なので、さらに回りくどいが、以下のようにして、解決してみる。
naoto@MyComputer:~/www/MyBlog$ cd .. |
こうすることで、開発中のプラグイン実体は従来通りのままとしつつ、link可能な場所にも配置できた。
呼び出される側のlinkは、以下の通り。
naoto@MyComputer:~/www$ cd hexo-tag-google-photos-album |
そして、呼び出す方で使う側の、つまりブログ側の(しつこい)linkはこの通り。
naoto@MyComputer:~/www/hexo-tag-google-photos-album$ cd ../MyBlog |
これで、毎度git pushとnpm upを繰り返すこと無く、作業ができるようになる(はず)。
確かめてみよう。
開発中のプラグインの中に、以下を書き加える。
const { inspect } = require('util'); |
これを、コミットもせず、コピーもせず、動かしたい。
naoto@MyComputer:~/www/MyBlog$ hexo list page |
できた!
いいね。これで行こう。
運用中の注意事項
上記のような手順でプラグインをlinkしてある状況下で、もしnpm update
したら、どういうことになるのだろうか?
試したところ、答えはlink状態が解除されて、package.jsonの記述内容の通りにモジュールが上書きされるということのようです。
ところが、開発中のプラグインとは無関係に、他も含めたnpmモジュールをアップデートしたいということはあるだろうと考えられる。
こういった状態を回避するには、どうするべきか考えると、いくつか選択肢が思い浮かぶ。
- updateする頻度が低い場合は、毎回linkし直すという方法。あまり解決してない
- linkを維持したいモジュールは、package.jsonに書かなければいいのかな?試してない
- それ以外。何かあるかな?