TI-2026-049D โ The Version Tree
๐ Executive Summary
The libssh project has accumulated 38 CVEs across its lifetime โ from double-free vulnerabilities in 2012 to ChaCha20 heap exhaustion in 2025. The swarm's operator runs three versions simultaneously, each carrying its own subset of these vulnerabilities. This is not negligence. It is a calculation.
The three versions serve three purposes:
| Version | Released | Status | IPs | HASSH | Strategy | Success |
|---|---|---|---|---|---|---|
| 0.9.6 | Aug 2021 | EOL | 421 | f555226d | Botnet | 0.17% |
| 0.11.x | Dec 2024 | Active | 1,313 | 03a80b21 | Scanner | 0.09% |
| 0.12.0 | Mar 2025 | Current | 607 | af8223ac | Scanner | 0.11% |
The oldest version has the highest success rate. The newest has the most attempts per IP. The largest fleet sits in the middle. The version tree is not a changelog โ it is a deployment strategy.
๐ณ Part I โ The Archaeology of libssh
Before examining what the swarm's version choices reveal, we need the full CVE timeline. libssh has been publicly audited, responsibly disclosed against, and exploited for over a decade:
2012 โ The Foundation Cracks
5 CVEs: double-frees, buffer overflows, integer overflows in libssh < 0.5.3. The library's first serious audit reveals memory-safety issues characteristic of early C codebases.
2014 โ PRNG and Double-Free
CVE-2014-0017 (PRNG state shared after fork) and CVE-2014-8132 (double-free in kex). Both fixed by 0.6.4.
2016 โ DH Key Truncation
CVE-2016-0739: ephemeral DH secrets truncated to 128 bits. Fixed in 0.7.3. This affects MitM resistance โ relevant later.
October 2018 โ CVE-2018-10933 (CVSS 9.1)
The one that made libssh infamous. A vulnerability in the server-side state machine allowed malicious clients to create SSH channels without authentication. Trivially exploitable. Patched in 0.7.6 and 0.8.4.
โ ๏ธ Critical distinction: This vulnerability affects libssh servers. The swarm uses libssh as a client. CVE-2018-10933 is entirely irrelevant to the swarm's operation. Any analysis that conflates libssh's notoriety with the swarm's capabilities is making a category error.
2019 โ The libssh2 Massacre
9 CVEs in libssh2 (a separate project, not the same as libssh): integer overflows, OOB reads, buffer overflows. Note: the swarm uses libssh, not libssh2 โ these are different libraries with different codebases, different maintainers, and different HASSH fingerprints.
2020 โ AES-CTR Crash
CVE-2020-1730: AES-CTR cipher crash before handshake completion. Fixed in 0.8.9/0.9.4. The 0.9.6 fleet is NOT affected โ this was fixed before its release.
August 2021 โ libssh 0.9.6 Released
Fixes CVE-2021-3634 (buffer rekey). This is the last 0.9.x release. No patches will follow. The swarm's oldest fleet runs this exact version โ frozen in amber at the end of its branch.
May 2023 โ CVE-2023-2283 (CVSS 6.5)
Authentication bypass in pki_verify_data_signature. Affects libssh < 0.10.0 โ the 0.9.6 fleet IS vulnerable. This is the second authentication bypass in libssh's history. But unlike CVE-2018-10933, this one is client-side: it affects how the client verifies server identity. The swarm's 0.9.6 nodes do not properly verify the servers they connect to.
December 2023 โ Terrapin (CVE-2023-48795)
SSH prefix truncation attack affecting many implementations. Mitigated in libssh 0.10.6+. The 0.9.6 fleet: vulnerable. The 0.11.x fleet: mitigated. The version split creates differential exposure.
March 2025 โ libssh 0.12.0 Released
New major version. The swarm deploys it 13 months later, in April 2026 โ 24 days after first deploying 0.11.x.
JuneโJuly 2025 โ Four New CVEs
CVE-2025-5318 (CVSS 8.1, OOB read in sftp_handle), CVE-2025-5987 (CVSS 8.1, ChaCha20 heap exhaustion), CVE-2025-5351 (CVSS 6.5, key export double-free), CVE-2025-5372 (CVSS 5.0, key derivation). Fixed in 0.11.2 (July 2025). Both the 0.11.x and 0.12.0 fleets may carry these vulnerabilities if built before the fix.
๐ Part II โ Three Fingerprints, One Operator
Each libssh version negotiates SSH key exchange and ciphers in a different default order. This ordering is encoded in the HASSH fingerprint โ an MD5 hash of the client's key exchange init message. Different library version = different HASSH:
f555226d
libssh 0.9.6
421 IPs ยท Botnet
03a80b21
libssh 0.11.x
1,313 IPs ยท Scanner
af8223ac
libssh 0.12.0
607 IPs ยท Scanner
This has a direct defensive consequence. A network defender who identifies HASSH f555226d as malicious and blocks it has addressed only 18% of the swarm. The other 82% โ running different versions with different fingerprints โ passes through undetected.
This is the network-scanning equivalent of polymorphism: same payload, same operator, same targets โ but three different signatures. The cost of running three versions (deployment complexity, configuration management, multiple build pipelines) is the price of making single-fingerprint detection useless.
Detection Coverage by Version Blocking
๐ Part III โ The Operator's Own Vulnerabilities
Here is the counterintuitive finding: the swarm's version choices make the operator vulnerable, not just the targets.
CVE-2023-2283 โ Auth Bypass (Client-Side)
Affects: libssh < 0.10.0 โ 0.9.6 is vulnerable
The client doesn't properly verify server identity in pki_verify_data_signature. A defender could deploy honeypots that impersonate real SSH servers and MitM the swarm's connections โ capturing the operator's scanning credentials and command payloads.
CVE-2023-48795 โ Terrapin
Affects: Many SSH implementations โ 0.9.6 is vulnerable
SSH prefix truncation allows downgrade of connection security. A network-level attacker between the scanner and target could strip security extensions from the handshake, weakening the encryption of the scanning session.
The operator accepts these risks because:
- Patching changes the HASSH. Upgrading 0.9.6 to 0.10.x would change the fingerprint, invalidating any defender's classification of the old signature โ but also losing the established identity. The operator has decided that fingerprint stability is worth more than fixing their own MitM exposure.
- The targets are commodity SSH servers. The swarm connects to random SSH endpoints, not adversarial honeypots (usually). The probability of encountering a server that exploits CVE-2023-2283 against the scanner is low in the wild.
- The data has low per-unit value. Each compromised credential is one of thousands. Losing some to a MitM attacker doesn't threaten the operation.
๐ก๏ธ Defensive Opportunity
CVE-2023-2283 is a defender's weapon. Deploy SSH honeypots that exploit the 0.9.6 client's failure to verify server identity. When a swarm node connects, impersonate the real target server. The scanner will authenticate and execute its post-compromise commands โ but on YOUR machine, not the real target. You capture the operator's credential payloads, command sequences, and SSH keys in real time.
๐ Part IV โ What the Success Rates Reveal
The success rates are inversely correlated with version newness:
0.17%
libssh 0.9.6
24 of 14,222 attempts
33.8 attempts/IP
0.09%
libssh 0.11.x
38 of 44,341 attempts
33.8 attempts/IP
0.11%
libssh 0.12.0
28 of 26,163 attempts
43.1 attempts/IP
The oldest fleet is the most effective. Three possible explanations:
- Strategy differentiation. The 0.9.6 fleet is classified as "botnet" โ it may use more selective targeting (pre-screened vulnerable hosts). The 0.11.x and 0.12.0 fleets are "scanner" โ they spray more broadly with lower yield.
- Operational maturity. The 0.9.6 fleet has been running longest โ its target lists may have been refined through iteration. The newer fleets are still in their initial spray phase.
- The 0.12.0 anomaly. The newest fleet has 43.1 attempts per IP โ 28% more than the other two at 33.8. More attempts per node could mean more aggressive scanning parameters, different target lists, or the operator testing a new configuration.
๐งฌ Part V โ Why libssh? The Technical Case
With dozens of SSH libraries available โ OpenSSH, Paramiko (Python), Go_SSH (Go), libssh2 (C), Dropbear โ why does this operation standardize on libssh?
| Library | Language | Swarm IPs | Suitability for Mass Scanning |
|---|---|---|---|
| libssh | C | 2,341 | โญ Lightweight, embeddable, low memory, no runtime. Ideal for mass deployment on VPS nodes. |
| Go_SSH | Go | 320 | Good. Static binary, cross-compilation. But larger binary size and Go runtime overhead. |
| libssh2 | C | 288 | Similar to libssh but different API. Separate project, different maintainers. |
| Paramiko | Python | 8 | Easy to script but requires Python runtime. Higher resource cost per node. |
libssh wins on three criteria that matter for mass deployment:
- Minimal footprint. A C library with no runtime dependencies beyond libc and OpenSSL/mbedTLS. Each scanner node needs minimal RAM.
- Embeddable. libssh can be linked into a custom binary โ the operator compiles a purpose-built scanner, not a script that imports a library.
- Deterministic HASSH. Because libssh handles key exchange directly (no OS SSH client involvement), the operator controls exactly what fingerprint the scanner presents.
โ๏ธ Verdict โ The Tree Is the Strategy
- [DOCUMENTED] 38 CVEs across the libssh lineage (2012โ2025). The swarm's operator runs versions carrying at least 6 unpatched CVEs (0.9.6) and potentially 4 recent high-severity CVEs (0.11.x/0.12.0 if built before July 2025 fixes).
- [DOCUMENTED] Three simultaneous versions = three HASSH fingerprints. Blocking one removes at most 56% of the swarm. This is intentional fingerprint diversification.
- [DOCUMENTED] CVE-2018-10933 (CVSS 9.1) does NOT apply โ the swarm uses libssh as a CLIENT. The famous vulnerability is a category error when applied to this operation.
- [INFERRED] CVE-2023-2283 makes the 0.9.6 fleet's OWN connections MitM-vulnerable โ a defensive opportunity for honeypot operators to intercept the swarm.
- [INFERRED] Version choices prioritize stability and HASSH diversity over security. The operator treats CVEs as operational cost, not risk.
The version tree reveals an operator who thinks like a software engineer, not a script kiddie. Three versions are not an accident of lazy updating. They are a deployment architecture: the stable base (0.9.6), the expansion fleet (0.11.x), and the next generation (0.12.0). Each branch grows from the same root โ the library that moves โ but each has been shaped by a different operational need.
The tree is not growing randomly. The tree is being cultivated.
The next letter examines the temporal patterns โ when the swarm sleeps, when it wakes, and what the timing reveals about the operator's timezone and work schedule.
๐ Related & Coming Next
โ Prior
TI-2026-049A โ The Library That Moves
TI-2026-049B โ The Command Language
TI-2026-049C โ Eighty-Four Flags
โ Next in Series
TI-2026-049E โ "The Temporal Pattern" โ when the swarm sleeps
TI-2026-049F โ "The Census" โ statistical forensics summary
Sources: NVD (NIST) ยท Cowrie honeypot ยท HASSH fingerprints ยท libssh project ยท campaign dossiers ยท TI-2026-049A/B/C ยท TI-2026-008
Investigation: TI-2026-049D ยท 8 evidence ยท 3 actors ยท 6 findings ยท 5 connections ยท 5 infrastructure
Confidence: HIGH โ NVD CVE records + observed HASSH fingerprints + campaign statistics
Classification: TLP:WHITE