Naming convention: Repository codename is Apate. Product/idea name is Mirage. Framework implementation name is Chronos.
Program phases:
- Phase 1 (6 months): Core systems and validation (complete)
- Phase 2 (6 months): AI integration focused on improving analyst value while avoiding unnecessary complexity
Welcome to the Chronos Framework. This guide will help you build a mental model of how the system works so you can contribute effectively.
If you need to explain Chronos in under five minutes to a technical panel, use this:
Most honeypots fail for one reason: state inconsistency under adversarial interaction.
Attackers do not just run one command. They run chains of dependent actions and test whether the environment has memory:
touch /tmp/.xls /tmpcat /tmp/.xstat /tmp/.x
If any step contradicts a prior step, the deception is exposed. Traditional script-based honeypots often return plausible text, but they do not maintain a coherent filesystem state graph over time. LLM-only systems improve linguistic realism, but still break when context windows expire or when state must be updated atomically across concurrent events.
In short: the bottleneck is not language quality; the bottleneck is transactional truth.
Chronos treats deception as a systems problem, not a prompt problem.
- FUSE-backed interface: all attacker interactions become real filesystem syscalls.
- State Hypervisor (Redis + Lua): mutations are handled atomically, persisted, and auditable.
- Persona Engine (LLM): generates missing content lazily, then commits it to durable state.
- Audit-first design: relevant interactions are captured for threat analysis.
The key design move is simple: generate once, persist, and reuse consistently. This supports high apparent depth while maintaining internal coherence.
Chronos closes the realism gap at the exact layer attackers validate: operational consistency.
- It survives sequential command chaining because state is durable.
- It survives concurrency because writes are atomic.
- It scales realism because LLM output is state-committed, not ephemeral.
- It supports forensics because interactions are logged as structured events.
This means Chronos is not merely a fake shell; it is a state-consistent adversarial interaction environment.
Existing honeypots fail when attackers test continuity. Chronos solves continuity at the syscall layer using FUSE + Redis atomic state, then uses LLMs only to fill missing content that is immediately persisted. Result: realistic interaction that remains logically consistent over time, with auditability built in.
Chronos is a state-consistent deception engine.
Unlike traditional honeypots that pretend to be a server using static scripts, Chronos is a filesystem that generates itself on the fly.
- The Problem: In old honeypots, if an attacker ran
touch /tmp/aand thenls /tmp, the file wouldn't be there because the "commands" were just fake text responses. - The Solution: Chronos implements a REAL filesystem (FUSE). When an attacker runs
touch, we actually create an entry in our database. When they runls, we read from that database. It behaves exactly like Linux because it respects system calls.
Think of Chronos as a standard web app, but instead of "Users" and "Posts", we store "Inodes" and "Files".
-
The Interface (Skin):
src/chronos/interface/fuse.py- This python script pretends to be a hard drive.
- Linux sends it requests: "Read bytes 0-100 of File X".
- It translates those requests into Database lookups.
-
The Brain (Hypervisor):
src/chronos/core/state.py- The logic layer.
- "Create a file? Okay, let me check if that name is taken, allocate an ID, and save it."
-
The Memory (Redis):
docker-compose.yml->redis-store- The actual database.
- We don't store files on disk! We store them as keys in Redis.
- If you restart the container, Redis keeps the data (Persistence).
-
The Imagination (Persona Engine):
src/chronos/intelligence/- If a file doesn't exist (e.g., attacker checks
/etc/secret_password), we don't say "404 Not Found". - We ask an LLM: "What would be inside
/etc/secret_password?" - We save that result. Now the file exists forever.
- If a file doesn't exist (e.g., attacker checks
src/chronos/
├── core/ # The "Backend" Logic
│ ├── state.py # State Hypervisor (The boss)
│ ├── database.py # Redis wrapper
│ └── lua/ # Atomic scripts (prevent race conditions)
├── interface/ # The "Frontend" (FUSE)
│ └── fuse.py # Handles syscalls (read/write/mkdir)
├── intelligence/ # The "AI"
│ ├── persona.py # Manages system personalities
│ └── llm.py # Connects to OpenAI/Anthropic
└── layer0/ # The "Reflexes"
└── rust-protocol/ # High-speed packet analysis (Rust)
Command: echo "hacked" > /tmp/pwn
- OS calls
create("/tmp/pwn"). - FUSE tells State Hypervisor: "Create this file".
- Hypervisor runs a Lua Script in Redis:
- Checks if
/tmpexists. - Allocates new Inode ID (e.g.,
105). - Links
pwn-> Inode105.
- Checks if
- OS calls
write(inode=105, data="hacked"). - FUSE saves "hacked" into Redis blob storage.
Command: cat /var/log/nginx/access.log (Does not exist yet)
- OS calls
read("/var/log/nginx/access.log"). - FUSE sees the file has No Content Hash.
- FUSE calls Persona Engine.
- Persona Engine asks LLM: "Generate nginx access logs for a Ubuntu server".
- LLM returns text.
- FUSE saves text to Redis.
- FUSE returns text to Attacker.
- Next time they read it, it comes directly from Redis (Fast!).
Start everything:
make prodCheck logs (is the AI generating?):
make logsEnter the matrix (Manual Test):
make shell
cd /mnt/honeypotReset the world (Wipe DB):
make clean- Logic in Lua: If you need to change how files are created, edit
src/chronos/core/lua/atomic_create.lua. We use Lua so operations are atomic (thread-safe). - Debug Mode: If
make prodfails, trydocker compose up --build(without-d) to see startup errors immediately. - LLM Config: To use real AI, set
LLM_PROVIDER=openaiandOPENAI_API_KEY=sk-...indocker-compose.prod.yml.