Add X25519 box keypair (operator.boxkey/operator.boxpub) for end-to-end
encryption of all implant->operator message Data fields via
box.SealAnonymous. Prevents eavesdropping on GossipSub traffic.
- Encrypt env.Data before signing in sendEnvelopeDirect and SignAndSend
- Build local wire envelope in sendEnvelopeDirect (avoids mutating caller's
env on send failure, preventing double-encryption on PubSub fallback)
- Serialize beacon stream writes with beaconWriteMu mutex
- Decrypt in operator handleMessage before dispatching to handlers
- Embed box pubkey in implant during arachne generate
- Generate box keys on first operator run, persist to disk
- Add stub files for development compilation
- Add SHA256 verification for Go auto-install download
- Add replay protection with time-skew validation
- Upgrade SOCKS password hashing to bcrypt
- Fix SOCKS random exit mode (pick once per listener, not per conn)
- Fix lock contention in implant sendEnvelopeDirect
- Log panics with stack traces instead of silent recover()
- Fix SOCKS5 auth downgrade when client doesn't offer method 2
- Remove TOCTOU race in port checking
- Fix Garble GOPATH parsing (use SplitList)
- Fix DHT bootstrap race (wait for >=5 peers)
- Fix Windows Go detection paths
- Fix Windows Go auto-install (.zip not .tar.gz)
- Fix Windows history persistence (defer save + MkdirAll)
- Add timeouts to all Go download HTTP requests
- Populate UUID field in beacon register
The implant was using cols=25 (received from operator's term.GetSize),
causing ConPTY to format output at 25 columns. Raising the minimum
to 80 columns ensures reasonable line widths regardless of operator
terminal size.
Matches the confirmed-working rurreac/conpty library pattern where
UpdateProcThreadAttribute receives the HPCON VALUE directly as lpValue
(uintptr(hPC)), not a pointer to it. The previous 'fix' using
unsafe.Pointer(&hPC) broke the shell entirely.
Also restore STARTF_USESTDHANDLES (matches conpty library pattern).
- --obfuscate flag on generate uses garble for symbol stripping, string
obfuscation, and package path hiding
- Auto-installs garble via 'go install mvdan.cc/garble@latest' when missing
- Works cross-platform for all OS/arch targets
- Single cmd/arachne entry point replaces server, implant, build-implant
- Implant source embedded in operator binary at build time (self-contained)
- generate command embeds unique keypair per implant build (persistent PeerID)
- cover traffic: random noise messages mask beacon timing
- regenerate command: rotate operator keys with warning
- auto-install Go when missing during generate
- liner-based CLI with command history and per-command --help
Security model required that only the operator can send commands and
only authenticated implants can communicate, but implementation had
critical gaps:
1. Implant: verify operator's Ed25519 signature on EVERY command
before dispatching (handleCommand now calls VerifyEnvelope)
2. Operator: verify implant's Ed25519 signature on EVERY beacon
and registration before processing
3. Messenger: added VerifyEnvelope() + PubKeyFromEnvelope() helpers,
trust-on-first-use per-implant key storage
4. All outgoing messages now use SignAndSend() instead of SendEnvelope
(register, ping, ps/ls/execute results are all properly signed)
5. handler callback now receives sender's crypto.PubKey for verification
6. Renamed misleading CreateSignedEnvelope -> CreateEnvelope (it was
never actually signing)