vestigia

Detect where execution depends on secrets.
git clone git://git.ppad.tech/vestigia.git
Log | Files | Refs | README | LICENSE

CHANGELOG (4578B)


      1 # Changelog
      2 
      3 - 0.2.0 (2026-10-31)
      4   * Data-independent-timing contracts: `record --contract arm-dit`
      5     or `intel-doitm`, with `--object` and `--objdump`, has the plugin
      6     fingerprint the operands of every instruction outside the ISA's
      7     contract in the objects named, as it does a division's. The
      8     tables are transcribed from the vendors' statements: Arm's A64
      9     ISA XML (2022-12), every encoding with its source registers, and
     10     Intel's list 768547 (2026-02-23).
     11   * `diff` reports such an instruction on other operands under
     12     `outside`, apart from the origins, with its text, and how many
     13     ran (vestigia/diff-v4, which also names the ISA and contract, and
     14     gives an operand origin its text where the watch list named it).
     15     Runs recorded under other contracts are refused.
     16   * `vestigia watch` writes the watch list once, for `record --watch`
     17     to read in every run of one program; `diffOf` does so.
     18   * `record` appends the guest's ISA to its dump.
     19   * `diffOf` takes a `contract`; the command finds LLVM's
     20     `llvm-objdump` through `$VESTIGIA_OBJDUMP`.
     21   * `read` resolves the objects a harness reports to the files they
     22     name, as memcheck names a frame's object, so a library reached by
     23     its soname's link has its sites placed by offset.
     24   * `record --cpu MODEL` has QEMU emulate MODEL (its -cpu), which the
     25     dump records (a `P` line); `diff` refuses runs recorded on other
     26     models and names the model in its report; `diffOf` takes `cpu`.
     27   * QEMU's AArch64 models take `crypto=off`, removing the
     28     cryptographic extension as a CPU without it reports
     29     (qemu-crypto.patch).
     30 
     31 - 0.1.0 (2026-10-22)
     32   * Initial version, with two instruments over a harness that marks
     33     its secret (`vestigia.h`, defined by `vestigia.c`, which serves
     34     a foreign function interface too and records where the loader
     35     put each object). A taint run that marked no secret is refused.
     36   * `vestigia run`: the harness under memcheck with the secret's
     37     bytes undefined, reporting each branch, address, and integer
     38     division operand computed from them (the last through a memcheck
     39     patch, `nix/memcheck-operand.patch`), each at its own
     40     instruction. `--dir` keeps a run, and `vestigia read` reports on
     41     several kept runs, or memcheck XML made elsewhere, as one
     42     (vestigia/trace-v2: each run with its command, exit, and
     43     objects; each site with the runs that reached it).
     44   * `vestigia record` and `vestigia diff`: the harness under QEMU
     45     with vestigia's plugin, its leakage trace summarised per
     46     instruction, and where runs differing only in the secret diverge
     47     (vestigia/diff-v3):
     48     * each run with how it was made, its arguments and exit status;
     49     * the origins: a branch taking its outcomes in another proportion
     50       or order, an instruction touching other addresses, and an
     51       integer division on other operands, a return never one; each
     52       with the runs alike there, the runs that never reached it, and
     53       the calls that reached it;
     54     * what ran downstream, and what every run executed, per object;
     55     * controls repeating a secret, what differs in them set apart as
     56       unsteady, and runs designed to reach particular paths, compared
     57       for control and coverage alone (`--designed`).
     58   * `record` runs an x86_64 or aarch64 harness on either host, with
     59     randomisation off (or not at all), the guest's entropy, its
     60     getrandom included, seeded, and QEMU's own allocations kept off
     61     the guest's mappings, which under load can otherwise take the
     62     room of a guest library or heap. The plugin names each
     63     instruction by its address in its object, and stops a guest that
     64     starts a second thread.
     65   * `diff` refuses runs that loaded an object at different
     66     addresses; runs of another program, or with arguments or an
     67     environment of another size, than the first run's; a control
     68     that does not repeat the first run's arguments; and a stopped
     69     guest's dump. It names sources with LLVM's addr2line.
     70   * `traceOf` and `diffOf` run either as a derivation, over a list of
     71     runs; `nix/lib.nix` holds them for any package set, with the
     72     version the command reports.
     73   * `--object` keeps a taint run's sites (`run`, `read`, and
     74     `traceOf`'s `objects`) to objects whose path contains the given
     75     text, as it keeps a differential run's origins.
     76   * The flake's probe check (`checks.<system>.probe`, on Linux) holds
     77     both instruments' reports on a known harness to what it does, and
     78     on an x86_64 host the differential one on the same harness built
     79     for aarch64.