この記事はsweetalert2
のバージョン 11.6.15
以前の情報を扱っています。
要約:トロイの木馬まがいのsweetalert2
を使うな。
なぜ?
以下、「特定のccTLD1」は全て「そのコードをウェブサイト上で読み込み、そのドメインが.ru
、.su
、.xn--p1ai
で終わるものの場合」と同義である。
- ロシアとウクライナの紛争を停止するべきという主張に意図せず巻き込まれる危険性がある
- もちろん、あなたがどちらかの国の肩をあなたのウェブサイトで持ちたいと考えるのならこれ以上この記事を読む必要はない。即座にブラウザバックしてもらって構わない。
- ここではロシアとウクライナの紛争を停止するべきという主張または思想自体を問題としていないことに注意。予防線的に言い換えるのであれば、意図しない振る舞いが望ましくないと述べている。
- バージョン
>= 11.6.14
では特定のccTLDで関連レポジトリのコードの使用を禁止するという文言が加えられた2。- これは (主に) ロシアのエンドユーザーに対する明確な挑戦と受け取らなければならない。
-
また、この変更の影響でMITライセンスと非互換になる可能性が生まれているこの変更は来たるべき11.6.16
で解決される見込み。- 免責:私は法律の専門家ではないので、この懸念は全くの的はずれなものかも知れない。しかし、バージョン
>= 11.6.14 <= 11.6.15
を使用するにあたっては、ご自身で深く考えたり御社の顧問弁護士に相談するなどして十分な情報を集めてから自己の責任のもとで使用することを強く推奨する。
- 免責:私は法律の専門家ではないので、この懸念は全くの的はずれなものかも知れない。しかし、バージョン
- バージョン
>= 11.4.9
ではブラウザの言語がロシア語3、かつ特定のccTLDで望まないメッセージが表示されるようになっており4、GitHub Advisoryやsnyk.ioなどが脆弱性として認定している5。-
>= 11.4.20
ではそのメッセージがさらに強化された6。
-
- バージョン
>= 11.6.12
ではブラウザの言語がロシア語3かつ特定のccTLDでウェブページを全く閲覧できなくした上で、ウクライナ国歌をループして流すコードが追加されている7。
ワークアラウンド
開発者
-
可能なら
sweetalert2
を使わない。- あなたが他のパッケージに切り替えることを強くおすすめする。
- 一般に、エンドユーザーが切り替えられないことを理由にユーザーが望まない振る舞いをバグフィックスと同梱して送り込んでくる7パッケージはトロイの木馬そのものであり、依存性を断ち切ってこれらの変更を支持しないという意思の表示を明確にしないといつまでもこの種のパッケージが残り続けてコミュニティに害である。
- 上記の対策が不可能なら
sweetalert2
は<= 11.4.8
までのバージョンを使うようにする。これらのバージョンは、上記の変更の影響を全く受けない。 - 上記2つの対策が不可能なら、以下の手順を推奨する。
- 使用したいバージョンのタグを選択
- そのタグが打たれたコミットをbase commitとして新しくブランチを作成
- 当該「反戦コミット」に対するリバートコミットを作成
- 当該プロダクトの依存関係を、当該レジストリを使用したバージョンに置き換える
エンドユーザー
もし、あなたが.ru
、.su
、.xn--p1ai
で終わるドメインを訪れているなどで、これらの変更の影響を受けていることが想定されるのであれば、次のコードを開発者コンソールから実行することでウクライナ国歌からは逃れられる。他の「機能」の影響を免れることはできないので、あまり意味はないかも知れない。
localStorage.setItem('swal-initiation', new Date('2100-01-01T00:00:00'));
最後に
sweetalert2
のコアメンテナであると推定されるlimonte氏はこの変更をprotestwareだと主張している。しかし、私はこれらの挙動取るコンポーネントは程度の大小こそあれど、例外なくマルウェアとして分類されると考える。ReDoSがバグとして扱われることを考慮に入れると、この変更は発動条件が限定的とは言え、ウェブサイト自身がサービス拒否をしているかのように見せるものであり8、よってDoSであると他の開発者に表現されてもメンテナに反論の余地は無いものと思われる。
私達は、node-ipc
9、faker
10、colors
11、event-source-polyfill
12 13のような人様のコンポーネントを同意なく破壊したり改ざんしたりするような真似をこれ以上繰り返してはならない。
もしあなたがパッケージのメンテナで、このような変更を盛り込もうと考えているのであれば、直ちにやめることをおすすめする。この記事では取り扱わないが、最悪の場合「coinhive事件」のようにあなたの書いたコードが「反意図性」を持つかどうか、面倒な裁判のトリガーとなる危険性がある。そのような主張はライブラリの動作として出力するのではなく、ブログなど他のプラットフォームで行うのがよりふさわしいだろう。なお、私はこのような主義主張を他人から観測可能な形で表現することを何ら推奨する立場を採るものではない。
-
ccTLDとは、Country Code Top Level Domainの略称。有名な例として、
.jp
などがある。 ↩ -
https://github.com/sweetalert2/sweetalert2/commit/6d02e1095e5d9db1dfa7f0708df6fa13a1b32be3 ↩
-
お使いの言語が対象かどうかは、開発者コンソールを開いて以下のコードを貼付することで判定することができる:
console.log(/^ru\b/.test(navigator.language))
↩ ↩2 -
CWE-913として認定されているが、この際はっきり言ってしまえばトロイの木馬である。 ↩
-
https://github.com/sweetalert2/sweetalert2/commit/ad394715caf026b19831b473f3a831da0ea214cf ↩ ↩2
-
一般に、ウェブサイトを訪問するユーザーは、そのサイトで使われているライブラリを一件ずつ調べてみようなどとは思わないので、全ての出力結果についてウェブサイトが意図した出力であると考えると推定される。 ↩
-
https://www.itmedia.co.jp/news/articles/2201/11/news160.html ↩
-
https://security.snyk.io/vuln/SNYK-JS-EVENTSOURCEPOLYFILL-2429580 ↩