Copier de façon sûre un fichier de preuve #48
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Copier de façon sûre un fichier de preuve
Objectif
Ajouter un module indépendant capable de copier un fichier source vers l’espace des preuves originales d’une enquête, sans écrasement, sans modification du fichier source et avec vérification cryptographique après copie.
Ce module utilisera le calcul SHA-256 déjà disponible pour garantir que la copie produite est strictement identique au fichier source.
Contexte
Le module
FileHashpermet désormais de calculer :GCancellable;La prochaine étape du futur import de preuves consiste à produire une copie maîtrisée dans l’enquête.
Cette copie devra être considérée comme l’original de travail conservé par Labfy Investigation. Le fichier fourni par l’utilisateur doit rester intact.
Périmètre
Créer :
Mettre à jour le
Makefileafin de compiler le nouveau module et d’exécuter ses tests avecmake test.API attendue
Le module doit exposer un résultat opaque ou structuré contenant au minimum :
Proposition d’API :
L’API exacte peut être adaptée, mais le résultat retourné doit rester immuable pour l’appelant et propriétaire de ses chaînes.
Responsabilités du module
Le module doit :
Hors responsabilité
Le module ne doit pas :
EvidenceRecord;Validation des paramètres
La fonction doit refuser :
NULLou vide ;NULLou vide ;NULLou vide ;.ou..;/;\;GErrordéjà initialisé.Le nom fourni doit représenter uniquement un nom de fichier, jamais un chemin relatif ou absolu.
Validation du fichier source
Le fichier source doit être un fichier régulier.
Le module doit refuser :
Le contrôle ne doit pas suivre silencieusement un lien symbolique.
Le fichier source doit être ouvert en lecture seule.
Validation du dossier de destination
Le dossier de destination doit :
Le module ne doit pas créer automatiquement le dossier parent dans ce ticket.
La création de l’arborescence de l’enquête relève d’un autre composant.
Construction du chemin final
Le chemin final doit être construit avec les API GLib adaptées, jamais par concaténation fragile.
Exemple :
Le chemin final ne doit jamais sortir du dossier de destination.
Interdiction d’écrasement
Le fichier de destination doit être créé exclusivement.
Une option POSIX adaptée est attendue :
Si le fichier existe déjà :
EVIDENCE_COPY_ERROR_DESTINATION_EXISTS.Il est interdit d’utiliser une stratégie du type :
Le module ne doit jamais écraser une preuve existante.
Copie par blocs
La copie doit être réalisée progressivement.
Le fichier complet ne doit jamais être chargé en mémoire.
Une taille de bloc raisonnable peut être utilisée, par exemple :
La boucle d’écriture doit gérer les écritures partielles.
Un appel à
write()peut écrire moins d’octets que demandé. Le module doit poursuivre jusqu’à ce que tout le bloc soit écrit ou qu’une erreur survienne.Les erreurs
EINTRdoivent être gérées pour la lecture et l’écriture.Annulation
Le
GCancellableest facultatif.L’annulation doit être contrôlée :
En cas d’annulation :
NULL;EVIDENCE_COPY_ERROR_CANCELLEDest produite ;Le test d’annulation pendant la copie doit être déterministe. Un crochet compilé uniquement pour les tests peut être utilisé, sur le même principe que
FileHash.Synchronisation des données
Après la dernière écriture réussie, le contenu du fichier destination doit être synchronisé avant sa validation.
Une API comme
fsync()peut être utilisée sur le descripteur du fichier destination.Une erreur de synchronisation doit faire échouer la copie et provoquer la suppression du fichier incomplet.
La synchronisation du dossier parent n’est pas obligatoire dans ce ticket, mais peut être documentée comme amélioration future.
Vérification cryptographique
Avant la copie :
doivent être calculés avec
file_hash_compute_sha256().Après fermeture du fichier destination :
doivent être recalculés avec le même module.
La copie est valide uniquement si :
En cas de différence :
EVIDENCE_COPY_ERROR_VERIFY;Modification concurrente du fichier source
Le module doit détecter autant que raisonnablement possible une modification du fichier source pendant l’opération.
Le double calcul du hash permet déjà de détecter une différence entre :
Une stratégie acceptable consiste à calculer :
Le succès exige alors :
Cette vérification réduit le risque d’enregistrer une copie issue d’un fichier modifié pendant l’import.
Permissions du fichier destination
La copie doit recevoir des permissions restrictives.
Valeur recommandée :
Le résultat final ne doit pas hériter aveuglément de permissions trop permissives.
Ce ticket ne doit pas tenter de reproduire les permissions du fichier source.
Nettoyage en cas d’échec
Dès que la destination a été créée, toute erreur suivante doit déclencher un nettoyage.
Le nettoyage doit tenter :
Si la suppression du fichier partiel échoue, le message final doit signaler ce problème sans masquer la cause initiale.
Le module ne doit jamais retourner un résultat partiellement initialisé.
Tests obligatoires
Copie valide d’un fichier texte
Créer un fichier contenant exactement :
Vérifier :
3;Copie d’un fichier vide
Vérifier :
0;Copie binaire
Créer un fichier contenant notamment :
Vérifier l’identité exacte des octets.
Copie sur plusieurs blocs
Créer un fichier supérieur à la taille du tampon.
Vérifier :
Destination déjà existante
Créer un fichier destination avant l’appel.
Vérifier :
NULL;EVIDENCE_COPY_ERROR_DESTINATION_EXISTS;Source absente
Vérifier :
Source non régulière
Tester au minimum :
Aucune destination ne doit être créée.
Destination invalide
Tester :
.;..;/;\.Annulation avant copie
Annuler le
GCancellableavant l’appel.Vérifier :
Annulation pendant copie
Déclencher l’annulation après un nombre déterminé de blocs.
Vérifier :
Erreur d’écriture simulée
Prévoir un mécanisme de test interne permettant de simuler une erreur après une quantité déterminée d’octets écrits.
Vérifier :
Le crochet doit être compilé uniquement pour le test.
Échec de vérification simulé
Prévoir un mécanisme déterministe permettant de modifier ou corrompre la destination avant le calcul final.
Vérifier :
EVIDENCE_COPY_ERROR_VERIFY;Appels successifs
Copier plusieurs fichiers distincts avec le même module.
Vérifier qu’aucun état interne n’est conservé entre les appels.
Permissions
Vérifier que le fichier destination n’accorde pas de permissions de groupe ou aux autres utilisateurs.
Sur POSIX :
Tests de propriété du résultat
Vérifier que :
evidence_copy_result_free(NULL)est accepté ;NULLet retournent une valeur neutre ;Intégration au Makefile
Ajouter :
aux cibles de test.
La cible devra compiler au minimum :
Les crochets de test doivent être activés uniquement pour cette cible.
Critères d’acceptation
Le ticket est validé lorsque :
-std=c17 -Wall -Wextra -Werror;fsync()est utilisé avant validation ;git diff --checkne signale rien ;Commandes de validation
Test ciblé :
Valgrind :
Résultats indispensables :
Hors périmètre
Ce ticket ne doit pas encore :
EvidenceRecord;BackgroundTask.Suite prévue
Le ticket suivant orchestrera l’import transactionnel complet :
EvidenceRecord;