ロシアとウクライナの反戦運動に巻き込まれないためにsweetalert2を使うのをやめよう


この記事は`sweetalert2`のバージョン `11.6.15`以前の情報を扱っています。

----

要約：トロイの木馬まがいの[`sweetalert2`](https://npmjs.com/package/sweetalert2)を使うな。

## なぜ？
以下、「特定のccTLD[^7]」は全て「そのコードをウェブサイト上で読み込み、そのドメインが`.ru`、`.su`、`.xn--p1ai`で終わるものの場合」と同義である。

* ロシアとウクライナの紛争を停止するべきという主張に**意図せず**巻き込まれる危険性がある
	* もちろん、あなたがどちらかの国の肩をあなたのウェブサイトで持ちたいと考えるのならこれ以上この記事を読む必要はない。即座にブラウザバックしてもらって構わない。
	* **ここでは**ロシアとウクライナの紛争を停止するべきという主張または思想自体を問題としていないことに注意。予防線的に言い換えるのであれば、意図しない振る舞いが望ましくないと述べている。
* バージョン`>= 11.6.14`では特定のccTLDで関連レポジトリのコードの使用を禁止するという文言が加えられた[^1]。
	* これは (主に) ロシアのエンドユーザーに対する明確な挑戦と受け取らなければならない。
	* ~~また、この変更の影響でMITライセンスと非互換になる可能性が生まれている~~この変更は来たるべき`11.6.16`で解決される[見込み](https://github.com/sweetalert2/sweetalert2/commit/8dc71742db40dbb8fab834522b15858544cd7e13)。
    	* 免責：私は法律の専門家ではないので、この懸念は全くの的はずれなものかも知れない。しかし、バージョン`>= 11.6.14 <= 11.6.15`を使用するにあたっては、ご自身で深く考えたり御社の顧問弁護士に相談するなどして十分な情報を集めてから**自己の責任のもとで使用**することを強く推奨する。
* バージョン`>= 11.4.9`ではブラウザの言語がロシア語[^5]、かつ特定のccTLDで望まないメッセージが表示されるようになっており[^6]、[GitHub Advisory](https://github.com/advisories/GHSA-qq6h-5g6j-q3cm)や[snyk.io](https://security.snyk.io/vuln/SNYK-JS-SWEETALERT2-2774674)などが*脆弱性*として認定している[^2]。
	* `>= 11.4.20`ではそのメッセージがさらに強化された[^3]。
* バージョン`>= 11.6.12`ではブラウザの言語がロシア語[^5]かつ特定のccTLDでウェブページを全く閲覧できなくした上で、ウクライナ国歌をループして流すコードが追加されている[^4]。

## ワークアラウンド
### 開発者
* **可能なら`sweetalert2`を使わない**。
	* あなたが他のパッケージに切り替えることを**強くおすすめ**する。
	* 一般に、エンドユーザーが切り替えられないことを理由にユーザーが望まない振る舞いをバグフィックスと同梱して送り込んでくる[^4]パッケージは**トロイの木馬そのもの**であり、依存性を断ち切ってこれらの変更を支持しないという意思の表示を明確にしないといつまでもこの種のパッケージが残り続けてコミュニティに害である。
* 上記の対策が不可能なら`sweetalert2`は`<= 11.4.8`までのバージョンを使うようにする。これらのバージョンは、上記の変更の影響を全く受けない。
* 上記2つの対策が不可能なら、以下の手順を推奨する。
	1. 使用したいバージョンのタグを選択
	2. そのタグが打たれたコミットをbase commitとして新しくブランチを作成
	3. 当該「*反戦コミット*」に対するリバートコミットを作成
	4. 当該プロダクトの依存関係を、当該レジストリを使用したバージョンに置き換える

### エンドユーザー
もし、あなたが`.ru`、`.su`、`.xn--p1ai`で終わるドメインを訪れているなどで、これらの変更の影響を受けていることが想定されるのであれば、次のコードを開発者コンソールから実行することでウクライナ国歌から**は**逃れられる。他の「機能」の影響を免れることはできないので、あまり意味はないかも知れない。

```javascript
localStorage.setItem('swal-initiation', new Date('2100-01-01T00:00:00'));
```

## 最後に
`sweetalert2`のコアメンテナであると推定される[limonte](https://github.com/limonte)氏はこの変更を[protestware](https://snyk.io/blog/protestware-open-source-types-impact/)だと主張している。しかし、私はこれらの挙動取るコンポーネントは程度の大小こそあれど、**例外なく**マルウェアとして分類されると考える。ReDoSがバグとして扱われることを考慮に入れると、この変更は発動条件が限定的とは言え、ウェブサイト自身がサービス拒否をしているかのように見せるものであり[^13]、よってDoSであると他の開発者に表現されてもメンテナに反論の余地は無いものと思われる。
私達は、[`node-ipc`](https://www.npmjs.com/package/node-ipc)[^8]、[`faker`](https://www.npmjs.com/package/faker)[^9]、[`colors`](https://www.npmjs.com/package/colors)[^10]、[`event-source-polyfill`](https://www.npmjs.com/package/event-source-polyfill)[^11] [^12]のような人様のコンポーネントを同意なく破壊したり改ざんしたりするような真似をこれ以上繰り返してはならない。
もしあなたがパッケージのメンテナで、このような変更を盛り込もうと考えているのであれば、直ちにやめることをおすすめする。この記事では取り扱わないが、最悪の場合「coinhive事件」のようにあなたの書いたコードが「反意図性」を持つかどうか、面倒な裁判のトリガーとなる危険性がある。そのような主張はライブラリの動作として出力するのではなく、ブログなど他のプラットフォームで行うのがよりふさわしいだろう。なお、私はこのような主義主張を他人から観測可能な形で表現することを何ら推奨する立場を採るものではない。

[^1]: https://github.com/sweetalert2/sweetalert2/commit/6d02e1095e5d9db1dfa7f0708df6fa13a1b32be3
[^2]: CWE-913として認定されているが、この際はっきり言ってしまえばトロイの木馬である。
[^3]: https://github.com/sweetalert2/sweetalert2/pull/2462
[^4]: https://github.com/sweetalert2/sweetalert2/commit/ad394715caf026b19831b473f3a831da0ea214cf
[^5]: お使いの言語が対象かどうかは、開発者コンソールを開いて以下のコードを貼付することで判定することができる：`console.log(/^ru\b/.test(navigator.language))`
[^6]: https://github.com/sweetalert2/sweetalert2/pull/2428
[^7]: ccTLDとは、Country Code Top Level Domainの略称。有名な例として、`.jp`などがある。
[^8]: https://zenn.dev/azu/articles/e248ed86fb6d34
[^9]: https://www.itmedia.co.jp/news/articles/2201/11/news160.html
[^10]: https://zenn.dev/azu/articles/d56615b2e11ad1
[^11]: https://security.snyk.io/vuln/SNYK-JS-EVENTSOURCEPOLYFILL-2429580
[^12]: https://github.com/advisories/GHSA-97m3-w2cp-4xx6
[^13]: 一般に、ウェブサイトを訪問するユーザーは、そのサイトで使われているライブラリを一件ずつ調べてみようなどとは思わないので、全ての出力結果についてウェブサイトが意図した出力であると考えると推定される。