AlexandriteOS 3.00開発記の第二弾です。
AlexandriteOSにはGnomeデスクトップが採用されています。安定性や統一感の点で優れているDEでKDEと同じく歴史あるデスクトップです。
2.00での最大の問題の一つは拡張機能でした。デフォルトのGnomeデスクトップはかなりクセが強く正直に言って使いにくいのでAlexandriteOSでは幾つかのGnome拡張機能に多少の変更を加えたものをプリインストールし標準で適用しています。
しかし本来拡張機能はGnomeやopenSUSEから見ればあくまでもハックであり正式なものではありません。これを安定してデスクトップとして提供するためにAlexandriteOS 3.00では追加の工夫をしています。
AlexandriteOSの開発者は、Gnome拡張機能がたまに起動時に無効になることがあるという不具合にかなりの間悩まされ続けていました。
AlexandriteOS 3.00ではログイン毎にGnome拡張機能を有効にするというコマンドを実行することでこれを可能な限り回避しています。なんとも原始的に聞こえますがコマンド実行の負荷は少なく確実な解決策です。
これで安心していましたがGnome42がリリースされ新たな機能が実装されました。それは拡張機能が一つでもクラッシュすると次の再開時に全ての拡張機能が無効になるという機能です。
安定性の観点からは素晴らしい実装ですが拡張機能に依存しているユーザーからすれば迷惑でもあります。幸い、先程の回避策はこれもバイパスしてくれます。
一見全てが収まったように見えますが、大問題が発生することに気づきました。これを適用したことでログインループが発生する可能性が高いことです。具体的にはユーザーがシェルをクラッシュさせる不具合を持った拡張機能をインストールした場合、次のようなことが起こります。
- 不具合を持った、もしくはAlexandriteOSでプリインストールされている拡張機能と競合する拡張機能をインストールします。
- 有効にした途端、シェルがクラッシュしたと仮定します。(これは普通発生しないように見えますが、競合する拡張機能をインストールした場合、もしくはgnome自体にバグがある場合に発生しやすいことです)
- シェルが異常終了し、ログイン画面に戻されます。
- ユーザーが再度ログインすると、gnome-shellは拡張機能を無効にして再開しようとします。
- しかし先程適用した回避策が拡張機能を有効にしてしまいます。
- 再び途端にシェルがクラッシュします
このループに陥った場合、残念ながらGUIのみでシステムを回復することは不可能です。上級ユーザーであればコマンドラインモードからdconfの設定値を書き換え修復できますが、これにはそれなりの技術が必要ですし正直に言って面倒です。
さらに悪いことにこれはセキュリティ上の欠陥でもあります。だれでも有効化した途端にシェルをクラッシュさせる拡張機能をインストールさせれば自動的にGUIを利用不可能な状態にすることができるからです。
拡張機能をインストールする際、ブラウザからインストールすれば確認ダイアログが出ますがそれ以外の場合は出ません。裏でファイルをコピーしコマンドを一つ実行するだけで拡張機能は通知なしに有効になります。
さらにGnomeの拡張機能では驚くべきことに署名どころかハッシュでのチャックですらされません。つまり既にインストールされた拡張機能の中身を差し替えるだけでこの攻撃が成り立ちます。(正直に言って、かなりの権限を持つデスクトップの拡張機能に対してこの甘さは改善すべきというかあり得ないと思っています。)
gnome-extensionをプリインストールソフトから消すことになった理由は実はこの2つです。消したと言ってもコマンド一つでインストールできることには変わりません。
そもそも言ってしまうと拡張機能を標準で使用しているディストリビューションは多くても、gnome-extensionをプリインストールしているディストリビューションは少ないのでなんとも言えませんが標準状態でのカスタマイズ性が大きく低下する変更であることには変わりないのでそれなりに悩みました。
しかしログインループは致命的な問題ですしセキュリティ上のリスクも大きくなります。あくまでも拡張機能は非公式の機能でありリスクを伴い自己責任であるということを強調するという意味も含めて廃止しました。
もちろん、安定した信頼できる拡張機能はユーザーに大きな利益をもたらします。しかしくれぐれもコマンドラインから修復できる自信がない限り、無闇に競合する拡張機能や不安定な拡張機能をインストールしないようにしてください。