Blog

Detecting Covert Exfiltration Through Kernel Signature Analysis: A Dual-Stream Network Research Lab

SecurityAnalyticsSecurityOperations

Executive Summary

In the ever-evolving landscape of cybersecurity, adversaries continuously refine their techniques to evade detection. One of the most challenging threats to detect is low-and-slow data exfiltration – attacks that deliberately mimic legitimate traffic patterns to avoid triggering security controls. This blog post presents a research methodology for distinguishing between legitimate TCP streams and covert exfiltration by analyzing Linux kernel congestion control signatures.

Through a dual-stream network research lab, we demonstrate how kernel-level TCP metrics – specifically Window Size evolution, Round Trip Time (RTT), and Packet Inter-arrival Time (IAT) – reveal telltale signatures that can identify stealth exfiltration attempts, even when they’re designed to blend in with normal traffic.

The Problem: Low-and-Slow Exfiltration

Traditional network security tools rely on volume-based detection: high data transfer rates, large file sizes, or unusual connection patterns. However, sophisticated attackers have adapted by implementing low-and-slow exfiltration techniques that:

  • Send data in small, randomized chunks (100-500 bytes)
  • Introduce randomized delays between packets (0.1-2.0 seconds)
  • Manipulate TCP socket options to interfere with kernel congestion control
  • Maintain connections for extended periods to avoid threshold-based alerts

These techniques make exfiltration traffic appear statistically similar to legitimate low-bandwidth applications, rendering traditional detection methods ineffective.

The Solution: Kernel Signature Analysis

The Linux kernel’s TCP congestion control algorithms (Cubic, BBR, etc.) manage network traffic through sophisticated mechanisms that optimize throughput based on network conditions. When applications respect these kernel-managed behaviors, they produce predictable patterns. However, when applications manually manipulate TCP socket options to bypass kernel optimizations, they create detectable anomalies.

Key Metrics for Detection

  1. TCP Window Size Evolution
  • Legitimate streams: Smooth, kernel-managed scaling based on network conditions
  • Covert streams: Irregular patterns due to manual socket manipulation
  1. Round Trip Time (RTT)
  • Legitimate streams: Consistent RTT with predictable variations
  • Covert streams: Irregular RTT patterns due to artificial delays
  1. Packet Inter-arrival Time (IAT)
  • Legitimate streams: Relatively consistent IAT (kernel-optimized)
  • Covert streams: High variance in IAT (randomized jitter)
  1. Packet Size Distribution
  • Legitimate streams: Larger, more consistent packet sizes (kernel batching)
  • Covert streams: Smaller, highly variable packet sizes (randomized chunks)

Research Lab Architecture

Our dual-stream network research lab consists of three core components:

1. Legitimate Stream Module (legit_stream.py)

This module sends files using standard TCP/HTTP methods, allowing the Linux kernel to manage window scaling naturally. It uses:

  • Standard socket operations without manual TCP option manipulation
  • Kernel-managed congestion control (Cubic/BBR)
  • Natural packet batching and window scaling
  • Standard chunk sizes (8KB default)

Expected Kernel Signature:

  • Smooth window size scaling
  • Consistent IAT patterns
  • Larger average packet sizes
  • Lower coefficient of variation in metrics

2. Stealth Exfiltration Module (stealth_exfil.py)

This module implements low-and-slow exfiltration with deliberate kernel signature evasion:

  • Randomized chunk sizes: 100-500 bytes (configurable)
  • Randomized jitter: 0.1-2.0 seconds between packets (configurable)
  • TCP socket manipulation:
    • TCP_NODELAY: Disables Nagle’s algorithm for immediate sends
    • SO_SNDBUF/SO_RCVBUF: Smaller buffer sizes (4KB) to force frequent sends
    • TCP_CORK: Toggled to interfere with kernel batching

Expected Kernel Signature:

  • Irregular window size patterns
  • High IAT variance (due to randomized jitter)
  • Smaller, variable packet sizes
  • Higher coefficient of variation in all metrics

3. Capture Analysis Module (capture_analysis.py)

This module uses pyshark to parse pcap files and extract TCP metrics for comparative analysis:

  • Extracts TCP window size evolution over time
  • Calculates RTT from packet timestamps and ACKs
  • Computes IAT between consecutive packets
  • Performs statistical analysis (mean, std dev, coefficient of variation)
  • Generates comparative reports between streams

Methodology: Running the Lab

Setup Phase

  1. Environment Preparation:

# Install dependencies

pip3 install pyshark

sudo apt-get install tshark

# Create test data

dd if=/dev/urandom of=test_file.bin bs=1024 count=1024

  1. Start Packet Capture:

sudo tcpdump -i any -w capture.pcap ‘port 8080’

  1. Start Test Server:

python3 test_server.py –host 0.0.0.0 –port 8080

Data Collection Phase

  1. Run Legitimate Transfer:

python3 legit_stream.py 127.0.0.1 8080 test_file.bin

  • Duration: ~1-2 seconds for 1MB file
  • Throughput: High (kernel-optimized)
  1. Run Stealth Exfiltration:

python3 stealth_exfil.py 127.0.0.1 8080 test_file.bin

  • Duration: ~2-5 minutes for 1MB file
  • Throughput: Low (deliberately throttled)

Analysis Phase

python3 capture_analysis.py capture.pcap –streams 0 1 –compare

Analysis Results: What the Data Reveals

Text display of kernel signature comparison with stream summaries and key differences, including packet counts, duration, throughput, average window sizes, RTT, IAT, and packet sizes for two streams. Command line interface displaying the output of a test server for a dual-stream network research lab, showing connection logs, data received, and transfer rates. Screenshot of a terminal displaying the output of a file transfer process. It shows a successful transfer of 'test_file.bin' using socket method, with details on target address, connection status, progress, total bytes, time elapsed, and average throughput. Terminal output displaying a stealth exfiltration process with target IP, file details, and progress statistics.

Key Insights

1. Inter-arrival Time (IAT) Analysis

Legitimate Stream:

  • Mean IAT: ~9.61 ms
  • Standard Deviation: 2.34 ms
  • Coefficient of Variation: 0.24 (low variance)

The kernel’s congestion control algorithm maintains relatively consistent packet spacing, optimizing for throughput while respecting network conditions.

Stealth Stream:

  • Mean IAT: ~101.02 ms
  • Standard Deviation: 58.73 ms
  • Coefficient of Variation: 0.58 (high variance)

The randomized jitter creates significant variance in packet spacing. The coefficient of variation (0.58) is more than double that of legitimate traffic (0.24), indicating deliberate timing manipulation.

Detection Implication: IAT coefficient of variation > 0.4 with mean IAT > 50ms is a strong indicator of low-and-slow exfiltration.

2. Packet Size Distribution

Legitimate Stream:

  • Average: 8192 bytes (kernel-optimized batching)
  • Low variance: Kernel batches data efficiently

Stealth Stream:

  • Average: 368 bytes (randomized 100-500 byte range)
  • High variance: Deliberate randomization prevents batching

Detection Implication: Average packet sizes < 500 bytes with high variance during sustained transfers suggest manual chunk size manipulation.

3. Throughput Analysis

Legitimate Stream:

  • 832.52 KB/s for 1MB file
  • Efficient kernel-managed transfer

Stealth Stream:

  • 3.64 KB/s for 1MB file
  • Deliberately throttled (229x slower)

Detection Implication: While throughput alone isn’t definitive (legitimate low-bandwidth apps exist), combined with other metrics, it strengthens the detection signal.

Table showing packet lengths data analyzed in Wireshark, including count, average, minimum and maximum values, rate in milliseconds, percentage, burst rate, and burst start for different length ranges.

4. Window Size Evolution

Both streams may show similar window sizes (65535 bytes), but the evolution pattern differs:

  • Legitimate: Smooth scaling up/down based on network conditions
  • Stealth: Irregular patterns due to TCP_NODELAY and manual buffer manipulation

Detection Implication: Window size variance and scaling patterns reveal kernel interference.

Graph showing window scaling data for the IP address 127.0.0.1, with window size (in bytes) plotted against time (in seconds).

Conclusion

Kernel signature analysis provides a powerful method for detecting low-and-slow exfiltration that traditional volume-based detection misses. By analyzing TCP metrics that reveal kernel congestion control interference, we can identify stealth exfiltration attempts with high confidence.

PS: Github repo for the lab -> https://github.com/Blackbird2Raven/exfil_lab

We use cookies to provide essential site functionality and, with your consent, to analyze site usage and enhance your experience. View our Privacy Policy