Previous: Dynamic Libraries, Up: System Interface [Contents][Index]
すべてのアプリケーションと同じように、アクセス等のルールを励行するオペレーティングシステムでは、Emacsを安全な環境で実行できます。注意を払えばEmacsベースのアプリケーションがそのようなルールをチェックするセキュリティ境界の一部になることもできます。Emacsのデフォルトのセッティングでは典型的なソフトウェア開発環境としても良好に機能しますが、アタッカーを含んだ信頼されないユーザーの存在する環境では調整を要します。以下はそのようなアプリケーションを開発する際に助けとなるセキュリティ問題の要覧です。これは完全なものではありません。これはセキュリティチェックリストではなく、セキュリティに関する問題にたいするアイデアを与えることを意図したものです。
Emacsがvisitするファイルは、ファイルをvisitするバッファーに影響を与える変数セッティングを含むことができる。File Local Variablesを参照のこと。同様にディレクトリーはディレクトリー内のすべてのファイルに共通なローカル変数値を指定できる。Directory Local Variablesを参照のこと。これらの変数の悪用から守るためにEmacsはある程度の努力をしているにしても、過度に楽観してパッケージでsafe-local-variable
をセットすることにより単にセキュリティホールが作られてしまうというのは、あまりにも有りがちな問題である。ファイルとディレクトリーの両方でこの機能を無効にするには、enable-local-variables
にnil
をセットする。
Emacsが通常は背後にあるオペレーティングシステムのアクセス権限にしたがうとしても、アクセスを特別に扱うケースがある。たとえばファイル名は独自のアクセスチェックによりファイルを特別に扱うハンドラーをもつことができる。Magic File Namesを参照のこと。また対応するファイルが書き込み可でもバッファーを読み取り専用にできるが逆も可能であり、その結果は‘File passwd is write-protected; try to save anyway? (yes or no)’のようなメッセージとなるかもしれない。Read Only Buffersを参照のこと。
Emacsにはread-passwd
のようなパスワードを扱う関数がいくつかある。Reading a Passwordを参照のこと。これらの関数はパスワードを公に喧伝しないにしても、Emacs内部にアクセスする猛者なアタッカーにたいする実装の証左はない。たとえばパスワード使用後にメモリーをクリアーするためにelispコードがclear-string
を使用しても、パスワードの残滓は依然としてガーベージコレクトされたフリーリスト内に存在する。Modifying Stringsを参照のこと。
Emacsは他の多くのアプリケーションにコマンドを送信でき、アプリケーションはコマンドの値として送信された文字列を命令と誤解しないように注意を払う必要がある。たとえばファイルをaからbにリネームするためにシェルコマンドを使用する際には単に文字列mv
a
b
を使用するべきではない。なぜならいずれかのファイル名が‘-’で始まったり、‘;’のようなシェルのメタ文字を含むかもしれない。この種の問題はshell-quote-argument
のような関数の使用で回避できるものの、POSIXプラットフォームではshell-quote-argument
はシェルのメタ文字はクォートするが先頭の‘-’はクォートしない。Shell Argumentsを参照のこと。call-process
を使用するほうが通常はサブシェルより安全である。Synchronous Processesを参照のこと。同様に、たとえばmv
を呼び出すかわりに(rename-file "a"
"b" t)
を使用する等、Emacsのビルドイン関数を使用するほうが安全である。Changing Filesを参照のこと。
Emacsはアクセスするファイルとネットワークのコーディングシステムを推察する。Coding Systemsを参照のこと。Emacsの推察が誤っていたりネットワークの相手先がEmacsの推察に不同意なら、結果となるコーディングシステムは信頼できないかもしれない。更にその推察が正しいときでさえ、他のプログラムが使用できないバイトをEmacsが使用できる場合がよくある。たとえばEmacsEmacsにとってはnullバイトは他と同じ単なる文字だとしても、他の多くのアプリケーションはnull文字を文字列終端として扱うので、nullバイトを含む文字列やファイルを誤って処理する。
POSIXはEmacsの挙動に影響し得る環境変数をいくつか指定する。ASCII英大文字、数字、アンダースコアだけから構成される名前をもつ任意の環境変数がEmacsの内部の動作に影響を及ぼし得る。Emacsはその種のEMACSLOADPATH
のような変数をいくつか使用する。See Library Searchを参照のこと。Emacsが呼び出すかもしれないユーティリティーすべてにたいして標準の挙動を得るためには、いくつかの環境変数(PATH
、POSIXLY_CORRECT
、SHELL
、TMPDIR
)が正しく設定されていることを要するシステムがいくつかある。TZ
のような一見は無害な変数でさえセキュリティに影響し得る。System Environmentを参照のこと。
Emacsにはカスタマイズと同義な変数が他にある。たとえば変数shell-file-name
に非標準的な動作を行うシェルを指定すれば、Emacsベースのアプリケーションはご堂する可能性がある。
Emacsのインストールの際にインストール先のディレクトリー階層が信頼できないユーザーに変更可能なら、そのアプリケーションは信頼できない。これはEmacsが使用するプログラムや読み書きするファイルのディレクトリー階層にも適用される。
Emacsでは多くの場合にネットワークにアクセスするので、通常行うようなネットワークアクセスを回避したいと思うかもしれない。たとえばtramp-mode
をnil
にセットしていなければ、特定の構文を使用するファイル名はネットワークファイルとして解釈されて、ネットワーク越しに取得される。The Tramp Manual in The Tramp Manualを参照のこと。
Emacsアプリケーションには、他のアプリケーションが行う競合状態に関するものと同種の問題がある。たとえば(file-readable-p
"foo.txt")
がt
をリターンしたときでさえ、file-readable-p
の呼び出しからその時点の間に別のアプリケーションがファイルの権限を変更したために読み取りできないかもしれない。Testing Accessibilityを参照のこと。
Emacsがメモリーや他のオペレーティングシステムのリソースを使い切ったときには、通常は完了まで実行される計算が異常終了でトップレベルに戻るかもしれないので挙動の信頼性が減少し得る。これにより通常は完了する操作をEmacsが放棄するかもしれない。