Effacer de façon sécurisée ses objets en C#

Lucidiot Informatique 2019-10-05
L'écosystème .NET manquait d'une fonctionnalité absolument cruciale, alors je me suis permis de l'ajouter.


Illuminé par py-devnullaas, un client d'API Python créé par une connaissance de mon époque sur Mastodon, et travaillant parfois à essayer de m'améliorer un peu dans des langages plus fortement typés et moins souples que Python, j'ai eu la réalisation que l'écosystème .NET en général manquait cruellement d'une fonctionnalité essentielle en matière de sécurité dans les applications web : un moyen de se débarrasser de manière sûre de ses données.

En C# comme en Java, Python, JavaScript, etc., on n'a pas à effectuer la gestion de la mémoire. Les variables sont allouées quand on le demande et une tâche régulière va vider un peu la mémoire régulièrement pour retirer les variables qui ne sont plus utilisées nulle part (le garbage collector). Le rythme d'exécution de cette tâche est décidé lors de l'exécution et le développeur n'a que très peu de contrôle ; comment alors pouvoir s'assurer de la destruction sécurisée d'une variable sensible, telle qu'un mot de passe ?

C'est là qu'entre en jeu /dev/null As a Service. Ce projet offre une solution dans le cloud permettant de se débarrasser de tout en toute sécurité, et ce gratuitement. Parfait pour les petites startups qui veulent disrupter et shifter du paradigme. J'ai donc créé un client en C#, NullSharp, pour profiter de leur technologie révolutionnaire :

using System;
using System.IO;
using NullSharp;

namespace MyProject
{
    class Program
    {
        static void Main(string[] args)
        {
            string password = "hunter2";
            var stream = new NullStream();
            using (var sw = new StreamWriter(stream)) {
                sw.WriteLine(password);
            }
            // Get rid of the local copy
            password = null;
            // ...immediately
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
    }
}

Ce programme assez simple envoie un mot de passe dans un NullStream, l'unique classe de ce package qui envoie directement les données à DNAaS. Une fois le mot de passe envoyé, on supprime notre référence en mémoire au mot de passe, et on déclenche de forcer le passage du garbage collector pour s'assurer que le mot de passe disparaisse de la mémoire.

Les librairies de base de .NET fournissent System.IO.Stream.Null, un équivalent hors-ligne du NullStream ; mais cela implique l'utilisation d'un /dev/null en local. Pour les applications s'exécutant dans le cloud, cela signifie qu'on peut ne pas avoir un contrôle total sur /dev/null et ne pas savoir ce qu'il se passe vraiment à l'écriture dans ce fichier : peut-être que son fournisseur espionne les données qui y sont écrites. Avec NullSharp, vous pouvez déplacer les risques vers DNAaS, le leader mondial pour tous vos besoins en manière d'effacement, auquel font déjà confiance null startups et grands groupes !

Bien évidemment, ce package était là en tant que blague — mais c'est quand même une petite fierté d'avoir créé un package dans un environnement autre que du Python ; j'ai à l'heure de l'écriture de cette page 5 packages Python disponibles sur PyPI et ce nombre devrait encore augmenter, et je peux donc aussi dire que j'ai un package NuGet.


Commentaires

Il n'y a pour l'instant aucun commentaire. Soyez le premier !