digital 千里眼 @abp_jp

アナログな日常とデジタルの接点

uBlock Origin / Adblock Plus 間のフィルタ非互換性に関するちょっとだけ怖い話

フィルタ・オプションには違いも多い

uBlock Origin のフィルタ記法Adblock Plus のフィルタ記法 をベースに強化されている。
uBlock Origin では例えば inline-script オプションを使用して HTML 内に埋め込まれたスクリプトを無効化したり、document オプションで strict blocking と言ってアクセス先のドキュメント(HTML)をブロックできる。

Adblock Plus のフィルタ・オプションは全て uBlock Origin でも使用できると思っていたが

2015年12月から2016年1月にかけ Adblock Plus は ping というオプションを実装しAdblock Plus 2.7.1 としてリリースした。このオプションは広告の表示回数測定やアクセス解析<a ping>navigator.sendBeacon() をブロックできるので早速追加したんだが...uBlock Origin では(同等だが粗めの設定が別にあるためか)サポートしてなかった orz

サポートしてないフィルタ・オプションの扱い

  • Adblock Plus の場合、以前はサポートしてないオプションは存在しないものとして扱われたため $popup,image,~image みたいな「芸」が流行ったが、その後サポートしてないオプション指定しているフィルタは無効になった(該当ドキュメントみつけられなかった orz)
  • uBlock Origin ではサポートしてないフィルタ・オプションは内部的に other と自動変換されるため、意外なところで不具合が発生する
other になってしまったことが関係する uBlock Origin のみで発生する不具合の例

Incompatibility between ABP and uBO over FETCH (json) · Issue #2226 · gorhill/uBlock · GitHub (英語)

  • 日本語で説明すると、FETCH リクエストが uBlock Origin のバグのため other と分類されたため、|http:$ping|http:$other フィルタにマッチして意図せずブロックされるという不具合が発生していた。
  • uBlock Origin の作者は FETCH リクエストを Adblock Plus 同様に xmlhttprequest と修正することで報告した不具合を回避しつつ、ping オプションの実装についてはそのうち...としている。
  • FETCH を利用する Web サイトは上記で報告した以外にも多く、ABP Japanese Filters の |http:$ping で不具合が発生しまくっていたため、該当フィルタをコメントアウトして無効化しつつ取り急ぎ uBlock Origin 作者にバグ報告をした次第。
  • FETCH を xmlhttprequest とする修正は開発版で済んでおり、次の安定版に盛り込まれる。

まとめ: 非互換性による意図せぬ不具合を避けるためには

  • Adblock Plus のほうが無効なフィルタ・オプションに対する対処が安全(該当フィルタが無効化される)なので、uBlock Origin の仕様に合わせてフィルタを書いたほうが不具合が起こりにくいと言える
  • 購読できるフィルタの作者は ping オプションの利用を uBlock Origin の実装完了まで待ったほうが良い