
Outil portable d'acquisition de la RAM sous Linux pour la forensique et la réponse aux incidents, capturant des images compatibles LiME avec compression optionnelle et streaming à distance.
Un outil portable d'acquisition de mémoire volatile pour Linux.
AVML est un outil d'acquisition de mémoire volatile en espace utilisateur X86_64 écrit en Rust, destiné à être déployé sous forme de binaire statique. AVML peut être utilisé pour acquérir la mémoire sans connaître a priori la distribution du système d'exploitation cible ni le noyau. Aucune compilation ni empreinte sur la cible n'est nécessaire.
Si la source de mémoire n'est pas spécifiée sur la ligne de commande, AVML parcourra les sources de mémoire pour trouver une source fonctionnelle.
REMARQUE : Si la fonctionnalité du noyau kernel_lockdown est activée, AVML ne pourra pas acquérir la mémoire.
La matrice de tests des VM Azure est définie dans eng/images.txt et couvre actuellement :
avml est un binaire unique avec des sous-commandes. Chaque sous-commande est contrôlée par
une fonctionnalité Cargo afin qu'une compilation minimale n'inclue que la capacité dont vous avez besoin :
| Sous-commande | Fonctionnalité | Par défaut | Ce qu'elle fait |
|---|---|---|---|
acquire | (toujours) | oui | Capture la mémoire vers un fichier local (téléversement optionnel ensuite). |
convert | convert | oui | Convertit entre les formats AVML / LiME / brut. |
upload | upload | oui | Téléverse un fichier local via HTTP PUT ou vers Azure Block Blob. |
stream | stream | oui | Diffuse un instantané directement vers une destination, sans fichier local. |
Compilez un binaire minimal limité à l'acquisition avec cargo build --release --no-default-features.
Sur l'hôte cible :
avml acquire --compress output.lime.compressed
Sur l'hôte cible :
avml acquire output.lime
Sur un hôte sécurisé disposant des identifiants az cli, générez une URL SAS.
EXPIRY=$(date -d '1 day' '+%Y-%m-%dT%H:%MZ')
SAS_URL=$(az storage blob generate-sas --account-name ACCOUNT --container CONTAINER test.lime --full-uri --permissions c --output tsv --expiry ${EXPIRY})
Sur l'hôte cible, exécutez avml avec le jeton SAS généré.
avml acquire --sas-url ${SAS_URL} --delete output.lime
Pour les hôtes où écrire d'abord l'instantané dans un fichier local n'est pas souhaitable
(racine en lecture seule, disque limité, préoccupations de chaîne de custody forensique), utilisez
la sous-commande stream. Elle choisit la source de mémoire une fois au préalable (même
ordre de préférence que le chemin /dev/stdout d'acquire — /proc/kcore, puis
/dev/crash, puis /dev/mem ; passez --source pour la remplacer) et écrit les
octets séquentiellement vers la destination choisie. La source ne peut pas être
changée en cours de flux, il n'y a donc pas de repli automatique de source.
avml stream blob ${SAS_URL}
--sas-block-size (MiB) agit comme
un plancher ; si le minimum dérivé est plus grand, la valeur la plus grande l'emporte.--sas-block-concurrency plafonne le nombre d'appels stage_block en vol.
La RAM maximale est approximativement (concurrency + 1) * block_size.Sur l'hôte collecteur :
nc -l 9000 > snapshot.lime
Sur l'hôte cible :
avml stream tcp collector.example.com:9000
avml se connecte une fois et écrit l'instantané séquentiellement. Si la connexion tombe en cours de flux, l'instantané est interrompu ; il n'y a pas de reprise. Pas de TLS — associez-le à un tunnel SSH ou stunnel pour la confidentialité et l'intégrité si nécessaire.
avml upload put ./output.lime ${URL} # HTTP PUT
avml upload blob ./output.lime ${SAS_URL} # Azure Block Blob
Sur un hôte sécurisé disposant des identifiants az cli, procédez comme suit :
config.json contenant les informations suivantes :{
"commandToExecute": "./avml acquire --compress --sas-url <GENERATED_SAS_URL> --delete",
"fileUris": ["https://FULL.URL.TO.AVML.example.com/avml"]
}
config.json spécifiéaz vm extension set -g RESOURCE_GROUP --vm-name VM_NAME --publisher Microsoft.Azure.Extensions -n customScript --settings config.json
Sur un hôte sécurisé, générez une URL pré-signée S3 ou générez une URL pré-signée GCP.
Sur l'hôte cible, exécutez avml avec l'URL pré-signée générée.
avml acquire --url ${URL} --delete output.lime
avml convert ./compressed.lime ./uncompressed.lime
avml convert --source-format lime --format lime_compressed ./uncompressed.lime ./compressed.lime
A portable volatile memory acquisition tool for Linux
Usage: avml <COMMAND>
Commands:
acquire Acquire a memory snapshot to a local file (and optionally upload it)
convert Convert between AVML and LiME snapshot formats and a raw memory image
upload Upload an already-acquired snapshot file to remote storage
stream Stream a memory snapshot directly to remote storage, without writing it to a local file
help Print this message or the help of the given subcommand(s)
Exécutez avml <COMMAND> --help pour les options propres à chaque commande.
# Install MUSL
sudo apt-get install musl-dev musl-tools musl
# Install Rust via rustup
curl https://sh.rustup.rs -sSf | sh -s -- -y
# Add the MUSL target for Rust
rustup target add x86_64-unknown-linux-musl