信頼できない入力に基づくセキュリティチェックは回避される恐れがある。信頼できないオブジェクトや引数は、ディフェンシブコピーを作成してからセキュリティチェックを行わなくてはならない。コピーは深いコピー(deep copy)を行うこと。clone() メソッドは実装によっては浅いコピー(shallow copy)しか行わず、攻撃に悪用される恐れがある。また、clone() メソッドの実装が攻撃者によって提供されたものである可能性もある。詳細は「OBJ06-J. 可変入力や可変な内部コンポーネントはディフェンシブコピーを作成する」を参照。
違反コード
以下の違反コード例では、Java 1.5 の java.io パッケージの脆弱性について紹介している。このリリースの java.io.File は final 宣言されておらず、攻撃者は正規の File クラスを拡張することで、信頼できない引数を与えることが可能であった。すなわち、getPath() メソッドを上書きし、最初の呼出しではセキュリティチェックを通過するような値を返し、2度目の呼出し時には値が変化し、/etc/passwd のようなセンシティブなファイルを参照するように書き換えられてしまうのである。これは time-of-check time-of-use (TOCTOU)脆弱性の一例である。
public RandomAccessFile openFile(final java.io.File f) { askUserPermission(f.getPath()); // ... return (RandomAccessFile)AccessController.doPrivileged(new PrivilegedAction <Object>() { public Object run() { return new RandomAccessFile(f, f.getPath()); } }); }
攻撃者は java.io.File を以下のように拡張することで攻撃する。
public class BadFile extends java.io.File { private int count; public String getPath() { return (++count == 1) ? "/tmp/foo" : "/etc/passwd"; } }
適合コード (final 宣言)
この脆弱性は、java.io.File を final 宣言することで回避することができる。
適合コード (コピー)
以下の適合コードでは、java.io.File クラスは final 宣言されていないが、引数で受け取る File オブジェクトが信頼できるものとなるような対策を行っている。すなわち、標準のコンストラクタを使用して File オブジェクトを構築することで、File オブジェクトに対して呼び出されるメソッドはすべて標準ライブラリのメソッドであり、攻撃者が提供する上書きされたメソッドではないことを保証している。
public RandomAccessFile openFile(java.io.File f) { final java.io.File copy = new java.io.File(f.getPath()); askUserPermission(copy.getPath()); // ... return (RandomAccessFile)AccessController.doPrivileged(new PrivilegedAction <Object>() { public Object run() { return new RandomAccessFile(copy, copy.getPath()); } }); }
openFile() メソッドの代わりに clone() メソッドを使用すると、意図に反して攻撃者のクラスをコピーしてしまう恐れがある(「OBJ06-J. 可変入力や可変な内部コンポーネントはディフェンシブコピーを作成する」を参照)。
リスク評価
信頼できない入力に基づいてセキュリティ上のチェックを行うと、チェックが回避される恐れがある。
ルール | 深刻度 | 可能性 | 修正コスト | 優先度 | レベル |
---|---|---|---|---|---|
SEC02-J | 高 | 中 | 中 | P12 | L1 |
関連ガイドライン
ISO/IEC TR 24772:2010 | Authentication Logic Error [XZO] |
MITRE CWE | CWE-302. Authentication bypass by assumed-immutable data |
CWE-470. Use of externally-controlled input to select classes or code ("unsafe reflection") |
参考文献
[Sterbenz 2006] |
翻訳元
これは以下のページを翻訳したものです。
SEC02-J. Do not base security checks on untrusted sources (revision 54)