forgeage de journaux JVM

Forgeage de journaux JVM

1. Vue d'ensemble

Dans cet article rapide, nous allons explorer l'un des problèmes de sécurité les plus courants dans le monde deJVM: la création de journaux. Nous allons également montrer un exemple de technique qui peut nous protéger de ce problème de sécurité.

2. Qu'est-ce que le forgeage de journaux?

SelonOWASP, la création de journaux est l'une des techniques d'attaque les plus courantes.

Les vulnérabilités de création de journal se produisent lorsque des données entrent dans une application à partir d'une source non approuvée ou qu'elles sont écrites dans un fichier journal d'application / système par une entité externe.

SelonOWASP guidelines, le forgeage ou l'injection de journaux est une technique consistant à écrire des entrées utilisateur non validées dans des fichiers journaux afin de permettre à un attaquant de falsifier des entrées de journal ou d'injecter du contenu malveillant dans les journaux.

En un mot, en ouvrant une session de falsification de journal, un attaquant tente d'ajouter / de modifier le contenu d'un enregistrement en explorant les failles de sécurité de l'application.

3. Exemple

Prenons un exemple où un utilisateur soumet une demande de paiement à partir du Web. À partir du niveau de l’application, une fois cette demande traitée, une entrée sera consignée avec le montant:

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

Si nous regardons la console, nous verrons quelque chose comme ceci:

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

Maintenant, supposons qu'un attaquant fournisse l'entrée en tant que“ web – 2017-04-12 17:47:08,957 [main] INFO Amount reversed successfully”, alors le journal sera:

web - 2017-04-12 17:52:14,124 [main] INFO  com.example.logforging.
  LogForgingDemo - Amount credited = 300

web - 2017-04-12 17:47:08,957 [main] INFO Amount reversed successfully

Intentionnellement, l’attaquant a été en mesure de créer une entrée falsifiée dans le journal de l’application, ce qui a corrompu la valeur des journaux et a gêné les activités de type audit à l’avenir. C’est l’essence de la forge de bûches.

4. La prévention

La solution la plus évidente consiste à ne consigner aucune entrée d'utilisateur dans les fichiers journaux.

Mais cela pourrait ne pas être possible dans toutes les circonstances, car les données fournies par l'utilisateur sont nécessaires pour le débogage ou l'audit de l'activité de l'application à l'avenir.

Nous devons utiliser une autre solution pour faire face à ce type de scénario.

4.1. Introduire la validation

L'une des solutions les plus simples consiste à toujours valider les entrées avant la journalisation. Un problème avec cette approche est que nous devrons valider beaucoup de données au moment de l’exécution, ce qui affectera les performances globales du système.

De plus, si la validation échoue, les données ne seront pas enregistrées et perdues définitivement, ce qui n’est souvent pas un scénario acceptable.

4.2. Journalisation de la base de données

Une autre option consiste à enregistrer les données dans la base de données. C'est plus sûr que l'autre approche puisque‘ ' ou nouvelle ligne ne signifie rien dans ce contexte. Toutefois, cela soulèvera un autre problème de performances, car un nombre considérable de connexions à la base de données sera utilisé pour la journalisation des données utilisateur.

De plus, cette technique introduit une autre faille de sécurité, à savoirSQL Injection. Pour résoudre ce problème, nous pourrions finir par écrire de nombreuses lignes de code supplémentaires.

4.3. ESAPI

L'utilisation deESAPI est la technique la plus partagée et la plus recommandée dans ce contexte. Ici, chaque donnée utilisateur est codée avant d’être écrite dans les journaux. ESAPI est une API open source disponible à partir deOWASP:


    org.owasp.esapi
    esapi
    2.1.0.1

Il est disponible dans lesCentral Maven Repository.

Nous pouvons encoder les données à l'aide de l'interfaceEncoder deESAPI:

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

Ici, nous avons créé une méthode d'encapsulation qui remplace tous les retours à la ligne et les sauts de ligne par des traits de soulignement et code le message modifié.

Dans l'exemple précédent, si nous encodons le message à l'aide de cette fonction wrapper, le journal devrait ressembler à ceci:

web - 2017-04-12 18:15:58,528 [main] INFO  com.example.logforging.
  LogForgingDemo - Amount credited = 300
__web - 2017-04-12 17:47:08,957 [main] INFO Amount reversed successfully

Ici, le fragment de chaîne corrompu est codé et peut être facilement identifié.

Un point important à noter est que pour utiliserESAPI, nous devons inclure le fichierESAPI.properties dans le chemin de classe, sinon l'APIESAPI lèvera une exception lors de l'exécution. Il est disponiblehere.

5. Conclusion

Dans ce rapide tutoriel, nous avons appris comment créer des journaux et créer des techniques pour surmonter ce problème de sécurité.

Comme toujours, le code source complet est disponible surover on GitHub.