Same root cause and fix as Guará: tauri-bundler's prepare_tools runs
'dd ... seek=8 conv=notrunc' on the cached linuxdeploy-x86_64 binary on
the aarch64 Gitea runner. A bash wrapper script there loses its shebang
to the dd and fails with ENOENT; a native ELF launcher survives because
bytes 8-10 of the ELF header are unused EI_PAD padding. Replace the
wrapper with a small ELF launcher compiled with cc, and cache
AppRun-x86_64 explicitly.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VAyr8d7HuAdUGB6aA5xmDD
The non-Linux stub at the bottom of the file duplicated a definition that had
no #[cfg(target_os = "linux")] of its own — it inherited none from the
unrelated #[allow] above it. Every non-Linux build (the desktop app's Windows
CI job included) failed with a duplicate-definition error and unresolved
Linux-only imports inside the always-compiled body.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Mirrors Guará's release workflow. No signing key needed here: Sabiá's updater
is the custom module in sabia-core, not the Tauri plugin.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The updater reads the latest release from Gitea. update::apply refuses to
overwrite anything but the CLI. Release workflow builds the Linux CLI;
scripts/build-gui.sh builds the Linux and Windows desktop app. Docs say Linux
and Windows only.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Notes come from the matching CHANGELOG.md section. The macOS and Windows
binaries the old release workflow built need runners this Gitea does not have.
The CI also ignores .wolf, .claude and the release files.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Linux-only runner, so the Windows and macOS legs and GitHub's audit action are
gone. The Rust toolchain, cargo registry and target directories live on the
runner's persistent toolcache volume. release.yml stays under .github and is
not run by Gitea.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Primeira versão estável: valida ponta a ponta contra hardware real (Evil
Twin PSK e Enterprise, WPS, quebra com regras/máscara, relatório) e fecha
o roadmap de 0.1.0 quase inteiro. Changelog completo em CHANGELOG.md.
- Cargo.toml (workspace + app desktop) e tauri.conf.json: 0.1.0 → 1.0.0.
- README/ROADMAP (EN+PT-BR): refletem o que de fato existe agora
(regras/máscara, .hc22000, WPS, Evil Twin, relatório), não mais "Next".
- docs/cli.md e docs/interface.md (EN+PT-BR): documentam --rules no
crack e a aba Ataques/relatório da interface.
- app.js/app.css/index.html: telas novas para Evil Twin (PSK e
Enterprise), regras de mutação/máscara na quebra de senha, WPS,
indicador de modo (monitor/gerenciado) movido para baixo do seletor de
interface, e aviso específico quando a placa não entrega captura de
verdade (ver bug de ScanSnapshot.warning no engine).
- Lista de redes/BSSIDs não reordena mais a cada poll: ordem de chegada
como critério de desempate e sinal arredondado em buckets de 4 dBm,
porque reordenar pelo sinal instantâneo fazia as linhas flutuarem de
posição debaixo do cursor a cada atualização.
- "Forçar handshake" religa a captura sozinho se ela tiver sido parada
(esperando o AP reaparecer no canal certo antes de disparar o job, e
travando o alvo numa variável local pra não perder o BSSID se o diálogo
fechar no meio da espera).
- Grid da aba Ataques trocado de CSS grid pra colunas (alvenaria): cards
com alturas muito diferentes na mesma linha deixavam buracos vazios
enormes com align-items:start.
- check-ui-i18n.mjs: ajustes de cobertura para as novas telas.
- engine.rs: expõe Evil Twin (PSK/Enterprise), crack com regras/máscara,
relatório e exportação .hc22000 pros três front-ends (CLI, servidor web
da UI, Tauri). set_monitor() agora solta a interface do NetworkManager
antes de ativar modo monitor e devolve ao desativar — sem isso o NM
reafirma a própria conexão por cima e a captura cai sozinha pouco
depois ("está em modo managed"). Evil Twin grava um arquivo de estado
em disco antes de soltar as interfaces; se o processo morrer no meio
(Ctrl+C sem handler, kill -9, queda de energia), o próximo início do
engine desfaz tudo sozinho (self_heal_eviltwin_leftovers) — sem isso as
duas interfaces ficavam presas em managed=no pro NetworkManager pra
sempre e o Wi-Fi inteiro sumia do painel do sistema. hostapd/hostapd-wpe
que morrem na hora de subir agora reportam a saída real capturada em
log, em vez de um processo "<defunct>" mudo. Novo
ScanSnapshot.warning: avisa quando a sessão roda >12s sem receber
nenhum quadro — sintoma de placa que aceita ativar modo monitor sem
entregar captura de verdade (comum em Wi-Fi interno de notebook).
- sabia-cli (main.rs/web/mod.rs) e o app desktop (Tauri main.rs) ganham
as rotas/comandos equivalentes pra tudo isso.
- report.rs: capa em página A4 cheia com o logo do Sabiá embutido (base64,
funciona offline), sumário com âncoras pra cada seção, cabeçalho/rodapé
corridos via @page margin boxes (seção atual, numeração X/Y, selo "uso
autorizado"), cards de KPI e achados com cor por severidade, tabelas
com cabeçalho/zebra consistentes — paginação em A4 continua feita pelo
Paged.js no navegador (sem depender de Chromium no servidor).
- Vendoriza paged.polyfill.min.js (MIT) — antes era carregado de fora.
- tauri.conf.json: CSP libera frame-src pro preview do relatório embutido
(iframe) no app desktop.
- eviltwin.rs: clona um AP já visto na sessão (SSID aberto) numa segunda
interface, com portal cativo pedindo a senha de novo. A senha só é
aceita se bater de verdade contra o handshake real já capturado
(CrackTarget::verify) — não é um "aceita qualquer coisa", é um oráculo
criptográfico. Exige handshake quebrável já capturado desse BSSID e
autorização explícita, mesma trilha de auditoria dos outros ataques.
- eviltwin_enterprise.rs: variante pra redes WPA2/WPA3-Enterprise
(802.1X) — nelas a credencial viaja no próprio handshake EAP
(PEAP/TTLS-MSCHAPv2), então o cliente autentica sozinho em qualquer AP
que anuncie o SSID, sem portal nem ação humana. Orquestra hostapd-wpe
(não vendorizado — é um patch no build do hostapd); gera certificado
TLS autoassinado e eap_user genérico; parser best-effort do log de
credenciais capturadas. Limitação documentada: cliente que valida a
cadeia de certificado recusa a conexão.
- analysis.rs: achados de segurança (rede aberta, sem PMF, WPS ativo,
possível evil twin real por nome duplicado) e recomendação de canal por
banda com pontuação de interferência/sobreposição.
- crack.rs: dicionário padrão trocado pra wpa-full.txt.gz (rockyou +
Probable-Wordlists top204k mesclados/deduplicados, 9,7M senhas,
comprimido e embutido via LazyLock), PBKDF2 ~640x mais rápido
(paralelização por núcleo + HMAC reaproveitado em vez de reconstruído a
cada iteração), força bruta por máscara (rules.rs::Mask, sintaxe
?d?l?u?s?a) e regras de mutação tipo hashcat (maiúscula, sufixos
numéricos/símbolos, leet simples).
- hashcat.rs: exportação de handshake/PMKID em .hc22000 (individual ou em
lote), pro hashcat de verdade em vez de só o dicionário embutido.
- wps.rs: ataque WPS PIN via reaver (binário real do
reaver-wps-fork-t6x, GPL-2, extraído em tempo de execução) e bully
quando instalado no sistema.
- assets/wordlists/LICENSE.wpa-full documenta a atribuição (CC BY-SA 4.0
do Probable-Wordlists; rockyou.txt como dado de vazamento de uso livre
consolidado em pesquisa de segurança, mesmo padrão do Kali/SecLists).
- eapol.rs: key_info/replay_counter/key_data_len liam little-endian; são
big-endian (802.1X segue ordem de rede), então handshakes reais nunca
fechavam mesmo com deauth funcionando. testutil.rs e os geradores de
quadro de teste corrigidos junto, mais um teste contra bytes de wire
reais (não só contra o próprio encoder).
- inject.rs: deauth/disassoc agora grava Sequence Control crescente por
quadro — reenviar o mesmo quadro era descartado como duplicata pelo
driver/AP depois do primeiro envio.
- dot11.rs/scan.rs: parsing de AP/cliente bem mais completo (PMF
obrigatório, WPS detalhado, fabricante por OUI, país, largura de banda,
padrão PHY, privacidade) e histórico de sinal/eventos por cliente.
- handshake.rs/ccmp.rs: deriva a Temporal Key (CCMP) quando a senha é
quebrada, o suficiente pra decifrar o tráfego em claro do par
(BSSID, estação) cujo handshake foi capturado.
- CI (Windows/macOS): imports e `parse_mac` usados só no código Linux agora
são `#[cfg(target_os = "linux")]` (e `Duration`/`Instant` também em `test`),
eliminando os unused que viravam erro com `-D warnings` fora do Linux.
- Release (RPM): `productName` passa a "Sabia" (ASCII) — o bundler de rpm
recusa o acento; janela e interface seguem exibindo "Sabiá". Igual ao Guará.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Logo oficial (sabia.png) e conjunto de ícones do app desktop.
- Interface em português e inglês: tradutor por observação do DOM, seletor
de idioma e checagem de cobertura de tradução no CI.
- CI/CD com caches (rust-cache, .deb do Tauri em cache) e pipeline de release
multiplataforma (CLI em 5 alvos + app desktop via tauri-action), templates
de issue/PR.
- Suíte de testes de integração do sabia-core (scan e2e, handshake/crack
4-way e PMKID, pcap, trilha de auditoria) — 46 testes verdes.
- Documentação completa pt/en: README, ROADMAP, SECURITY, CONTRIBUTING,
CHANGELOG e docs/ (cli, interface, arquitetura), com enquadramento de uso
autorizado.
- Correções de clippy (-D warnings) e formatação em toda a árvore.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Move a UI de crates/sabia-cli/src/web/ para apps/gui/ui/: fonte única
servida tanto pelo `sabia ui` quanto pelo app desktop.
- sabia-core::engine::Engine centraliza sessões de scan/monitor/update —
usado pelo servidor local da CLI e pelo app Tauri, sem duplicar lógica.
- apps/gui/src-tauri: app desktop Tauri 2, mesma interface, comandos IPC
espelhando a API HTTP. Pede elevação de administrador/root
automaticamente ao abrir (modo monitor e captura crua exigem):
manifesto requireAdministrator no Windows (UAC antes mesmo do app
abrir), pkexec no Linux e osascript no macOS, com reinício automático
e aviso + botão de nova tentativa na interface se for negada.
- Ícone gerado a partir do logo (apps/gui/src-tauri/icons/source.png).
- .github/workflows/ci.yml: fmt, clippy, testes (Linux/Windows/macOS),
auditoria de dependências, compilação do app desktop.
- .github/workflows/release.yml: ao empurrar uma tag vX.Y.Z, builda a
CLI (Linux x86_64/aarch64, macOS x86_64/aarch64, Windows x86_64) e o
app desktop pras mesmas plataformas, publica tudo numa release do
GitHub com checksums SHA-256.
- sabia-core::update: corrige o nome do asset esperado (casava pelo
nome fixo, mas o release empacota com a versão no nome) e a extração
(tar.gz no Linux/macOS, zip no Windows).
- LICENSE-MIT, LICENSE-APACHE, CHANGELOG.md com a entrada 0.1.0.
- cargo fmt + clippy (-D warnings) limpos em todo o workspace.
- Logo conceitual em SVG (crates/sabia-cli/src/web/sabia-logo.svg):
silhueta de pássaro construída por arcos concêntricos em duas cores
(cobre/âmbar + ciano), reinterpretando os arcos como ondas de sinal
Wi-Fi — mesma técnica de construção usada no projeto irmão, paleta
e silhueta próprias.
- Redesign completo da UI local (app.css, app.js, index.html): sidebar
translúcida com blur, cards, pills, tipografia SF Pro, linha de
sinal animada só enquanto a captura está ativa, barras de sinal por
dBm, badges de segurança por cor, dark mode automático. Validado
visualmente no Chrome headless (claro, escuro, lista de interfaces,
tabela de resultados) via MCP.
- Novas rotas /app.css, /app.js, /sabia-logo.svg, /api/version,
/api/update/check no servidor local.
Config/memória de ferramentas de IA (.claude, .wolf, .opencode, .codex,
.cursor, CLAUDE.md, AGENTS.md, GEMINI.md) não faz parte do produto e
não deve ir para o GitHub; fica só no .gitignore. README também não
cita mais o projeto irmão.
- sabia-core: descoberta de interfaces, controle de modo monitor/canal
via iw (ponte até ter nl80211 nativo), captura crua 802.11 via
AF_PACKET (sem libpcap), parsing de radiotap e quadros de
gerenciamento (beacon/probe/EAPOL), agregação em tabela de APs/
clientes, escrita de .pcap, trilha de auditoria encadeada por hash,
auto-atualização via GitHub releases (curl, sem dependências de
rede extras)
- sabia-cli: `sabia iface`, `sabia scan`, `sabia update`,
`sabia audit-verify`, `sabia ui` (servidor local + navegador,
protegido por token, mesma filosofia do Guará)
- OpenWolf inicializado para memória de projeto entre agentes