release: 1.3.0
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 <noreply@anthropic.com>
This commit is contained in:
1 parent
afcb0e9bf1
commit
b431f01874
8 files changed
+63
-19
No files matched your search
@@ -4,6 +4,26 @@
|
|||||||
|
|
||||||
Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow SemVer.
|
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
|
## [1.2.0] - 2026-10-22
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -4,6 +4,26 @@
|
|||||||
|
|
||||||
Formato baseado em [Keep a Changelog](https://keepachangelog.com/pt-BR/1.1.0/); versões seguem SemVer.
|
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
|
## [1.2.0] - 2026-10-22
|
||||||
|
|
||||||
### Adicionado
|
### Adicionado
|
||||||
|
|||||||
Generated
+2
-2
@@ -416,7 +416,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "guara-cli"
|
name = "guara-cli"
|
||||||
version = "1.2.0"
|
version = "1.3.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"ctrlc",
|
"ctrlc",
|
||||||
@@ -429,7 +429,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "guara-core"
|
name = "guara-core"
|
||||||
version = "1.2.0"
|
version = "1.3.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aes",
|
"aes",
|
||||||
"argon2",
|
"argon2",
|
||||||
|
|||||||
+1
-1
@@ -3,7 +3,7 @@ resolver = "2"
|
|||||||
members = ["crates/guara-core", "crates/guara-cli"]
|
members = ["crates/guara-core", "crates/guara-cli"]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
version = "1.2.0"
|
version = "1.3.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
repository = "https://github.com/lucasrguerra/guara"
|
repository = "https://github.com/lucasrguerra/guara"
|
||||||
|
|||||||
+9
-7
@@ -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.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.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.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).
|
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
|
### 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 | ✅ |
|
| CLI and interface for Windows, Linux and macOS | ✅ |
|
||||||
| CI on three systems, automatic release by tag | ✅ |
|
| 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 | 🔜 |
|
| GUI: privileged helper process instead of restarting the whole app as administrator | 🔜 |
|
||||||
| Signed and notarized binaries | 🔜 |
|
| Signed and notarized binaries | 🔜 |
|
||||||
| Packages in package managers (winget, Homebrew, Flatpak) | 🔭 |
|
| 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.
|
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.
|
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.
|
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.
|
Windows registry, browsers, EVTX and the most common messaging apps, built on the SQLite reader.
|
||||||
|
|
||||||
**1.6: more structure**
|
**1.7: 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.
|
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**
|
**2.0: mobile devices and validation**
|
||||||
iTunes backups, ADB and Android backups; submission to the NIST CFTT tests.
|
iTunes backups, ADB and Android backups; submission to the NIST CFTT tests.
|
||||||
|
|||||||
+9
-7
@@ -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.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.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.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).
|
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
|
### 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 | ✅ |
|
| CLI e interface para Windows, Linux e macOS | ✅ |
|
||||||
| CI em três sistemas, release automática por tag | ✅ |
|
| 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 | 🔜 |
|
| GUI: processo auxiliar privilegiado em vez de reiniciar o app inteiro como administrador | 🔜 |
|
||||||
| Binários assinados e notarizados | 🔜 |
|
| Binários assinados e notarizados | 🔜 |
|
||||||
| Pacotes em gerenciadores (winget, Homebrew, Flatpak) | 🔭 |
|
| 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.
|
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.
|
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.
|
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.
|
Registro do Windows, navegadores, EVTX e os apps de mensagem mais comuns, apoiados no leitor de SQLite.
|
||||||
|
|
||||||
**1.6: mais estrutura**
|
**1.7: 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.
|
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**
|
**2.0: dispositivos móveis e validação**
|
||||||
Backups do iTunes, ADB e backups do Android; submissão aos testes do NIST CFTT.
|
Backups do iTunes, ADB e backups do Android; submissão aos testes do NIST CFTT.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "guara-gui"
|
name = "guara-gui"
|
||||||
description = "Guará: interface gráfica de recuperação de arquivos"
|
description = "Guará: interface gráfica de recuperação de arquivos"
|
||||||
version = "1.2.0"
|
version = "1.3.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
repository = "https://github.com/lucasrguerra/guara"
|
repository = "https://github.com/lucasrguerra/guara"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://schema.tauri.app/config/2",
|
"$schema": "https://schema.tauri.app/config/2",
|
||||||
"productName": "Guara",
|
"productName": "Guara",
|
||||||
"version": "1.2.0",
|
"version": "1.3.0",
|
||||||
"identifier": "dev.guara.app",
|
"identifier": "dev.guara.app",
|
||||||
"build": {
|
"build": {
|
||||||
"frontendDist": "../ui"
|
"frontendDist": "../ui"
|
||||||
|
|||||||
Reference in new issue
Block a user