Skip to content

Commit 3756701

Browse files
author
HackTricks News Bot
committed
Add content from: VECT: Ransomware by design, Wiper by accident
1 parent e554124 commit 3756701

1 file changed

Lines changed: 32 additions & 1 deletion

File tree

src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,34 @@ struct Header {
609609
- Once verified, the bot sends a `MsgType=0` body carrying the operator-defined **group string** (e.g. `android-postboot-rt`). If the group is enabled, the C2 responds with `MsgType=2 (confirm)`, after which tasking (MsgType 5–12) begins.
610610
- Supported verbs include SOCKS-style TCP/UDP proxying (residential proxy monetization), reverse shell / single command exec, file read/write, and **Mirai-compatible DDoSBody** payloads (same `AtkType`, `Duration`, `Targets[]`, `Flags[]` layout).
611611

612+
## Partial-encryption ransomware: lost stream-cipher nonces
613+
614+
Some ransomware families partially encrypt files for speed, but when they use a **stream cipher** independently on multiple chunks, **every encrypted region needs its own persisted nonce/IV**. If the sample generates a fresh nonce per chunk and overwrites the same 12-byte buffer inside the loop, then appends only the final value to disk, the previous chunks become **cryptographically unrecoverable** even if the attacker later shares the key.
615+
616+
Typical broken pattern:
617+
618+
```c
619+
for (i = 0; i < 4; i++) {
620+
randombytes_buf(nonce, 12); // same buffer reused each round
621+
crypto_stream_chacha20_ietf_xor(chunk, chunk, len, nonce, key);
622+
}
623+
write(fd, nonce, 12); // only the last nonce survives
624+
```
625+
626+
Practical triage points:
627+
- **Confirm the real primitive** instead of trusting actor claims or third-party reporting. If the binary calls `crypto_stream_chacha20_ietf_xor`, this is raw **ChaCha20-IETF** stream encryption, not AEAD.
628+
- **Check the file format**. ChaCha20-Poly1305 adds a 16-byte tag, while raw `crypto_stream_*_xor` output is only `ciphertext XOR keystream` plus whatever metadata the malware stores itself. A file ending in a single 12-byte trailer and no authentication tag is a strong sign that only one nonce was persisted.
629+
- **Map chunk offsets and sizes** from code, not CLI text. Many lockers parse `--fast` / `--secure` style options that never influence the encryption path. Verify the variables are actually read after parsing.
630+
- **Separate recoverable from destroyed regions**. Bytes outside the encrypted chunks remain plaintext; only the chunks whose exact `(key, nonce)` pair is known are decryptable. This matters for salvage, carving, and ransom-payment decisions.
631+
- **Treat CSPRNG-generated missing nonces as lost**, not derivable. If earlier nonces come from `randombytes()`, `RtlGenRandom`, `getrandom()`, or `/dev/urandom` and are not written anywhere else, they cannot be reconstructed by reversing.
632+
633+
Quick analyst workflow:
634+
1. Identify the stream/AEAD API in the binary (`crypto_stream_chacha20_ietf_xor` vs `crypto_aead_*`).
635+
2. Reconstruct the on-disk layout from code and from an encrypted sample.
636+
3. Count how many times the per-file loop generates a nonce and how many nonces are stored.
637+
4. Compare claimed operator modes with the real code paths and constants.
638+
5. Report the exact file-size threshold and which regions are permanently lost.
639+
612640
## References
613641
614642
- [Unit42 – Evolving Tactics of SLOW#TEMPEST: A Deep Dive Into Advanced Malware Techniques](https://unit42.paloaltonetworks.com/slow-tempest-malware-obfuscation/)
@@ -628,5 +656,8 @@ struct Header {
628656
- Kimwolf Android TV Botnet: ENS-Based C2 Evasion, TLS+ECDSA C2 Protocol, and Large-Scale Proxy/DDoS Operations – [blog.xlab.qianxin.com](https://blog.xlab.qianxin.com/kimwolf-botnet-en/)
629657
- [Check Point Research – GachiLoader: Defeating Node.js Malware with API Tracing](https://research.checkpoint.com/2025/gachiloader-node-js-malware-with-api-tracing/)
630658
- [Nodejs-Tracer – GitHub](https://github.com/CheckPointSW/Nodejs-Tracer)
659+
- [Check Point Research – VECT: Ransomware by design, Wiper by accident](https://research.checkpoint.com/2026/vect-ransomware-by-design-wiper-by-accident/)
660+
- [Libsodium documentation – ChaCha20 stream cipher APIs](https://doc.libsodium.org/advanced/stream_ciphers/chacha20)
661+
- [RFC 8439 – ChaCha20 and Poly1305 for IETF Protocols](https://www.rfc-editor.org/rfc/rfc8439)
631662
632-
{{#include ../../banners/hacktricks-training.md}}
663+
{{#include ../../banners/hacktricks-training.md}}

0 commit comments

Comments
 (0)