From b431f018748c88fc1f7aa961938551ebc097724e Mon Sep 17 00:00:00 2001 From: Lucas Rayan Date: Fri, 23 Oct 2026 11:12:24 -0300 Subject: [PATCH] release: 1.3.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Versões, changelog e roadmap: atualização pelo próprio app, assinaturas Ed25519, QCOW2 e VMDK diferenciais, DMG com LZFSE, imagens de referência no CI dos três sistemas e o teste de exclusão real do XFS (que rebaixa o XFS para 🟡). Co-Authored-By: Claude Sonnet 5.5 --- CHANGELOG.md | 20 ++++++++++++++++++++ CHANGELOG.pt-BR.md | 20 ++++++++++++++++++++ Cargo.lock | 4 ++-- Cargo.toml | 2 +- ROADMAP.md | 16 +++++++++------- ROADMAP.pt-BR.md | 16 +++++++++------- apps/gui/src-tauri/Cargo.toml | 2 +- apps/gui/src-tauri/tauri.conf.json | 2 +- 8 files changed, 63 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06a8f56..0b7d209 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,26 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow SemVer. +## [1.3.0] - 2026-10-23 + +### Added +- **Update from inside the desktop app.** On startup the app asks GitHub for the release's `latest.json`; if there is a newer version, a card offers **Update now**. It downloads the package, verifies its minisign signature against the public key built into the app, installs and reopens (the AppImage is replaced in place; Windows and macOS use the installer). Installs from `.deb` or `.rpm` only show the notice. **Settings** can turn the startup check off and has a **Check now** button. The check is one HTTP request and sends nothing of yours. +- **Digital signatures (Ed25519):** `guara sign keygen | file | verify | recovery`. With a key configured, `recover` and `report` sign the manifest and the report by themselves. `guara sign recovery` checks the manifest signature and the hash of every recovered file (and refuses manifest paths that leave the folder). The signature is plain Ed25519 over a documented message, so `openssl` verifies it too. Comparing the key fingerprint (`--trust`) says whose key it is; the signed time is the local clock, not a third-party timestamp. +- **Virtual disks:** QCOW2 with a backing file, VMDK snapshots (parent by name or, in VirtualBox, by UUID; the child is refused if the parent's CID changed) and DMG with LZFSE chunks. +- **CI with real reference images** on Linux, macOS and Windows (they were skipped before), and an XFS image deleted by the real kernel generated with `sudo` on the Linux runner. +- Release pipeline: update packages are signed with a key kept in the repository's `release` environment (tags `v*` only), and `latest.json` is built in one step by `scripts/make-latest-json.py`. + +### Changed +- **XFS is now 🟡.** On a real XFS (v5, kernel deletion) the inode and extent list are wiped, so the metadata path finds nothing; the content of files with a recognizable structure comes back by carving, without name or folder. The earlier path only worked on simulated deletions. The name-and-folder test is kept `ignore`d until the journal is read. +- CI `apt` steps use cached `.deb`s, a time limit per attempt and retries (they took up to 28 minutes on a slow mirror day). +- Dependencies: `ctutils` 0.4.5 (RUSTSEC-2026-0385); new `ed25519-compact`, `lzfse_rust`, `tauri-plugin-updater`. +- The README and ROADMAP now say the update check is the only network use by default. + +### Notes +- Versions before 1.3.0 do not have the updater: from 1.2.0, replace the AppImage by hand one last time. The first update inside the app is 1.3.0 to the next release. +- Still missing: password-protected DMG, an identity check for VHD, VHDX and QCOW2 parents, third-party timestamps (RFC 3161), XFS journal reading, and APFS validation with real deletion (needs an image from a real Mac). +- CLI output remains in Portuguese. + ## [1.2.0] - 2026-10-22 ### Added diff --git a/CHANGELOG.pt-BR.md b/CHANGELOG.pt-BR.md index f36741c..19f6046 100644 --- a/CHANGELOG.pt-BR.md +++ b/CHANGELOG.pt-BR.md @@ -4,6 +4,26 @@ Formato baseado em [Keep a Changelog](https://keepachangelog.com/pt-BR/1.1.0/); versões seguem SemVer. +## [1.3.0] - 2026-10-23 + +### Adicionado +- **Atualização dentro do app desktop.** Ao abrir, o app pede ao GitHub o `latest.json` da release; havendo versão nova, um cartão oferece **Atualizar agora**. Ele baixa o pacote, confere a assinatura minisign com a chave pública embutida no app, instala e reabre (o AppImage é substituído no lugar; Windows e macOS usam o instalador). Instalações por `.deb` ou `.rpm` só mostram o aviso. **Configurações** desliga a consulta ao abrir e tem o botão **Verificar agora**. A consulta é uma requisição HTTP e não envia nada seu. +- **Assinatura digital (Ed25519):** `guara sign keygen | file | verify | recovery`. Com uma chave configurada, `recover` e `report` assinam sozinhos o manifesto e o relatório. `guara sign recovery` confere a assinatura do manifesto e o hash de cada arquivo recuperado (e recusa caminhos do manifesto que saem da pasta). É Ed25519 comum sobre uma mensagem documentada, então o `openssl` também confere. Comparar a impressão digital da chave (`--trust`) diz de quem ela é; a hora assinada é a do relógio local, não um carimbo de terceiros. +- **Discos virtuais:** QCOW2 com arquivo de apoio, snapshots de VMDK (pai por nome ou, no VirtualBox, por UUID; o filho é recusado se o CID do pai mudou) e DMG com chunks LZFSE. +- **CI com imagens de referência reais** em Linux, macOS e Windows (antes eram puladas) e uma imagem XFS apagada pelo kernel de verdade, gerada com `sudo` no runner Linux. +- Pipeline de release: os pacotes de atualização são assinados com uma chave guardada no ambiente `release` do repositório (só tags `v*`), e o `latest.json` é montado de uma vez por `scripts/make-latest-json.py`. + +### Alterado +- **O XFS passa a 🟡.** Num XFS real (v5, exclusão do kernel) o inode e a lista de extensões são zerados, então o caminho por metadados não acha nada; o conteúdo de arquivos com estrutura reconhecível volta por carving, sem nome nem pasta. O caminho anterior só funcionava na exclusão simulada. O teste de nome e pasta fica `ignore`d até o diário ser lido. +- Os passos de `apt` do CI usam `.deb` em cache, tempo limite por tentativa e nova tentativa (levavam até 28 minutos num dia de espelho lento). +- Dependências: `ctutils` 0.4.5 (RUSTSEC-2026-0385); novas `ed25519-compact`, `lzfse_rust` e `tauri-plugin-updater`. +- O README e o ROADMAP passam a dizer que a verificação de atualização é o único uso da rede por padrão. + +### Notas +- As versões anteriores à 1.3.0 não têm o atualizador: da 1.2.0, troque o AppImage à mão uma última vez. A primeira atualização dentro do app é da 1.3.0 para a próxima versão. +- Ainda faltam: DMG com senha, conferência da identidade do pai em VHD, VHDX e QCOW2, carimbo de tempo de terceiros (RFC 3161), leitura do diário do XFS e validação de APFS com exclusão real (precisa de imagem de um Mac de verdade). +- A saída da CLI continua em português. + ## [1.2.0] - 2026-10-22 ### Adicionado diff --git a/Cargo.lock b/Cargo.lock index 6ad895b..5f55a0e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -416,7 +416,7 @@ dependencies = [ [[package]] name = "guara-cli" -version = "1.2.0" +version = "1.3.0" dependencies = [ "clap", "ctrlc", @@ -429,7 +429,7 @@ dependencies = [ [[package]] name = "guara-core" -version = "1.2.0" +version = "1.3.0" dependencies = [ "aes", "argon2", diff --git a/Cargo.toml b/Cargo.toml index 5d3d682..4f9ff39 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ resolver = "2" members = ["crates/guara-core", "crates/guara-cli"] [workspace.package] -version = "1.2.0" +version = "1.3.0" edition = "2021" license = "MIT OR Apache-2.0" repository = "https://github.com/lucasrguerra/guara" diff --git a/ROADMAP.md b/ROADMAP.md index a04a565..da8e37a 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -27,10 +27,11 @@ Legend: ✅ done · 🟡 partial · 🔜 planned · 🔭 long-term idea · ⛔ o | 1.0.1 | 2026-10-20 | Documentation in English with Portuguese translations, complete English interface, screenshots, Docker image of the CLI | | 1.1.0 | 2026-10-20 | Core messages and dates in English, automated translation check, RustCrypto on digest 0.11, verified Docker device access and Superset workspaces | | 1.2.0 | 2026-10-22 | QCOW2, VMDK, VHD, VHDX and DMG virtual disks, hash-chained audit trail, PDF report, APFS free-space map | +| 1.3.0 | 2026-10-23 | Update from inside the app, Ed25519 signatures, differencing QCOW2/VMDK and LZFSE DMG, reference images tested on Linux, macOS and Windows, XFS real-deletion test | Details of each version in the [CHANGELOG](CHANGELOG.md). -## Current status (1.2.0) against what is expected from a forensic suite +## Current status (1.3.0) against what is expected from a forensic suite ### 1. File systems with metadata @@ -158,7 +159,8 @@ External validation is what makes a report accepted. Without it, Guará is good |---|---| | CLI and interface for Windows, Linux and macOS | ✅ | | CI on three systems, automatic release by tag | ✅ | -| Tests with real images on Windows and macOS (Linux only today) | 🔜 | +| Tests with real reference images on Linux, macOS and Windows | ✅ | +| Update from inside the desktop app (signed packages, one click) | ✅ | | GUI: privileged helper process instead of restarting the whole app as administrator | 🔜 | | Signed and notarized binaries | 🔜 | | Packages in package managers (winget, Homebrew, Flatpak) | 🔭 | @@ -167,17 +169,17 @@ External validation is what makes a report accepted. Without it, Guará is good No dates, in the order that makes the most sense. -**1.3: trust and custody** +**1.4: trust and custody** Trusted timestamps, XFS journal reading, APFS validation with real deletions. -**1.4: analysis** +**1.5: analysis** NSRL and hash lists, search in file content, unified timeline. -**1.5: artifacts** +**1.6: artifacts** Windows registry, browsers, EVTX and the most common messaging apps, built on the SQLite reader. -**1.6: more structure** -ReFS and Storage Spaces (once there is a reference image), the virtual-disk cases still refused (QCOW2 with a backing file, VMDK snapshots, DMG with LZFSE or a password), expanded fragmented carving. +**1.7: more structure** +ReFS and Storage Spaces (once there is a reference image), password-protected DMG, identity check of VHD, VHDX and QCOW2 parents, expanded fragmented carving. **2.0: mobile devices and validation** iTunes backups, ADB and Android backups; submission to the NIST CFTT tests. diff --git a/ROADMAP.pt-BR.md b/ROADMAP.pt-BR.md index cd209a2..b889070 100644 --- a/ROADMAP.pt-BR.md +++ b/ROADMAP.pt-BR.md @@ -27,10 +27,11 @@ Legenda: ✅ feito · 🟡 parcial · 🔜 planejado · 🔭 ideia a longo prazo | 1.0.1 | 2026-10-20 | Documentação em inglês com tradução em português, interface completa em inglês, telas, imagem Docker do terminal | | 1.1.0 | 2026-10-20 | Mensagens do núcleo e datas em inglês, verificação automática da tradução, RustCrypto em digest 0.11, acesso a dispositivo no Docker e workspaces do Superset verificados | | 1.2.0 | 2026-10-22 | Discos virtuais QCOW2, VMDK, VHD, VHDX e DMG, trilha de auditoria encadeada por hash, relatório em PDF, mapa de espaço livre do APFS | +| 1.3.0 | 2026-10-23 | Atualização pelo próprio app, assinaturas Ed25519, QCOW2/VMDK diferenciais e DMG com LZFSE, imagens de referência testadas em Linux, macOS e Windows, teste de exclusão real do XFS | Detalhes de cada versão no [CHANGELOG](CHANGELOG.pt-BR.md). -## Situação atual (1.2.0) contra o que se espera de uma suíte forense +## Situação atual (1.3.0) contra o que se espera de uma suíte forense ### 1. Sistemas de arquivos com metadados @@ -158,7 +159,8 @@ A validação externa é o que faz um laudo ser aceito. Sem ela, o Guará serve |---|---| | CLI e interface para Windows, Linux e macOS | ✅ | | CI em três sistemas, release automática por tag | ✅ | -| Testes com imagens reais em Windows e macOS (hoje só Linux) | 🔜 | +| Testes com imagens de referência reais em Linux, macOS e Windows | ✅ | +| Atualização dentro do app desktop (pacotes assinados, um clique) | ✅ | | GUI: processo auxiliar privilegiado em vez de reiniciar o app inteiro como administrador | 🔜 | | Binários assinados e notarizados | 🔜 | | Pacotes em gerenciadores (winget, Homebrew, Flatpak) | 🔭 | @@ -167,17 +169,17 @@ A validação externa é o que faz um laudo ser aceito. Sem ela, o Guará serve Sem datas, na ordem em que fazem mais sentido. -**1.3: confiança e custódia** +**1.4: confiança e custódia** Carimbo de tempo de terceiros, leitura do diário do XFS, validação de APFS com exclusões reais. -**1.4: análise** +**1.5: análise** NSRL e listas de hashes, busca em conteúdo de arquivos, linha do tempo unificada. -**1.5: artefatos** +**1.6: artefatos** Registro do Windows, navegadores, EVTX e os apps de mensagem mais comuns, apoiados no leitor de SQLite. -**1.6: mais estrutura** -ReFS e Storage Spaces (quando houver imagem de referência), os casos de disco virtual ainda recusados (QCOW2 com arquivo de apoio, snapshots de VMDK, DMG com LZFSE ou senha), carving fragmentado ampliado. +**1.7: mais estrutura** +ReFS e Storage Spaces (quando houver imagem de referência), DMG com senha, conferência da identidade do pai em VHD, VHDX e QCOW2, carving fragmentado ampliado. **2.0: dispositivos móveis e validação** Backups do iTunes, ADB e backups do Android; submissão aos testes do NIST CFTT. diff --git a/apps/gui/src-tauri/Cargo.toml b/apps/gui/src-tauri/Cargo.toml index f8b939e..127c22f 100644 --- a/apps/gui/src-tauri/Cargo.toml +++ b/apps/gui/src-tauri/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "guara-gui" description = "Guará: interface gráfica de recuperação de arquivos" -version = "1.2.0" +version = "1.3.0" edition = "2021" license = "MIT OR Apache-2.0" repository = "https://github.com/lucasrguerra/guara" diff --git a/apps/gui/src-tauri/tauri.conf.json b/apps/gui/src-tauri/tauri.conf.json index f87a7d9..cbf4ecf 100644 --- a/apps/gui/src-tauri/tauri.conf.json +++ b/apps/gui/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Guara", - "version": "1.2.0", + "version": "1.3.0", "identifier": "dev.guara.app", "build": { "frontendDist": "../ui"