ログインジェクションの脆弱性は、ログエントリに無害化されていないユーザ入力が含まれる場合に発生する。悪意あるユーザは、偽のログデータをプログラムに入力し、それがシステムの動作であるかのようにシステム管理者を欺くことができる[OWASP 2008]。たとえば、悪意あるユーザはキャリッジリターンとラインフィード(CRLF)を入力することで、ある正当なログエントリを2つのログエントリに分割してしまうかもしれない。ログに保存するすべての信頼できない入力を無害化し検証することで、ログインジェクション攻撃を防ぐことができる。
ユーザ入力を無害化せずに保存すると、信頼境界(trust boundary)を越えてセンシティブなデータが漏えいしたり、法や規制に違反するような方法でセンシティブなデータを保存してしまうことが考えられる。たとえば、悪意あるユーザが暗号化されていないクレジットカード番号をログファイルに保存させることができれば、そのシステムはPCI DSSに違反することになるかもしれない[PCI 2010]。入力の無害化の詳細については「IDS00-J. SQL インジェクションを防ぐ」を参照。
違反コード
以下の違反コードは、不正なリクエストを受け取ったときにユーザのログイン名をログに保存する。入力値は無害化されていない。
if (loginSuccessful) { logger.severe("User login succeeded for: " + username); } else { logger.severe("User login failed for: " + username); }
入力値が無害化されていないため、ログインジェクション攻撃が可能である。usernameが david であるときの通常のログメッセージは以下のようになる。
May 15, 2011 2:19:10 PM java.util.logging.LogManager$RootLogger log SEVERE: User login failed for: david
ログメッセージに使用されるusernameがdavidではなく以下のような複数行からなる文字列になると、
david May 15, 2011 2:25:52 PM java.util.logging.LogManager$RootLogger log SEVERE: User login succeeded for: administrator
ログには以下のような不正なデータが含まれてしまうだろう。
May 15, 2011 2:19:10 PM java.util.logging.LogManager$RootLogger log SEVERE: User login failed for: david May 15, 2011 2:25:52 PM java.util.logging.LogManager log SEVERE: User login succeeded for: administrator
適合コード
以下の適合コードはログを保存する前にusernameを検証し、インジェクション攻撃を防いでいる。入力値の無害化については「IDS00-J. SQL インジェクションを防ぐ」を参照。
if (!Pattern.matches("[A-Za-z0-9_]+", username)) { // username は無害化されていない logger.severe("User login failed for unauthorized user"); } else if (loginSuccessful) { logger.severe("User login succeeded for: " + username); } else { logger.severe("User login failed for: " + username); }
リスク評価
ユーザ入力を検証しないでログに保存すると、ログエントリが偽装されたり、センシティブなデータが漏えいしたり、法規制に違反してセンシティブなデータの保存を行ってしまう恐れがある。
ルール | 深刻度 | 可能性 | 修正コスト | 優先度 | レベル |
---|---|---|---|---|---|
IDS03-J | 中 | 中 | 中 | P8 | L2 |
関連ガイドライン
ISO/IEC TR 24772:2010 | Injection [RST] |
MITRE CWE | CWE-144. Improper neutralization of line delimiters |
CWE-150. Improper neutralization of escape, meta, or control sequences |
参考文献
[API 2006] |
[OWASP 2008] |
[PCI DSS Standard] |
翻訳元
これは以下のページを翻訳したものです。
IDS03-J. Do not log unsanitized user input (revision 73)