JVM Log Forging

1. Übersicht

In diesem kurzen Artikel werden wir eines der häufigsten Sicherheitsprobleme in der JVM- Welt untersuchen - das Protokollieren. Wir zeigen auch eine Beispieltechnik, die uns vor diesen Sicherheitsbedenken schützen kann.

2. Was ist Holzfälschung?

Laut OWASP ist das Protokollieren eine der häufigsten Angriffstechniken.

Sicherheitslücken beim Protokollieren treten auf, wenn Daten von einer nicht vertrauenswürdigen Quelle in eine Anwendung eingegeben werden oder wenn die Daten von einer externen Entität in eine Anwendungs- / Systemprotokolldatei geschrieben werden.

Gemäß OWASP - Richtlinien log Schmieden oder Injektion ist eine Technik der Eingabe unvalidated Benutzer Schreiben von Dateien zu protokollieren , so dass es Protokolleinträge oder Inject bösartige Inhalte in die Protokolle ein Angreifer zu schmieden lassen kann.

Einfach ausgedrückt, versucht ein Angreifer durch Protokollfälschung, Datensatzinhalte hinzuzufügen / zu ändern, indem er Sicherheitslücken in der Anwendung untersucht.

3. Beispiel

Stellen Sie sich ein Beispiel vor, in dem ein Benutzer eine Zahlungsanforderung aus dem Internet sendet. Sobald diese Anforderung verarbeitet wurde, wird auf Anwendungsebene ein Eintrag mit dem Betrag protokolliert:

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" ); }

Wenn wir uns die Konsole ansehen, sehen wir ungefähr Folgendes:

web - 2017-04-12 17:45:29,978 [main] INFO com.baeldung.logforging.LogForgingDemo - Amount credited = 300

Angenommen, ein Angreifer gibt die Eingabe als "\ n \ nweb - 2017-04-12 17: 47: 08,957 [main] INFO Betrag erfolgreich rückgängig gemacht" ein. Dann lautet das Protokoll:

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

Absichtlich konnte der Angreifer einen gefälschten Eintrag im Anwendungsprotokoll erstellen, der den Wert der Protokolle beschädigte und zukünftige Aktivitäten vom Typ Überwachungstyp verwirrte. Dies ist die Essenz des Holzfälschens.

4. Prävention

Die naheliegendste Lösung besteht darin, keine Benutzereingaben in Protokolldateien zu schreiben.

Dies ist jedoch möglicherweise nicht unter allen Umständen möglich, da die vom Benutzer angegebenen Daten für das Debuggen oder Überprüfen der Anwendungsaktivität in Zukunft erforderlich sind.

Wir müssen eine andere Alternative verwenden, um diese Art von Szenario anzugehen.

4.1. Validierung einführen

Eine der einfachsten Lösungen besteht darin, die Eingabe immer vor der Protokollierung zu überprüfen. Ein Problem bei diesem Ansatz besteht darin, dass wir zur Laufzeit viele Daten validieren müssen, was sich auf die Gesamtsystemleistung auswirkt.

Wenn die Validierung fehlschlägt, werden die Daten nicht protokolliert und gehen für immer verloren, was häufig kein akzeptables Szenario ist.

4.2. Datenbankprotokollierung

Eine andere Möglichkeit besteht darin, die Daten in der Datenbank zu protokollieren. Das ist sicherer als der andere Ansatz, da '\ n' oder Newline für diesen Kontext nichts bedeuten. Dies wirft jedoch ein weiteres Leistungsproblem auf, da eine große Anzahl von Datenbankverbindungen zum Protokollieren von Benutzerdaten verwendet wird.

Darüber hinaus führt diese Technik zu einer weiteren Sicherheitslücke - SQL Injection . Um dies in Angriff zu nehmen, schreiben wir möglicherweise viele zusätzliche Codezeilen.

4.3. ESAPI

Die Verwendung von ESAPI ist in diesem Zusammenhang die am häufigsten verwendete und empfehlenswerteste Technik. Hier werden alle Benutzerdaten vor dem Schreiben in die Protokolle codiert. ESAPI ist eine Open Source-API, die von OWASP erhältlich ist :

 org.owasp.esapi esapi 2.1.0.1 

Es ist im Central Maven Repository verfügbar.

Wir können die Daten über die Encoder- Schnittstelle von ESAPI codieren :

public String encode(String message) { message = message.replace( '\n' , '_' ).replace( '\r' , '_' ) .replace( '\t' , '_' ); message = ESAPI.encoder().encodeForHTML( message ); return message; }

Hier haben wir eine Wrapper-Methode erstellt, die alle Wagenrückläufe und Zeilenvorschübe durch Unterstriche ersetzt und die geänderte Nachricht codiert.

Im vorherigen Beispiel sollte das Protokoll ungefähr so ​​aussehen, wenn wir die Nachricht mit dieser Wrapper-Funktion codieren:

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

Hier wird das beschädigte String-Fragment codiert und kann leicht identifiziert werden.

Sobald ein wichtiger Punkt zu beachten ist, müssen wir zur Verwendung von ESAPI die Datei ESAPI.properties in den Klassenpfad aufnehmen, da sonst die ESAPI- API zur Laufzeit eine Ausnahme auslöst . Es ist hier verfügbar.

5. Schlussfolgerung

In diesem kurzen Tutorial haben wir etwas über das Fälschen von Protokollen und Techniken zur Überwindung dieser Sicherheitsbedenken gelernt.

Wie immer ist der vollständige Quellcode auf GitHub verfügbar.