#!/usr/bin/env bash # # build-fixtures.sh — generate synthetic cpmove tarballs for testing. # # Two fixtures are built: # # cpmove-clean.tar.gz — a minimal cpmove with a benign homedir, one # wp-style SQL dump with ENGINE=MyISAM tables # and a clean siteurl, and a user-internal # relative symlink (must not trigger). # # cpmove-alfa.tar.gz — same shape PLUS an ALFA-style symlink: # `cpmove-testuser/homedir/.../alfasymlink -> /etc` # — the pre-extract scan MUST refuse this. # # Run: bash tests/build-fixtures.sh # Output: tests/fixtures/cpmove-clean.tar.gz, tests/fixtures/cpmove-alfa.tar.gz set -euo pipefail FIXTURES_DIR="$(cd "$(dirname "$0")" && pwd)/fixtures" mkdir -p "$FIXTURES_DIR" USER=testuser DOMAIN=example.com build_common_tree() { local root="$1" mkdir -p "$root/cpmove-$USER"/{homedir/public_html,mysql,userdata,addons,sds,ssl} # main userdata cat > "$root/cpmove-$USER/userdata/main" < "$root/cpmove-$USER/userdata/$DOMAIN" < "$root/cpmove-$USER/homedir/public_html/index.php" echo "Hello world." > "$root/cpmove-$USER/homedir/public_html/about.txt" # benign user-internal relative symlink — must NOT trigger the scan ln -sf "../public_html/about.txt" "$root/cpmove-$USER/homedir/about-shortcut" # one synthetic WordPress mysql dump with ENGINE=MyISAM + a clean siteurl cat > "$root/cpmove-$USER/mysql/${USER}_wp.sql" </dev/null || true' EXIT build_common_tree "$CLEAN_TMP" tar -C "$CLEAN_TMP" -czf "$FIXTURES_DIR/cpmove-clean.tar.gz" "cpmove-$USER" echo "wrote $FIXTURES_DIR/cpmove-clean.tar.gz ($(stat -c%s "$FIXTURES_DIR/cpmove-clean.tar.gz") bytes)" # ---- cpmove-alfa.tar.gz --------------------------------------------------- # # Build the SAME tree, then add an ALFA-shell-style symlink pointing at # /etc. This is the exact vector that wiped whp02 — the importer's # recursive walker followed the symlink and unlink()'d every file in # /etc. Our pre-extract scan MUST refuse to extract this tarball. ALFA_TMP="$(mktemp -d)" build_common_tree "$ALFA_TMP" mkdir -p "$ALFA_TMP/cpmove-$USER/homedir/public_html/$DOMAIN/ALFA_DATA" echo "" \ > "$ALFA_TMP/cpmove-$USER/homedir/public_html/$DOMAIN/ALFA_DATA/index.php" # THE attack: absolute-target symlink to /etc. ln -sf "/etc" "$ALFA_TMP/cpmove-$USER/homedir/public_html/$DOMAIN/ALFA_DATA/root" tar -C "$ALFA_TMP" -czf "$FIXTURES_DIR/cpmove-alfa.tar.gz" "cpmove-$USER" echo "wrote $FIXTURES_DIR/cpmove-alfa.tar.gz ($(stat -c%s "$FIXTURES_DIR/cpmove-alfa.tar.gz") bytes)" echo "" echo "fixtures built:" ls -la "$FIXTURES_DIR"