JVMログ偽造
1概要
このクイック記事では、
JVM
の世界で最も一般的なセキュリティ問題の1つであるLog Forgingについて説明します。このセキュリティ上の問題から私たちを守ることができるテクニックの例も示します。
** 2ログ偽造とは
**
OWASP
によると、ログ偽造は最も一般的な攻撃手法の1つです。
ログ偽造の脆弱性は、信頼できないソースからデータがアプリケーションに入力された場合、または何らかの外部エンティティによってデータがアプリケーション/システムログファイルに書き込まれた場合に発生します。
https://www.owasp.org/index.php/Log
Injection[
OWASP__ Guidelines]によると、ログの偽造または注入は、検証されていないユーザー入力をログファイルに書き込み、攻撃者がログエントリを偽造したり悪意のあるユーザーを挿入したりできるようにする手法です。コンテンツをログに記録します。
簡単に言えば、ログ偽造によって、攻撃者はアプリケーションのセキュリティの抜け穴を調査することによってレコードコンテンツを追加/変更しようとします。
3例
ユーザーがWebから支払い要求を送信する例を考えてみましょう。
アプリケーションレベルからは、このリクエストが処理されると、1つのエントリに金額が記録されます。
private final Logger logger
= LoggerFactory.getLogger(LogForgingDemo.class);
public void addLog( String amount ) {
logger.info( "Amount credited = {}" , amount );
}
public static void main( String[]args ) {
LogForgingDemo demo = new LogForgingDemo();
demo.addLog( "300" );
}
コンソールを見ると、このように見えるでしょう。
web - 2017-04-12 17:45:29,978[main]
INFO com.baeldung.logforging.LogForgingDemo - Amount credited = 300
ここで、攻撃者が__“ \ n \ nweb – 2017-04-12 17:47:08,957[main]INFO Amount Amounts successfully successfully」のように入力を入力したとします。
web - 2017-04-12 17:52:14,124[main]INFO com.baeldung.logforging.
LogForgingDemo - Amount credited = 300
web - 2017-04-12 17:47:08,957[main]INFO Amount reversed successfully
意図的に、攻撃者はアプリケーションログに偽造のエントリを作成してログの値を破損させ、将来的には監査の種類の活動を混乱させる可能性があります。これがログ偽造の本質です。
4防止
最も明白な解決策は、ユーザー入力をログファイルに書き込まないことです。
しかし、ユーザーから与えられたデータは将来アプリケーションの動作をデバッグまたは監査するために必要であるため、これはすべての状況で可能とは限りません。
このようなシナリオに取り組むには、他の代替手段を使用する必要があります。
** 4.1. 検証を導入+
**
最も簡単な解決策の1つは、ロギングの前に常に入力を検証することです。このアプローチの問題点の1つは、実行時に大量のデータを検証する必要があることです。これはシステム全体のパフォーマンスに影響を与えます。
また、検証に失敗した場合、データは記録されずに永遠に失われることになりますが、これは多くの場合受け入れられないシナリオです。
** 4.2. データベースロギング+
**
もう1つの選択肢は、データをデータベースに記録することです。これは他のアプローチよりも安全です。なぜなら、「\ n」または改行はこの文脈に対して何も意味がないからです。ただし、これにより、ユーザーデータのログ記録に大量のデータベース接続が使用されるため、別のパフォーマンス上の問題が発生します。
さらに、このテクニックは別のセキュリティ上の脆弱性 – すなわちhttps://www.owasp.org/index.php/SQL
Injection[
SQL Injection__]を導入します。
これに取り組むために、我々は結局多くの余分なコード行を書くことになるかもしれません。
4.3. ESAPI
このコンテキストでは、
ESAPI
を使用することが最も共有され、推奨される手法です。ここでは、すべてのユーザーデータがログに書き込まれる前にエンコードされます。
ESAPI
は
OWASP
から入手できるオープンソースAPIです。
<dependency>
<groupId>org.owasp.esapi</groupId>
<artifactId>esapi</artifactId>
<version>2.1.0.1</version>
</dependency>
Central Maven Repository
で入手できます。
ESAPI
のhttps://static.javadoc.io/org.owasp.esapi/esapi/2.0.1/org/owasp/esapi/Encoder.html[
Encoder
]インターフェースを使用してデータをエンコードできます。
public String encode(String message) {
message = message.replace( '\n' , '__' ).replace( '\r' , '__' )
.replace( '\t' , '__' );
message = ESAPI.encoder().encodeForHTML( message );
return message;
}
ここでは、すべてのキャリッジリターンとラインフィードをアンダースコアに置き換え、変更されたメッセージをエンコードする1つのラッパーメソッドを作成しました。
前の例で、このラッパー関数を使用してメッセージをエンコードすると、ログは次のようになります。
web - 2017-04-12 18:15:58,528[main]INFO com.baeldung.logforging.
LogForgingDemo - Amount credited = 300
____web - 2017-04-12 17:47:08,957[main]INFO Amount reversed successfully
ここでは、破損した文字列フラグメントがエンコードされており、簡単に識別できます。
注意すべき重要な点として、
ESAPI
を使用するにはクラスパスに
ESAPI.properties
ファイルを含める必要があります。そうしないと
ESAPI
APIが実行時に例外をスローします。
https://github.com/OWASP/JJSF/blob/master/esapi
master
FULL/WebContent/ESAPI.properties[こちら]から入手できます。
5結論
このクイックチュートリアルでは、このセキュリティ問題を克服するためのログ偽造と技術について学びました。
いつものように、完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/core-java[over on GitHub]にあります。