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 ;
- drapeau
- 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 simpleURL
. 😃
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 :
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é surlibguestfs
pour parcourir le système de fichiers ; -
MemoryDumpHook
: utilise l’APIlibvirt.coreDumpWithFormat
pour générer un vidage mémoire, puis lance une session avec l’outil d’analyse d’image mémoireRekall
:-
ProcessListHook
: extrait les processus avec le greffonpslist
deRekall
, -
SyscallTableHook
: extrait les appels système avec le greffonssdt
deRekall
;
-
-
OperatingSystemHook
: crée le nœud principal dansNeo4j
, 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é :
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
) :
Interface Web
Et, enfin, mes tentatives à faire un frontal Web :
-
VueJS
; -
vue-apollo
: pour discuter avec la BDD enGraphQL
; -
Buefy
: pour un cadriciel CSS ; -
neo4j-graphql
: hook permettant d’exposer une APIGraphQL
sur Neo4j.
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
- OSWatcher sur GitHub (816 clics)
# Objectif
Posté par barmic . Évalué à 4. Dernière modification le 02 novembre 2018 à 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 Wenzel (site web personnel) . Évalué à 5.
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 bunam . Évalué à 7. Dernière modification le 02 novembre 2018 à 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 philToulibre . Évalué à -9.
Un projet Facebook libre ??? OpenSource ??? avec quelle licence de réutilisabilité ?
[^] # Re: osquery
Posté par Xanathos . Évalué à 4.
https://github.com/facebook/osquery/blob/master/LICENSE
De rien !
[^] # Re: osquery
Posté par Psychofox (Mastodon) . Évalué à 10.
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 Pierre Jarillon (site web personnel) . Évalué à 4. Dernière modification le 02 novembre 2018 à 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 philToulibre . Évalué à -10.
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 Maderios . Évalué à 2. Dernière modification le 03 novembre 2018 à 13:49.
Si l'on veut être crédible, on ne confond pas les mythes religieux avec l'Histoire.
[^] # Re: osquery
Posté par Thomas Debesse (site web personnel) . Évalué à 3.
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 barmic . Évalué à 2.
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 barmic . Évalué à 8.
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.
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…
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 Faya . Évalué à 6.
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.
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 Wenzel (site web personnel) . Évalué à 3.
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 !
[^] # Re: osquery
Posté par bunam . Évalué à 4.
J'ai retrouvé aussi le lien pour cet autre projet FIM File Integrity Manager : https://linuxfr.org/news/optimisations-et-corrections-pour-fim-1-2-3
Il ne s'occupe que des fichiers
# pourquoi pas aussi service aux outils de sécurité
Posté par lougy . Évalué à -1. Dernière modification le 06 novembre 2018 à 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…
[^] # Re: pourquoi pas aussi service aux outils de sécurité
Posté par Thierry Thomas (site web personnel, Mastodon) . Évalué à 2. Dernière modification le 07 novembre 2018 à 09:55.
D'habitude un serveur met à disposition des fichiers, il ne les emprunte pas…
[^] # Re: pourquoi pas aussi service aux outils de sécurité
Posté par Wenzel (site web personnel) . Évalué à 1.
J'ai également pensé à ce use case !
C'est pourquoi j'avais déjà intégré le calcul des checksum sur chaque inode ;)
https://github.com/Wenzel/oswatcher/blob/master/oswatcher/model.py#L28
# empreinte :o)
Posté par lougy . Évalué à 0.
empreinte alors :o)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.