OSWatcher : suivre l’évolution des systèmes d’exploitation au cours du temps

Posté par (page perso) . Édité par Benoît Sibaud, palm123, Trollnad Dump, Davy Defaud et ZeroHeure. Modéré par Trollnad Dump. Licence CC by-sa.
Tags :
44
2
nov.
2018
Linux

Bonjour LinuxFr.org. J’aimerais te faire part d’une idée qui me trottait dans la tête depuis quelques années, puis de sa concrétisation il y a quelques mois en un vrai projet.
Les questions qui ont fait germer cette idée sont les suivantes :

  • quels sont les binaires UNIX présents sur toutes les distributions modernes ?
  • quels sont les fichiers en communs sur tous les Windows de XP à 10 ?
  • est‐ce que les systèmes d’exploitation (OS) distribuent les binaires avec les meilleures options de compilations ?
  • quelles sont les bibliothèques chargées par défaut sur Ubuntu 16.04 ?
  • quelles sont les différences de configuration par défaut entre les grandes distributions ? Pourrions‐nous y trouver des choses intéressantes ?
  • etc.

Sommaire

Présentation

En somme, l’objectif du projet est de nous donner une vision plus haut niveau sur tout l’historique de nos système d’exploitation. Voyez cela comme une sorte de « DistroWatch sous stéroïdes ». 😃

Le cœur du projet repose sur la capture des caractéristiques d’un système fraîchement installé, afin de les mettre dans une base de données. Une fois ceci fait, nous pourrions créer des diffs entre ces mêmes caractéristiques, et ainsi nous permettre de comparer deux versions d’un même système d’exploitation, et donc de le suivre au cours de ses évolutions.

La collecte de ces caractéristiques se fera en deux modes : hors ligne « offline » et en ligne « online » :

Offline

  • arborescence du système de fichiers ;
  • propriétés des fichiers :
    • drapeau setuid,
    • options de compilation des exécutables ;
  • nombre de scripts shell, Perl et Python ;
  • tableau des appels système ;
  • configuration du noyau ;
  • tâches planifiées (cronjobs) ;
  • configuration des services dans /etc.

Online

  • consommation mémoire IDLE ;
  • processus lancés par défaut ;
  • bibliothèques chargées en mémoire ;
  • ports ouverts et services/processus associés ;
  • requêtes DNS envoyées ;
  • sockets unix ;
  • trafic D-Bus ;
  • règles de filtrage iptables ;
  • modules/pilotes chargés.

Objectifs

Le projet pourra à terme desservir plusieurs grands objectifs :

  • base de données de référence : être capable d’effectuer des requêtes sur n’importe quelle caractéristique sur chaque système d’exploitation et, grâce à la mise à disposition d’une API, quiconque pourra trouver son propre usage et construire ses scripts par‐dessus ;
  • sécurité : en extrayant les options de compilation, il est possible de vérifier que les distributions appliquent les meilleures options sur les binaires ; en outre, il serait possible de scanner tous les scripts shell, Perl et Python avec un « linter » pour faire ressortir des erreurs et mauvaises pratiques de manière automatisée ; cela a déjà été étudié avec le Cyber‐Independant Test Lab, organisation avec laquelle j’ai tenté une collaboration (affaire à suivre) ;
  • suivi et évolution : but principal du projet, suivre les changements d’un même système d’exploitation au cours du temps grâce à des diffs entre des mêmes caractéristiques ; de plus, il serait possible de suivre les correctifs de Windows et de fournir aux chercheurs en sécurité un diff binaire via une simple URL. 😃

Outils

SEE

Sandboxed Execution Environment est un cadriciel Python développé par l’un de mes collègues à F-Secure. Conçu à la base pour analyser des binaires inconnus, il permet de définir un protocole (une suite de signaux) qui vont déclencher des hooks (crochets logiciels).

Basé sur le pattern Observer, le fonctionnement est simple et permet notamment :

  • la définition d’un protocole pour une analyse ;
  • le découplage entre ce protocole et les actions qui vont en découler (Observer pattern) ;
  • les actions sont modulaires et chargées dynamiquement sous forme de crochets (hooks).

J’ai réutilisé ce cadriciel dans OSWatcher, en définissant la capture d’un système d’exploitation comme on analyserait un binaire. J’ai défini un protocole à suivre :

def protocol(environement):
    context = environement.context
    config = environement.configuration['configuration']
    context.trigger('protocol_start')
    context.trigger('offline')
    # start domain
    logging.info("Starting the domain")
    context.poweron()
    # wait until desktop is ready
    time.sleep(config['desktop_ready_delay'])
    context.trigger('desktop_ready')
    # shutdown
    context.poweroff()
    context.trigger('protocol_end')

Et j’ai implémenté les actions sous forme de hooks :

hooks.filesystem.py

from see import Hook

class FilesystemHook(Hook):
    def __init__(self, parameters):
        super().__init__(parameters)
        self.context.subscribe('offline', self.capture_fs)

Note : Les hooks peuvent eux‐mêmes déclencher de nouveaux signaux.

GitHub
→ Documentation

Neo4j

Côté base de données, j’avais commencé avec un bête MySQL, n’ayant pas entendu parler des bases de données orientées graphe. Les performances de parcours d’un système de fichiers étaient atroces, évidemment.

Aussi j’ai basculé sur Neo4j, pour stocker l’arborescence et tout le reste des caractéristiques, ce qui m’a grandement simplifié la vie.

Ébauche

Voilà où j’en suis concrètement sur le projet :

Extracteur

L’extracteur comporte les hooks suivants :

  • FileSystemHook : basé sur libguestfs pour parcourir le système de fichiers ;
  • MemoryDumpHook : utilise l’API libvirt.coreDumpWithFormat pour générer un vidage mémoire, puis lance une session avec l’outil d’analyse d’image mémoire Rekall :
    • ProcessListHook : extrait les processus avec le greffon pslist de Rekall,
    • SyscallTableHook : extrait les appels système avec le greffon ssdt de Rekall ;
  • OperatingSystemHook : crée le nœud principal dans Neo4j, fait le lien avec les données des autres hooks.

Ci‐dessous un exemple de l’extracteur lancé sur une machine virtuelle Ubuntu 16.04, avec le FilesystemHook configuré :

extracteur_ubuntu_filesystem

Exemple de configuration des hooks :

{
    "configuration":
    {
        "delete": true,
        "desktop_ready_delay": 90
    },
    "hooks":
    [
        {
            "name": "hooks.system.OperatingSystemHook"
        },
        {
            "name": "hooks.filesystem.FilesystemHook",
            "configuration":
            {
                "delete": true,
                "enumerate": true,
                "log_progress": true,
                "log_progress_delay": 10,
                "inode_checksums": false
            }
        },
        {
            "name": "hooks.memory.MemoryDumpHook"
        },
        {
            "name": "hooks.syscall.SyscallTableHook"
        },
        {
            "name": "hooks.process.ProcessListHook"
        }
    ]
}

Base de données

Ci‐dessous un exemple de ce à quoi peut ressembler un système de fichiers dans Neo4j (vue de /etc) :

etc_neo4j

Interface Web

Et, enfin, mes tentatives à faire un frontal Web :

  • VueJS ;
  • vue-apollo : pour discuter avec la BDD en GraphQL ;
  • Buefy : pour un cadriciel CSS ;
  • neo4j-graphql : hook permettant d’exposer une API GraphQL sur Neo4j.

Système de fichiers

Processus

Tableau des appels système

Futur

La suite du projet fera l’objet d’une discussion éclair (lightning talk) au FOSDEM 2019, s’il est accepté !

J’avais pour prochain objectif de produire un diagramme camembert en D3js, donnant des statistiques sur chaque type de fichier présent (ex : perl script: 0,5%). Mais je ne suis définitivement pas un développeur Web, et je vais me contenter de créer un petit script Python qui exploite ma base de données et affiche les statistiques dans le terminal.

Par ailleurs, j’aimerais recevoir vos retours et vos conseils pour mener à bien ce projet. 😃

Aller plus loin

  • # Objectif

    Posté par . Évalué à 4 (+2/-0). Dernière modification le 02/11/18 à 11:58.

    Je saisis mal l’objectif principe « suivre l’évolution des systèmes d’exploitation au cours du temps ». Est‐ce qu’il s’agit de suivre l’installation « de base » de chaque distribution ou bien de suivre ce que donne le parc des GNU/Linux installé ?

    • [^] # Re: Objectif

      Posté par (page perso) . Évalué à 5 (+5/-0).

      L'objectif est de prendre un système d'exploitation, et de pouvoir traquer ses changements au cours des nouvelles releases qui sont sorties, aussi bien que celles qui appartiennent au passé.

      Donc éventuellement partir d'une Ubuntu 10.04, et installer chaque nouvelle version jusqu'à la 18.10, en capturant leurs informations et caractéristiques respectives dans une base de donnée.

      L'étape d'après et d'avoir une vue haut niveau sur ces données, et plus particulièrement de pouvoir comparer par exemple le filesystem d'une version par rapport à une autre (git diff), afin de mieux comprendre les ajouts et suppressions.

      Il peut très bien s'agir d'une distribution GNU/Linux comme d'un Windows à mon sens, et l'on pourrait traquer les changements entre release, ou entre chaque mise à jour hebdomadaire !

      J'espère avoir répondu à ta question.

  • # osquery

    Posté par . Évalué à 7 (+6/-0). Dernière modification le 02/11/18 à 11:59.

    Le projet https://osquery.io/ pourrait être utile comme base commune pour « introspecter » le système. C’est un projet Facebook.

    • [^] # Re: osquery

      Posté par . Évalué à -9 (+4/-13).

      Un projet Facebook libre ??? OpenSource ??? avec quelle licence de réutilisabilité ?

      • [^] # Re: osquery

        Posté par . Évalué à 4 (+4/-0).

      • [^] # Re: osquery

        Posté par . Évalué à 10 (+9/-0).

        Je ne vois pas la raison de ton étonnement, ils développent plein de trucs libres et ce depuis pas mal d'années.

        • [^] # Re: osquery

          Posté par (page perso) . Évalué à 4 (+6/-5). Dernière modification le 02/11/18 à 12:47.

          Facebook, tout comme l'homme peut créer de bons outils et s'en servir pour le meilleur ou pour le pire.

          La hache de pierre pouvait servir à couper du bois ou à fracasser la tête du voisin.
          Le fusil sert à chasser, donc à se nourrir et aussi à faire la guerre.
          Un véhicule à moteur (terrestre ou aérien) peut aussi servir à faire des attentats.

          Il faut savoir différentier l'outil et son usage.

          • [^] # Re: osquery

            Posté par . Évalué à -10 (+2/-12).

            Pierre, Tu m'étonnes un peu dans cette comparaison osée (par rapport à ton militantisme fondateur au sein de l'ABUL et des RMLL).
            La pierre a servi à Caïn à fracasser la tête de son frère Abel parce que son obsession était de faire disparaître ce frère aîné tant aimé de sa mère Ève. Il me semble qu'Abel n'a jamais eu l'idée d'utiliser une pierre dans un autre but que pacifique (bâtir un muret peut-être).
            Ici, on parle de Facebook dont le dirigeant tout-puissant a pour obsession de devenir un des maîtres du monde, plus puissant même que le pays dans lequel il est né. Permettez-moi donc de m'étonner que d'un côté l'essentiel de l’œuvre de Facebook puisse être essentiellement en violation complète de l'épanouissement de l'humain et de ce qu'il a de plus intime et que par ailleurs, minoritairement, il mette à disposition de superbes outils de manière totalement désintéressée avec une licence vraiment libre … ce que j'admets devoir toutefois saluer.
            Si un tel outil est complètement disjoint de la partie sombre, fermée et propriétaire de Facebook, pourquoi ne serais-je pas tenté d'y regarder de plus près, s'il n'y en a pas d'aussi bon dans le monde "classique" du Libre ?
            Jusqu'ici on ne m'a suggérer que d'utiliser par exemple une API propriétaire permettant d'injecter dans un compte Facebook des données qu'on peut créer et partager - sans crainte d'utilisation commerciale éhontée - dans un réseau social tel que Diaspora. Comprenez bien que je m'insurge contre ce jeu de dupes ! (puisque cette API peut être rendue obsolète à tout moment par celui qui l'a définie unilatéralement)

            • [^] # Re: osquery

              Posté par . Évalué à 2 (+7/-6). Dernière modification le 03/11/18 à 13:49.

              La pierre a servi à Caïn

              Si l'on veut être crédible, on ne confond pas les mythes religieux avec l'Histoire.

              • [^] # Re: osquery

                Posté par (page perso) . Évalué à 3 (+1/-0).

                Il n’a pas dit que c’était de l’Histoire. On peut citer le geste de Lafcadio pour traiter de la gratuité des actes sans avoir à s’inquiéter de ce qu’il soit un personnage de roman.

                ce commentaire est sous licence cc by 4 et précédentes

                • [^] # Re: osquery

                  Posté par . Évalué à 2 (+0/-0).

                  Donc ça reste une expérience de pensée au même titre que l'ambition de devenir le maître du monde de la part de Mark Zuckerberg.

            • [^] # Re: osquery

              Posté par . Évalué à 8 (+6/-0).

              La pierre a servi à Caïn à fracasser la tête de son frère Abel parce que son obsession était de faire disparaître ce frère aîné tant aimé de sa mère Ève. Il me semble qu'Abel n'a jamais eu l'idée d'utiliser une pierre dans un autre but que pacifique (bâtir un muret peut-être).

              Et Jean-Claude ne s'est jamais dis qu'il pouvait en faire autre chose que solidifier sa hutte avec. Tu ne sais pas qui est Jean-Claude ? Moi je ne sais pas qui est Caïn. Mais le fait qu'une personne peut mal utiliser un outil ne devrait pas être un frein à l'outil lui-même.

              Justement dans l'esprit les LL ne limite pas l'usage. C'est volontaire. Linux est utilisé pour faire tourner des systèmes dans les hôpitaux et dans ce cadre peut sauver des vies, il permet aussi à d'autres de simuler des explosions nucléaires à fin de produire des ogives plus efficaces. Il est probablement utilisé dans le processus de développement de l'US Army pour par exemple faire des drones tueurs. Tor est-il plus utilisés par des reporters en dangers et des lanceurs d'alertes ou par des pédophiles et des vendeurs d'armes de contrebandes ?

              Vouloir freiner les usages est l'antithèse du logiciel libre. Le principe d'avoir des logiciels qui limitent l'usage ça existe, on appel ça les DRM.

              Mais tu va plus loin, beaucoup plus loin.

              Ici, on parle de Facebook dont le dirigeant tout-puissant a pour obsession de devenir un des maîtres du monde, plus puissant même que le pays dans lequel il est né.

              1) Tu accuse sans preuve. Il remet en cause des lois de son pays, comme Apple quand ils vendent des téléphones que le FBI ne semble pas pouvoir pirater, comme tout les contributeurs d'OpenSSL, de LibreSSL, de GnuTLS, de GPG, de Tor, etc. Ainsi que ceux qui proposent des services largement basé sur le chiffrement (ceux qui rendent accessible à tous ces technologies). Coucou Lufi ! :) Note que Lufi et son instance framasoft peuvent très bien servir à partager du contenu pédopornographique…

              Permettez-moi donc de m'étonner que d'un côté l'essentiel de l’œuvre de Facebook puisse être essentiellement en violation complète de l'épanouissement de l'humain et de ce qu'il a de plus intime et que par ailleurs, minoritairement, il mette à disposition de superbes outils de manière totalement désintéressée avec une licence vraiment libre … ce que j'admets devoir toutefois saluer.

              2) Tu considère l'auteur pour considérer l'outil. Tu ne va pas utiliser ReiserFS à cause de la mort de Nina Reiser par exemple ? Es-tu certain que les contributeurs des logiciels que tu utilise ne sont pas des racistes pur et dur ? Voir qu'ils ont contribué à ces logiciels pour les aider dans leur propagation d'idées racistes ? Voir pour plus efficacement pourrir la vie de leurs ennemis sur internet ? Comment fais-tu pour t'en assurer ?

              3) Tu ne connais pas grand chose à l'histoire au final. Facebook produit pas mal de logiciel libre. Le plus populaire étant très probablement ReactJS ou yarn. Mais ils ont fait aussi d'autres trucs comme GraphQL utilisé par wikidata. Ils sont à l'origine d'Apache Cassandra. Ils ont mis un coup de pied à PHP (ce qui a pas mal poussé à avoir PHP7.0) avec HipHip puis Hack. Ils sont contributeurs de Btrfs, des cgroups et de Bpf.

              Bref tu imagine des trucs pour ensuite arriver à des conclusions tout à fais discutables tout en ignorant qu'il n'y a rien de nouveau et que tu utilise déjà des logiciels de chez eux…

            • [^] # Re: osquery

              Posté par . Évalué à 6 (+4/-0).

              "Permettez-moi donc de m'étonner [qu']il mette à disposition de superbes outils de manière totalement désintéressée"

              Je vais t'étonner encore plus : Ils contribuent même au noyau Linux. Sans parler des dizaines de pages codées avec React que tu consultes chaque jour. Mais ça n'est pas forcément désintéressé : le libre a un intérêt technique pour eux.

              «We believe the best way to make sure new kernels work well for our services is to actively participate in the kernel community. Upstream participation ensures that our changes are part of the core kernel that is validated with each release, and contributing our patches upstream results in reviews that help improve code quality and maintainability.»

              On peut ne pas aimer leur coeur de métier mais ça ne rend pas leurs contributions au libre moins libres…

    • [^] # Re: osquery

      Posté par (page perso) . Évalué à 3 (+3/-0).

      Bien vu pour OSQuery
      Query your devices like a database, ça semble déjà très proche de ce que j'essaye de faire.

      J'avoue avoir vaguement entendu parler du projet il y a quelques années, en lisant une dépêche en diagonale, mais sans plus.
      Egalement, le fait de pouvoir introspecter des VMs sans utiliser d'agent était un vrai bonus, puisque celà ne faussait pas la capture des caractéristiques, ni les futurs diffs.

      Je vais regarder pour une intégration.

      Merci !

  • # pourquoi pas aussi service aux outils de sécurité

    Posté par . Évalué à -1 (+1/-2). Dernière modification le 06/11/18 à 17:49.

    ce genre de projet peut aussi aider à des logciels tels que AIDE en fournissant en plus des fichiers, leur emprunte pour pouvoir vérifier l'intégrité du système surveillé :o)
    genre un serveur centralisé d'emprunte de tous les fichiers sur toutes les versions de mise à jour Debian ou Redhat par exemple…

  • # empreinte :o)

    Posté par . Évalué à 0 (+0/-0).

    empreinte alors :o)

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.