Renuxλ λ€μμ 리λ
μ€ νΈμ€νΈμμ λ°μνλ μμ€ν
νμλ₯Ό 컀λ μμ€μμ μ€μκ°μΌλ‘ μΊ‘μ²νκ³ , μ€μ μλ²μμ ν΅ν© λΆμΒ·μκ°ννλ λΆμ° λͺ¨λν°λ§ λꡬμ
λλ€. κ° νΈμ€νΈμ μμ£Όνλ μμ΄μ νΈ(renux)λ eBPFλ‘ μμ€ν
νΈμΆ μ§μ
μ μ μ§μ ννΉνμ¬ νμ§ μ§μ°μ 0ms μμ€μΌλ‘ μ€μμΌλ©°, μ¬μ©μ μΈ‘ μ°νκ° μ¬μ€μ λΆκ°λ₯ν©λλ€. μμ§λ νμλ TLS μμμ μ€μ λ§μ€ν°(renux_master)λ‘ νΈμλμ΄, μ΄λ²€νΈ κ°μ€μΉ λμ Β·μνλ μ§μ κ°μ Β·μλ λ²μ€νΈ κ°μ§λ₯Ό ν΅ν΄ μ λμ μν μ νΈλ‘ κ°κ³΅λ©λλ€.
μ μ₯μμλ μλ
μ κ°λ°ν V1 μ격 κ΄λ¦¬ λꡬ(server_e + client_e)λ κ·Έλλ‘ λ³΄μ‘΄λμ΄ μμΌλ©°, λμΌν 보μ μ νΈλ¦¬ν° λͺ¨λ(PBKDF2-SHA256 μνΈ ν΄μ±, OpenSSL TLS 컨ν
μ€νΈ)μ 곡μ ν©λλ€.
- eBPF κΈ°λ° μ»€λ μμ€ μΊ‘μ²:
execve,tcp_connect,openat,sched_process_forkλ€ ννΉ ν¬μΈνΈμ BPF νλ‘κ·Έλ¨μ λΆμ°©νμ¬ μ μ€νΒ·μΈλΆ TCP μ μΒ·λ―Όκ° κ²½λ‘ μ°κΈ°Β·μΉμ Έ forkλ₯Ό 0ms μ§μ°μΌλ‘ νμ§ν©λλ€..bashrcν μ΄λ inotifyμ λ¬λ¦¬ μ°ν λΆκ°ν©λλ€. - λ€μ€ μμ΄μ νΈ β λ¨μΌ λ§μ€ν° (N:1): κ° νΈμ€νΈμ
renuxμμ΄μ νΈκ° 9000λ² ν¬νΈμ λ§μ€ν°λ‘ TLS νΈμ. λ§μ€ν°λ μμ΄μ νΈλ³std::threadλ‘ λ 립 μ²λ¦¬ν©λλ€. - μνλ νκ°: μ΄λ²€νΈ μ’ λ₯λ³ κ°μ€μΉ(REVERSE_SHELL +30 / WEBSHELL +25 / ZONE_VIOLATION +15 / FILE +2 / EXEC +1)λ₯Ό λμ , 0β100 μ μμ λ°λΌ LOW/MEDIUM/HIGH/CRITICALλ‘ λΆλ₯ν©λλ€. 60μ΄λ§λ€ 0.7λ°° μ§μ κ°μ .
- μλ λ²μ€νΈ κ°μ§: 30μ΄ μ¬λΌμ΄λ© μλμ° μμ ALERT 3건 μ΄μ λ°μ μ μλ CRITICAL 격μ, μλμ° λ§λ£ μ μλ ν΄μ .
- Safe-zone λΈλ리μ€νΈ λ£°:
/etc/renux.confμDANGER_PATH/DANGER_CMD/DANGER_USERλ‘ μ¬μ΄νΈλ³ μ μ± μ μ. λ§€μΉ μZONE_VIOLATIONμλ λ°μ + μνλ +15. - μ΄μμ TUI: ncurses λΆν νλ©΄.
tmλͺ λ ΉμΌλ‘ μ΅λ 4κ° μμ΄μ νΈμ μ€μκ° λ‘κ·Έλ₯Ό λμ λͺ¨λν°λ§,[g]ν€λ‘ μ΄λ²€νΈ νμ λ³ μ΄μ§ μ€νν¬λΌμΈ κ·Έλν λͺ¨λ μ ν. - Activity Replay:
replay <ip|tag>β EXECμ νμ FILE μ΄λ²€νΈλ₯Ό κ·Έλ£Ήννμ¬ μ¬λμ΄ μ½κΈ° μ¬μ΄ νλ νμλΌμΈμΌλ‘ μ¬κ΅¬μ±. 30μ΄ μ΄μ 곡백μ--- N s gap ---ꡬλΆμ μΌλ‘ μκ°ν. - νκ·Έ μμ€ν
: IPμ μ¬λμ΄ κΈ°μ΅νκΈ° μ¬μ΄ λ³μΉ λΆμ¬ (
tag 10.0.0.11 web-01). λͺ¨λ λͺ λ ΉΒ·UI μΆλ ₯μμ μλ°©ν₯ λ³ν. - Geolocation: REVERSE_SHELL μλμ μ격 IPλ₯Ό ip-api.comμ λΉλκΈ° μ‘°ννμ¬ λμΒ·κ΅κ° μ 보λ₯Ό UIμ νμ. μ¬μ€ λμμ μλ μ€ν΅.
- TLS + μ€νλΌμΈ λ²νΌλ§: λͺ¨λ μμ΄μ νΈβλ§μ€ν° ν΅μ μ OpenSSL TLS. λ§μ€ν° μ°κ²°μ΄ λ겨λ μμ΄μ νΈκ° μ΅λ 1000κ°μ λ‘κ·Έλ₯Ό νμ 보κ΄, μ¬μ°κ²° μ μλ flush.
- PBKDF2-SHA256 μνΈ ν΄μ±: 16-byte μνΈ + 10,000ν λ°λ³΅. djb2 ν΄μλ V1 νμ νΈνμ©μΌλ‘λ§ μ μ§.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β κ΄λ¦¬ λμ νΈμ€νΈ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Kernel Space (Linux β₯ 5.8) β β
β β β’ tp/sys_enter_execve ββ β β
β β β’ kprobe/tcp_connect ββΌββΊ BPF Ring Buffer (256KB) β β
β β β’ tp/sys_enter_openat ββ€ β β
β β β’ tp/sched_process_fork ββ β β
β ββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββ β
β βΌ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β User Space β renux (monitor.cpp) β β
β β ring_buffer__poll β handle_event β check_zone β β
β β β write_agent_log β /var/log/renux.log β β
β β β send_log_to_master() (TLS, offline queue) β β
β ββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββ
β LOG|<ip>|<msg>\n (TLS, port 9000)
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β renux_master (μ€μ μλ²) β
β per-agent std::thread β log_message(): β
β β’ ALERT λΆλ₯ + μνλ κ°μ€μΉ λμ β
β β’ Alert Burst κ°μ§ (30s/3건 β CRITICAL) β
β β’ risk_decay_loop (60sλ§λ€ Γ0.7) β
β central_renux.log + agents/{ip}.log β
β ncurses TUI: list / tm / stats / replay / trace-log / ... β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| ννΉ | νμ§ μλλ¦¬μ€ | κ°μ€μΉ | μλ ν€μλ |
|---|---|---|---|
tp/syscalls/sys_enter_execve |
μ/μΈν°ν리ν°μ execve (bash, sh, nc, python3, β¦) + argv[1..4] μΊ‘μ² |
+1 | EXEC |
kprobe/tcp_connect |
μ νλ‘μΈμ€κ° μΈλΆ IPλ‘ connect() μλ (리λ²μ€ μ
Έ) |
+30 | ALERT: REVERSE_SHELL DETECTED |
tp/syscalls/sys_enter_openat |
O_WRONLY/O_RDWR/O_CREATλ‘ /etc, /root, /home/, /tmp/ μ°κΈ° μ κ·Ό |
+2 | FILE ACCESS |
tp/sched/sched_process_fork |
μΉμλ²(apache2, nginx, php-fpm, β¦) β μ fork (μΉμ Έ) | +25 | ALERT: WEBSHELL SUSPECTED |
| (μ¬μ©μ 곡κ°) | DANGER_PATH/CMD/USER λ£° λ§€μΉ |
+15 | ALERT: ZONE_VIOLATION rule=β¦ |
BPF verifier ν΅κ³Όλ₯Ό μν΄ argvλ 30λ°μ΄νΈ κ³ μ μ¬λ‘― 4κ° λ‘ λΆν μΊ‘μ², κ²½λ‘ κ²μ¬λ 256λ°μ΄νΈ 루ν λμ μ»΄νμΌ νμ λΆκΈ°λ‘ ꡬννμ΅λλ€.
- μμ΄μ νΈ (Linux νΈμ€νΈ): 컀λ 5.8+,
clang,libbpf-dev,bpftool,libssl-dev,libncurses-dev,CAP_BPF(λ³΄ν΅ root) - λ§μ€ν° (λͺ¨λ νλ«νΌ):
g++(C++17),libssl-dev,libncurses-dev - V1 (μ ν):
gcc,libncurses-dev,pthreads
git clone https://github.com/junyeong0619/Renux.git
cd Renux
# μ 체 λΉλ (V1 + V3)
make
# κ°λ³ νκ²
make server_e # V1 μλ²
make client_e # V1 ν΄λΌμ΄μΈνΈ
make renux # V3 μμ΄μ νΈ (eBPF, Linux μ μ©)
make renux_master # V3 λ§μ€ν°make renuxλ λ΄λΆμ μΌλ‘ λ€μμ μνν©λλ€.
clang -O2 -g -target bpf -D__BPF_PROGRAM__ -D__TARGET_ARCH_x86_64 \
-I monitoring/ -c monitoring/renux.bpf.c -o renux.bpf.o
bpftool gen skeleton renux.bpf.o name renux > renux.skel.h
g++ -std=c++17 -O2 monitoring/monitor.cpp utils/ssl_utils.c \
-lbpf -lssl -lcrypto -o renuxλ§μ€ν°λ /etc/renux/master.crt, /etc/renux/master.keyλ₯Ό μ¬μ©ν©λλ€. μ체 μλͺ
μΈμ¦μλ‘ μΆ©λΆν©λλ€.
sudo mkdir -p /etc/renux
sudo openssl req -x509 -newkey rsa:4096 -nodes -days 3650 \
-keyout /etc/renux/master.key -out /etc/renux/master.crt \
-subj "/CN=renux-master"
sudo chmod 600 /etc/renux/master.keysudo ./install.sh
# λλ μλ:
sudo tee /etc/renux.conf <<EOF
MASTER_IP=192.168.1.10
MASTER_PORT=9000
# Safe-zone (λΈλ리μ€νΈ) λ£° β μ ν
# DANGER_PATH=/etc
# DANGER_PATH=/root/.ssh
# DANGER_CMD=/usr/bin/passwd
# DANGER_USER=root
EOF# 1. λ§μ€ν° (μ€μ νΈμ€νΈ, 9000λ² ν¬νΈ listen)
./renux_master
# 2. μμ΄μ νΈ (κ΄λ¦¬ λμ νΈμ€νΈλ§λ€, root κΆν νμ)
sudo ./renux
# 3. (μ ν) V1 μ격 κ΄λ¦¬ λꡬ
./server_e # λ³λ νΈμ€νΈμμ, 8080 ν¬νΈ
./client_e 127.0.0.1 8080systemd μλΉμ€λ‘ λ±λ‘νλ €λ©΄ ./setup.shλ₯Ό μ€ννμΈμ.
λ§μ€ν°λ₯Ό λμ°λ©΄ ncurses λΆν TUIκ° λΉλλ€. νλ¨ μ λ ₯μ°½μμ λͺ λ Ήμ΄λ₯Ό μ λ ₯νλ©°, ν μμ±κ³Ό β/β νμ€ν 리λ₯Ό μ§μν©λλ€.
| λͺ λ Ήμ΄ | μΈμ | κΈ°λ₯ |
|---|---|---|
list |
β | μ°κ²°λ μμ΄μ νΈ λͺ©λ‘ + μνλ + λ§μ§λ§ μμ μκ° |
tm |
β | Trace Monitor β μ΅λ 4κ° μμ΄μ νΈμ λΆν λμ보λ ([g] κ·Έλν, [c] clear, [q] quit) |
stats |
[ip|tag] |
μ΄λ²€νΈ μ’ λ₯λ³ μΉ΄μ΄νΈλ₯Ό ASCII λ° μ°¨νΈλ‘ νμ |
replay |
<ip|tag> |
EXEC + FILEμ κ·Έλ£Ήνν νλ νμλΌμΈ (μ΅μ μ΄ μ, 30μ΄ μ΄μ 곡백μ gap νμ) |
trace-log |
<ip|tag> |
μμ΄μ νΈμ μ€μ λ‘κ·Έ μ 체λ₯Ό νμ€ν¬λ¦° μ€λ²λ μ΄λ‘ νμ |
trace-tr |
<H:H> |
μκ°λ ALERT νν° (μ: trace-tr 1:13) |
tag / untag / tags |
[<ip> <name>] |
IP β λ³μΉ κ΄λ¦¬ (μΈμ μμΌλ©΄ μΈν°λν°λΈ UI) |
delete-log |
<ip|tag|all> |
κΈ°κ° μ ν (1h/6h/24h/7d/30d/all) ν λ‘κ·Έ μ 리. yes μ
λ ₯ νμΈ νμ |
help |
β | λμλ§ |
exit |
β | λ§μ€ν° μ’ λ£ |
.
βββ monitoring/ # V3 λͺ¨λν°λ§ (eBPF + λ§μ€ν°)
β βββ renux.bpf.c # eBPF 컀λ νλ‘κ·Έλ¨ (4κ° ννΉ ν¬μΈνΈ)
β βββ renux_event.h # 컀λ-μ¬μ©μ 곡μ ν€λ
β βββ monitor.cpp # μμ΄μ νΈ (libbpf, TLS forwarder)
β βββ master.cpp # λ§μ€ν° (TLS accept, risk score, ncurses TUI)
β
βββ server/ # V1 κ΄λ¦¬ μλ² (legacy)
β βββ server.c # kqueue/epoll μ΄λ²€νΈ 루ν, μΈμ¦
β βββ service.c # λͺ
λ Ή μ²λ¦¬ (getu, get_proc, set_quota, β¦)
β βββ tui.c, tui.h
β
βββ client/ # V1 κ΄λ¦¬ ν΄λΌμ΄μΈνΈ (legacy)
β βββ client.c # μλ² μ μ, λ©ν°μ€λ λ UI
β βββ tui.c, tui.h
β
βββ utils/ # 곡μ λͺ¨λ
β βββ ssl_utils.c # PBKDF2-SHA256 ν΄μ±, TLS 컨ν
μ€νΈ, djb2 (legacy)
β βββ log.c # νμΌ λ‘κΉ
β βββ exec_utils.c
β
βββ agents/ # λ§μ€ν°μ μμ΄μ νΈλ³ λ‘κ·Έ (λ°νμ μμ±)
βββ docs/ # μ€κ³ λ¬Έμ
βββ install.sh / setup.sh # μλ μ€μΉ + systemd λ±λ‘
βββ Makefile / CMakeLists.txt
βββ README.md
리λ
μ€ μ»€λμ μμ νκ² μ¬μ©μ μ½λλ₯Ό μ£Όμ
νλ κΈ°μ . clang -target bpfλ‘ μ»΄νμΌνμ¬ libbpfμ skeleton μΈν°νμ΄μ€λ‘ λ‘λν©λλ€.
- λ§ λ²νΌ (
BPF_MAP_TYPE_RINGBUF): 256KB ν¬κΈ°, 컀λ β μ¬μ©μ κ³΅κ° λ¨λ°©ν₯ μ λ¬ - Verifier μ μ½ ννΌ: argvλ 30λ°μ΄νΈ κ³ μ μ¬λ‘―, κ²½λ‘ κ²μ¬λ μ»΄νμΌ νμ λΆκΈ° (256λ°μ΄νΈ 루ν λμ )
std::thread,std::mutex: μμ΄μ νΈλ³ νΈλ€λ¬, risk decay, UI, geolocation λΉλκΈ° μ€λ λμ λκΈ°νstd::map<std::string, AgentData>: μμ΄μ νΈλ³ μν μ μ₯ (λ‘κ·Έ deque, μνλ, μ΄λ²€νΈ μΉ΄μ΄ν°, μλ νμμ€ν¬ν)std::deque<std::time_t>: μ¬λΌμ΄λ© μλμ° κΈ°λ° μλ λ²μ€νΈΒ·κ·Έλνμ© μ΄λ²€νΈ νμλΌμΈ
- TLS 컨ν
μ€νΈ:
create_server_ssl_ctx()/create_client_ssl_ctx()λ‘ λ§μ€ν°Β·μμ΄μ νΈ μμͺ½ κ΅¬μ± - PBKDF2-SHA256:
hash_password_salted()β 16-byte λλ€ μνΈ + 10,000ν λ°λ³΅. μ μ₯ ν¬λ§·<32-hex-salt>:<64-hex-hash>
- λΆν νλ©΄: μλ¨ λ‘κ·Έ μ€νΈλ¦Ό + νλ¨ λͺ λ Ή μ λ ₯
- Trace Monitor: 1Β·2Β·3Β·4 ν¨λλ‘ λμ λ μ΄μμ, ALERT μνμ λ°λ₯Έ ν λ리 μμ λ³ν
- μ΄μ§ μ€νν¬λΌμΈ: κ·Έλν λͺ¨λμμ μ΄λ²€νΈ μ’
λ₯λ³λ‘
|/ 곡백 νμ
-Wall -O2 -fstack-protector-all -D_FORTIFY_SOURCE=2
-Wformat -Wformat-security
-Wl,-z,relro,-z,now (Linux μ μ©)
μλ
μ κ°λ°ν 1:N κ΄λ¦¬ μ±λμ΄ κ·Έλλ‘ λ³΄μ‘΄λμ΄ μμ΅λλ€. 8080 ν¬νΈμμ λμνλ©°, kqueue(macOS) / epoll(Linux)μ μ¬μ©νλ λ¨μΌ μ€λ λ μ΄λ²€νΈ 루ν μμμ λ€μ€ ν΄λΌμ΄μΈνΈλ₯Ό μ²λ¦¬ν©λλ€.
| λͺ λ Ή | μ€λͺ |
|---|---|
getu |
/etc/passwdμμ μ¬μ©μ λͺ©λ‘ μΆμΆ |
<user>:getinfo |
UID, GID, Home Dir λ± |
<user>:get_proc |
ν΄λΉ μ μ μ ps μΆλ ₯ |
<user>:get_quota |
λμ€ν¬ μΏΌν° μ‘°ν |
<user>:set_quota:<soft>:<hard>:<fs> |
μΏΌν° μ€μ |
get_fstab_quota_list |
usrquota νμ± FS λͺ©λ‘ |
trace <keyword> |
/var/log/renux.log κ²μ |
λ€μ€ μλ΅μ END_OF_LIST\n μΌν°λ¬λ‘ μ’
κ²°λ©λλ€. V1 μΈμ¦μ djb2 ν΄μ κΈ°λ°μ΄λ©°, μλ‘ λμ
ν PBKDF2 ν΄μλ‘μ μ μ§μ κ΅μ²΄κ° μ§ν μ€μ
λλ€.
- λ§μ€ν° ν΄λ¬μ€ν°ν: λΆμ° ν©μ(Raft λ±)λ‘ λ¨μΌ μ₯μ μ μ κ±°
- ML κΈ°λ° μ΄μ νμ§: λμ λ‘κ·Έλ₯Ό νμ΅ λ°μ΄ν°λ‘ νμ©, νΈμ€νΈλ³ νμμ λΆν¬μμμ outlier νμ§
- SBOMΒ·λ°μ΄λ리 무결μ±: μμ΄μ νΈΒ·λ§μ€ν° λ°μ΄λ리 μλͺ κ³Ό μΈ‘μ κ° λΆμ°©μΌλ‘ κ΅μ²΄Β·λ¬΄λ ₯ν μλλ¦¬μ€ λλΉ
- V1 μΈμ¦ λ§μ΄κ·Έλ μ΄μ
:
server_eμ μΈμ¦μ djb2 β PBKDF2λ‘ μμ κ΅μ²΄
docs/EBPF_IMPL.mdβ eBPF ꡬν μμΈdocs/EBPF_REPORT.mdβ eBPF λμ κ²°κ³Ό λ³΄κ³ μdocs/PLAN.mdβ V2 β V3 λ‘λλ§΅docs/REPORT.mdβ μ’ ν© λ³΄κ³ μdocs/REVIEW_ANALYSIS.mdβ μ½λ 리뷰 λΆμdocs/TEST_REPORT.mdβ ν μ€νΈ κ²°κ³Ό