Ce référentiel implémente un outil pour vérifier que les correctifs sont assurés pour l'équivalence trace (Pate).
L'objectif est de prouver que les correctifs de sécurité appliqués aux binaires ne suppriment que les mauvais comportements, ou de les caractériser précisément pour le développeur du patch. Le vérificateur prend en charge les binaires PowerPC et Aarch32 (nécessitant actuellement des binaires ELF liés statiquement).
Le moyen le plus rapide de commencer est de construire l'image Docker et d'utiliser l'outil via Docker. Pour des instructions de construction plus approfondies, consultez la section de développement ci-dessous.
Tout d'abord, construisez l'image docker avec la commande:
docker build --platform Linux / AMD64. -T Pate
Ensuite, exécutez le vérificateur sur un exemple:
docker run --rm -it --platform linux / amd64 -v "$ (pwd)" / tests / intégration / packet / exe: / cible Pate --original /target/packet.exe --patched /target/packet.patched.exe -s parse_packet
Le vérificateur accepte les arguments de ligne de commande suivants:
-H, - Aide à montrer ce texte d'aide
-o, - Binaire original original d'origine
-p, - binaire patch
-B, - Blockinfo Nom de fichier Bloc Informations relatives aux binaires
-s, - Startymbol Arg Start Analysis de la fonction avec ce symbole
-D, - Nodiscovery ne découvre pas dynamiquement les paires de fonctions basées sur
appels.
- Solver Arg le solveur SMT à utiliser pour résoudre la vérification
conditions. L'un des CVC4, Yices ou Z3
(par défaut: yices)
- GOAL-TIMEUT ARG Le temps mort pour vérifier les objectifs individuels en quelques secondes
(par défaut: 300)
- Heuristic-Timeout Arg The Timeout pour vérifier les objectifs heuristiques en secondes
(par défaut: 10)
- Ooriginal-anvill-hents arg
Analyser une spécification Anvill pour la découverte de code
indices
- Patched-anvill-hents arg
Analyser une spécification Anvill pour la découverte de code
indices
- Ooriginal-Prorobabilistic-Ints Arg
Analyser un fichier JSON contenant une fonction probabiliste
nom / adresse
- Poatdhed-Prorobabilistic-Ints Arg
Analyser un fichier JSON contenant une fonction probabiliste
nom / adresse
- Ooriginal-CSV-Function-Wints Arg
Analyser un fichier CSV contenant le nom / l'adresse de la fonction
indices
- Patched-Csv-Function-Wints Arg
Analyser un fichier CSV contenant le nom / l'adresse de la fonction
indices
- Ooriginal-Bsi-intes Arg Parse un fichier JSON contenant le nom / l'adresse de la fonction
indices
- Patched-bsi-hents arg analyse un fichier JSON contenant le nom / l'adresse de la fonction
indices
- Les ondes de dwarf n'extraient pas les métadonnées des informations naines en
les binaires
-V, - Verbosité Arg La verbosité de la sortie de l'enregistrement (par défaut: info)
--Save-Macaw-CFGS Dir Save Macaw CFGS dans le répertoire fourni
- Fichier de fichier d'interaction du solvabilité
Économisez des interactions avec le solveur SMT pendant Symbolique
Exécution de ce fichier
- Fichier-résistant-jumelle-json
Un fichier pour enregistrer des résultats de preuve intéressants à JSON
format
- Fichier-fichier-fichier Un fichier pour enregistrer les journaux de débogage à
-e, - Mode de gestion des erreurs d'errormode Arg Verifier
(par défaut: ThrowonanyFailure)
-R, - RescOpemode Arg Variable Rescoping Faiche Maniption Mode
(par défaut: throwoneqrescopefailure)
- des fonctions de skip-noms sauter l'analyse des fonctions sans symboles
--Skip-Divergent-Control-Flow
<Déprécié>
- Target-equiv-regs arg calcule une condition d'équivalence suffisante pour
établir l'égalité sur les registres donnés après le
Renvoie le point d'entrée Toplevel. <Déprécié>
--ignore-segments arg Skip Segments (0-indexé) lors du chargement de l'elfe
--json-toplevel exécuter toplevel en mode json-sortie (mode interactif
seulement)
- Read-only-segments arg mark segments comme en lecture seule (0-indexé) lors du chargement
ELFE
- nom de fichier-script enregistrer les CFG macaw dans le répertoire fourni
--Sume-Stack-Scope Ajouter des hypothèses supplémentaires sur la portée du cadre de pile
Pendant les appels de fonction (dangereux)
--ignore-warnings arg ne soulève aucun des types d'avertissement donnés
- Always-classify-return résolvez toujours les échecs du classificateur en supposant
La fonction renvoie, si possible.
La section de démarrage rapide a décrit une commande pour exécuter le vérificateur sur un cas de test à l'aide du conteneur Docker. Cette section couvrira quelques commandes utiles pour d'autres scénarios.
Si vous avez un fichier tar d'une image Docker du vérificateur, vous pouvez l'installer à l'aide de la commande:
Docker Load -i /path/to/pate.tar
Pour exécuter le vérificateur via Docker après cela:
docker run --rm -it --platform linux / amd64 Pate --Help
Pour utiliser le vérificateur avec Docker, il est utile de cartographier un répertoire sur votre système de fichiers local dans le conteneur Docker pour pouvoir enregistrer les fichiers de sortie. En supposant que vos binaires originaux et patchés sont original.exe et patched.exe , respectivement:
Mkdir Verifierdata
cp original.exe patched.exe VerifierData /
docker run --rm -it --platform linux / amd64
-v `pwd` / verificierdata`: / vérificierdata pate
--original /verifierdata/original.exe
- Patched /VerifierData/Patched.exe
--Strong-Summary-json /VerifierData/Report.json
--Log-file /verifierdata/pate.log
--Save-Macaw-CFGS / VerifierData / CFGS
Cette commande exécutera le vérificateur sur les deux binaires et vous déposera dans une boucle de lecture-EVAL, où vous pouvez explorer de manière interactive la sortie du vérificateur.
Par défaut, le vérificateur commence à vérifier le point d'entrée du programme formel. Ce n'est souvent pas très utile (et peut être problématique pour les binaires complexes avec un grand _start qui cause un problème pour notre découverte de code). De plus, pour les changements avec une portée d'impact connue (ou du moins attendue), l'analyse uniquement des fonctions affectées est nettement plus rapide. Pour spécifier à la place un point d'entrée d'analyse, le passage de l'option -s <function_symbol> commencera l'analyse à partir de la fonction correspondant au symbole donné. Notez que cela nécessite des symboles de fonction à fournir pour les binaires (soit comme symboles de débogage intégrés, soit séparément dans l'un des formats d'indices).
Bien qu'il ne soit pas solide, il est parfois utile de traiter un appel de fonction comme un non-opération. Par exemple, l'ignorance de grandes fonctions qui n'ont pas changé et qui ne sont pas susceptibles d'avoir un effet sur l'exactitude (par exemple, les grandes fonctions cryptographiques des bibliothèques de confiance) peuvent améliorer considérablement les performances. Pour utiliser cette fonctionnalité, transmettez un fichier de configuration au vérificateur à l'aide de l'option --blockinfo , en vous assurant que le fichier de configuration comprend les directives suivantes:
Ignore-Original-Functions = [<adress>, ...] Ignore-Patched-Functions = [<adress>, ...]
où chacune des listes est une liste d'adresses des fonctions à ignorer. Bien que les deux listes soient spécifiées séparément, elles devraient presque certainement être "alignées" entre les deux binaires (c'est-à-dire, ignorer une fonction dans le binaire d'origine, cela signifie probablement que la fonction correspondante dans le binaire corrigé doit également être ignorée).
Le vérificateur bénéficie des métadonnées naines de deux manières:
Pour injecter des métadonnées naines en binaires sans lui (par exemple, binaires dépouillés), nous vous recommandons d'utiliser l'outil nain-écrivain. À titre d'exemple de l'utilisation dwarf-writer via son image Docker en supposant l'existence d'une cible ( target-binary.exe ) et des métadonnées au format Anvill JSON ( target-binary.exe.json ):
docker charge -i nain-writer-docker.tar
mkdir nwarfwriterdata
cp cible-binary.exe target-binary.exe.json nwarfwriterdata /
docker run --rm -it -v `pwd` / dwarfwriterdata: / dwarfwriterdata noutf-writer
--anvill /dwarfwriterdata/target-binary.exe.json
/DwarfwriterData/target-binary.exe
/DwarfwriterData/target-binary-dwarf.exe
Cela produira une version du binaire annoté avec des métadonnées naines dans DwarfWriterData/target-binary-dwarf.exe .
Si vous avez l'outil llvm-dwarfdump , vous pouvez l'utiliser pour inspecter les métadonnées naines générées. Le vérificateur pate profitera automatiquement des indices de métadonnées naines à moins qu'elle ne soit invitée à les ignorer.
Le vérificateur prend deux binaires comme entrée: un binaire d'origine et un binaire patch. L'hypothèse est que certains patchs axés sur la sécurité ont été appliqués au binaire d'origine qui préserve largement son comportement, mais peut corriger certains comportements indésirables. Le vérificateur tente alors de prouver que les deux binaires présentent le même comportement observable; S'il ne le peut pas, il produit un résumé différentiel qui décrit les conditions dans lesquelles le binaire corrigé présente un comportement différent de l'original. Cela permet aux développeurs de patch de comprendre l'impact de leurs correctifs sur la sémantique du programme et d'évaluer si l'impact est limité aux chemins d'exécution qu'ils voulaient.
Le vérificateur ne nécessite pas de spécifications fournies manuellement des utilisateurs; Au lieu de cela, il traite le programme d'origine comme la spécification comportementale souhaitée. Cet arrangement fait de Pate un vérificateur relationnel , car il relie le binaire corrigé à l'original. Le vérificateur est basé sur un certain nombre de bibliothèques existantes pour la découverte de code binaire et l'exécution symbolique des programmes (y compris les programmes de code machine). En gros, le vérificateur fonctionne par:
L'outil Pate est écrit dans Haskell et nécessite le compilateur GHC (nous testons avec 9.6) et l'outil de construction de Cabal pour compiler. La construction de Source peut être accomplie par:
git clone [email protected]: galoisinc / pate.git CD Pate Mise à jour du sous-module GIT - Init cp cabal.project.dist cabal.project Cabal Configurer PKG: Pate ./pate.sh - help
Le vérificateur nécessite qu'un solveur SMT soit disponible en PATH . La valeur par défaut est yices - z3 et cvc4 peuvent également fonctionner mais ne sont pas régulièrement testés avec Pate.
Ce matériel est basé sur les travaux soutenus par la Defense Advanced Research Projects Agency (DARPA) et le Naval Information Warfare Center Pacific (NIWC Pacific) sous le numéro de contrat N66001-20-C-4027. Toutes les opinions, conclusions et conclusions ou recommandations exprimés dans ce matériel sont ceux des auteurs et ne reflètent pas nécessairement les vues du Darpa & Niwc Pacific.