9.3. Python

他の言語と同じく、データがプログラムの一部として実行できる関数には、注意 が必要です。信頼できないユーザが、入力に影響を絶対与えないようにしてください。 exec() や eval()、execfile()がこれに該当します(率直に言って、compile()を 呼び出すものすべてに対して、注意深くチェックすべきです)。 意外なことに、input()式は危険です[Watters 1996, 150]。

Python プログラム(setuid や setgid したプログラム)で、特権を持たないユーザが 実行した、特権がついているプログラムには、「ユーザ」モジュールをインポート してはいけません。 ユーザモジュールのせいで、pythonrc.py が読まれたり、実行されたりします。 このファイルを信頼できないユーザがコントロールすると、攻撃者がユーザ モジュールを利用して、信頼できるプログラムに対して、強制的に勝手なコードを 実行させられます。

Python は、ほとんどコンパイル時にチェックを行いません。基本的にコンパイル時 に型情報は存在しません。関数やメソッドに渡るパラメタの数が適正であるかの チェックすらありません。 これが、潜在的バグをたくさん抱える、という残念な結果を生みます(John Viega 氏と 私は、この問題に遭遇しました)。 うまくいけば、いつの日か、Python はオプションとして静的な型付けと型チェックを 選択できるようになるでしょう。この点についてはかねてから議論されてきました。 現状は不完全ながら PyChecker という解決策があります。PyChecker は lint ライク なプログラムで、Python のソースコードによくでるバグをチェックします。 PyChecker は http://pychecker.sourceforge.net で取得できます。

Python では RExec クラスで「実行に制限をかける」機能がサポートされています。 この機能の主目的は、アプレットやモバイル・コードの実行にあります。しかし、 外部からコードが渡らなくても、プログラムの特権に制限を設ける場合にも 利用できます。 実行に制限をかける環境では、ファイルの読み込みは、デフォルトで許可しています (書き込みは許可していません)。ネットワークへアクセスする操作や GUI による やりとりはできません。 デフォルトは変更可能ですが、制限をかけた環境で、抜け穴(loophole)ができない ように注意してください。 特にユーザに対して、自由にクラスへ属性を追加できるようにすると、幾通りもの 方法で環境を破壊できます。というのは、Python は「見えない」メソッドを多量に 呼び出して実行しているからです。 デフォルトでは、Python のオブジェクトはほとんど参照渡しです。制限をかけた プログラム環境にあっても、mutable(変更可能)な値に対する参照を入れ込むと、 制限をかけたプログラムでも、ある程度オブジェクトが変更できます。つまり 制限をかけた環境の外から見えてしまいます。 つまり mutable な値にアクセスしたいなら、mutable な値をコピーするか、 Bastion モジュール(別オブジェクトへの制限をサポート)を使用してください。 詳しい情報は、Kuchling [2000]を見てください。 制限をかけた環境を実現する機能が、どの程度監査を施すのかは定かではありません ので、プログラマの皆さんは注意してください。