SecureTLμ λμ± μμ ν TLμ΄λ€.
Split Learningκ³Ό Secure Multi-Party Computation(MPC)μ κ²°ν©νμ¬ λ°μ΄ν° νλΌμ΄λ²μλ₯Ό 보μ₯νλ©΄μ νλ ₯ νμ΅μ μννλ€.
Orchestratorλ‘ λΆν° λ°μ λͺ¨λΈ Config κ²μ¦μ μν΄ WASM μλλ°μ€λ₯Ό λμ
νλ€.
λ€νΈμν¬λ₯Ό ν΅ν μλ³Έ λ°μ΄ν° μ μΆμ λ°©μ§νκΈ° μν΄ λ¦¬λ
μ€ μ»€λ κΈ°λ₯(namespace, seccomp-bpf)μ νμ©νμ¬ νλ‘μΈμ€ 격리νκ³ , κΆνμ μ μ΄νμλ€.
κΈ°μ‘΄ TL++μ λͺ¨λΈ μν€ν
μ²λ₯Ό models.pyμμ νλμ½λ©νκ³ μλ€.
Secure TLμ λͺ¨λΈ μν€ν
μ²λ₯Ό νλμ½λ©νμ§ μλλ€. JSON config νμΌ νλλ‘ λͺ¨λΈ ꡬ쑰 μ 체λ₯Ό μ μνκ³ , λ°νμμ λμ μΌλ‘ PyTorch λͺ¨λΈμ μμ±νλ€.
config/cnn_config.jsonμ λ μ΄μ΄λ₯Ό μμλλ‘ μ μνλ€.
[
{ "type": "conv2d", "args": [3, 64, 3], "kwargs": {"padding": 1} },
{ "type": "relu" },
{ "type": "maxpool2d", "args": [2, 2] },
{ "type": "flatten" },
{ "type": "linear", "args": [4096, 512] },
{ "type": "linear", "args": [512, 10] }
]TLpp/dynamic_model.pyμ LayerBuilderν΄λμ€λ λ±λ‘λ λ μ΄μ΄ νμ
(conv2d, linear, relu, lstm, transformer_encoder_layer λ±)μ args/kwargsλ‘ μΈμ€ν΄μ€ννλ€. μ½λ μμ μμ΄ configλ§ λ°κΎΈλ©΄ λ€λ₯Έ λͺ¨λΈ μν€ν
μ²λ‘ μ€νν μ μλ€.
Orchestratorκ° configλ₯Ό λ‘λν λ€ cut_layer μΈλ±μ€λ₯Ό κΈ°μ€μΌλ‘ λΆν νλ€.
config/cnn_config.json
β
βΌ
ββ node_config βββ βββ orch_config βββ
β Layer 0~4 β β Layer 5~end β
ββββββββββββββββββ βββββββββββββββββββ
β β
DynamicNodeNet DynamicOrchestratorNet
(κ° Nodeμ μ μ‘) (Orchestrator 보μ )
- Node μΈ‘:
config[:cut_layer]λ‘DynamicNodeNetμ μμ±νμ¬ λ‘컬 λ°μ΄ν°λ‘ forward pass μν - Orchestrator μΈ‘:
config[cut_layer:]λ‘ λΆλ₯ λ μ΄μ΄λ₯Ό ꡬμ±, activationμ λ°μ loss κ³μ° λ° backward pass μν
μλ³Έ λ°μ΄ν°λ Node λ°μΌλ‘ λκ°μ§ μμΌλ©°, intermediate activationλ§ μ μ‘λλ€.
Orchestratorλ‘λΆν° μμ ν config JSONμ κ·Έλλ‘ μμ§λ ¬ννλ©΄ μ μμ νμ΄λ‘λμ λ ΈμΆλ μ μλ€. μ΄λ₯Ό λ°©μ§νκΈ° μν΄ Rustλ‘ μμ±λ WebAssembly λͺ¨λλ‘ configλ₯Ό μ¬μ κ²μ¦νλ€.
Orchestrator ββ[JSON]βββΊ Node
β
βββββββΌβββββββββββ
β WASM validator β (Rust β wasm32 μ»΄νμΌ)
βββββββ¬βββββββββββ
β
κ²μ¦ ν΅κ³Ό μμλ§
λͺ¨λΈ μμ± μ§ν
Nodeλ wasmtime λ°νμ μμμ WASM λ°μ΄λ리λ₯Ό μ€ννκ³ , λ μ΄μ΄ νμ
/μΈμ ꡬ쑰λ₯Ό κ²μ¦ν λ€μλ§ λͺ¨λΈμ μμ±νλ€.
WASM λͺ¨λμ μλλ°μ€ λ΄μμ μ€νλλ―λ‘ κ²μ¦ κ³Όμ μμ²΄κ° νΈμ€νΈ μμ€ν
μ μν₯μ μ€ μ μλ€.
--isolated νλκ·Έλ₯Ό νμ±ννλ©΄ Node νλκ° 3κ°μ 격리λ νλ‘μΈμ€λ‘ λΆλ¦¬λλ€.
κ° νλ‘μΈμ€λ Linux 컀λ μμ€μμ μλ‘ λ€λ₯Έ 보μ μ μ±
μ΄ μ μ©λμ΄, ν νλ‘μΈμ€κ° μΉ¨ν΄λλλΌλ λ€λ₯Έ νλ‘μΈμ€μ λ°μ΄ν°μ μ κ·Όνκ±°λ μΈλΆλ‘ μ μΆν μ μλ€.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Node β
β β
β βββββββββββββββββββββββββ IPC (Queue) ββββββββββββββββββββββββββ β
β β DataLoader βββββββββββββββΊβ Trainer β β
β β β β β β
β β unshare(NEWNET) β β unshare(NEWNET) β β
β β seccomp: β β seccomp: β β
β β socket() ALL BLOCK β β AF_INET/AF_INET6 β β
β β execve() BLOCK β β BLOCK β β
β β β β AF_UNIX ALLOW β β
β β send as numpy array β β (for torch IPC) β β
β βββββββββββββββββββββββββ βββββββββββββ¬βββββββββββββ β
β IPC β (Queue) β
β ββββββββββββββββ΄βββββββββββββ β
β β Networker β β
β β β β
β β seccomp: β β
β β AF_INET ALLOW β β
β β other sockets BLOCK β β
β β execve() BLOCK β β
β β PR_SET_NO_NEW_PRIVS β β
β β β β
β β Orchestrator/Helper comm β β
β βββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
κ° νλ‘μΈμ€μλ λ κ³μΈ΅μ 컀λ μμ€ λ³΄μμ΄ μ μ©λλ€.
Layer 1 β Network Namespace (unshare)
unshare(CLONE_NEWUSER | CLONE_NEWNET) μμ€ν
μ½λ‘ νλ‘μΈμ€λ₯Ό λΉ λ€νΈμν¬ λ€μμ€νμ΄μ€μ λ°°μΉνλ€. λ€νΈμν¬ μΈν°νμ΄μ€(lo, eth0 λ±)κ° μ‘΄μ¬νμ§ μμΌλ―λ‘ AF_INET/AF_INET6 μμΌμΌλ‘λ μ΄λ€ μΈλΆ μ°κ²°λ μ±λ¦½ν μ μλ€. AF_UNIX μμΌμ νμΌμμ€ν
κΈ°λ°μ΄λ―λ‘ λ€μμ€νμ΄μ€ 격리 νμλ μ μ λμνλ€.
Layer 2 β Syscall νν°λ§ (seccomp-bpf)
prctl(PR_SET_SECCOMP) λ‘ BPF(Berkeley Packet Filter) νλ‘κ·Έλ¨μ μ€μΉνμ¬, νλ‘μΈμ€κ° νΈμΆν μ μλ μμ€ν
μ½ μ체λ₯Ό μ ννλ€.
νν°λ 컀λμμ μ€νλλ―λ‘ μ¬μ©μ 곡κ°μμ μ°νν μ μλ€.
| νλ‘μΈμ€ | unshare(NEWNET) | socket μ μ± | execve μ μ± | μν |
|---|---|---|---|---|
| DataLoader | O | μ 체 μ°¨λ¨ (AF_INET, AF_INET6, AF_UNIX λͺ¨λ) | μ°¨λ¨ | λ°μ΄ν° μ½κΈ° μ μ©. numpy λ°°μ΄λ‘ λ³ν ν Queue μ μ‘ |
| Trainer | O | AF_INET/AF_INET6 μ°¨λ¨, AF_UNIX νμ© | νμ© | PyTorch νμ΅. AF_UNIXλ torch IPC/CUDAμ νμ |
| Networker | X | AF_INETλ§ νμ©, λλ¨Έμ§ μ°¨λ¨ | μ°¨λ¨ | Orchestrator/Helperμμ IPv4 μμΌ ν΅μ μ λ΄ |
DataLoaderμλ κ°μ₯ μ격ν μ μ±
(DataLoaderPolicy)μ΄ μ μ©λλ€. λͺ¨λ μμΌ μμ±κ³Ό execve μμ€ν
μ½μ΄ μ°¨λ¨λμ΄, λ°μ΄ν°λ₯Ό μ½κ³ numpy λ°°μ΄λ‘ λ³ννλ κ² μΈμλ μ무 μμ
λ μνν μ μλ€. torch ν
μ 곡μ λ AF_UNIX μμΌ κΈ°λ° νμΌ λμ€ν¬λ¦½ν°λ₯Ό μ¬μ©νλ―λ‘, numpy λ°°μ΄λ‘ λ³ννμ¬ μ μ‘ν¨μΌλ‘μ¨ μμΌ μμ΄λ IPCκ° κ°λ₯νλ€.
Trainerμλ TrainerPolicyκ° μ μ©λλ€. μΈλΆ λ€νΈμν¬(AF_INET/AF_INET6)λ μ°¨λ¨νλ, torchμ multiprocessing IPCμ CUDA λλΌμ΄λ²κ° μꡬνλ AF_UNIX μμΌμ νμ©νλ€.
Networkerμλ NetworkerPolicyκ° μ μ©λλ€. Orchestrator/Helper ν΅μ μ νμν AF_INET μμΌλ§ νμ©νκ³ , AF_INET6/AF_UNIX λ± λλ¨Έμ§ μμΌ familyμ execveλ₯Ό μ°¨λ¨νλ€. IPCλ multiprocessing.Queueκ° λ΄λΆμ μΌλ‘ os.pipe()(pipe syscall)μ μ¬μ©νλ―λ‘ μμΌμ΄ λΆνμνλ€. λ€νΈμν¬ ν΅μ μ΄ ν΅μ¬ μν μ΄λ―λ‘ λ€μμ€νμ΄μ€ 격리(unshare)λ μ μ©νμ§ μλ, PR_SET_NO_NEW_PRIVSλ‘ κΆν μμΉμ λ°©μ§νλ€.
BPF νν°λ 컀λμ seccomp_data ꡬ쑰체λ₯Ό μ§μ κ²μ¬νλ λ°μ΄νΈμ½λλ‘ κ΅¬μ±λλ€.
seccomp_data {
nr (offset 0) β syscall λ²νΈ
arch (offset 4) β μν€ν
μ² (AUDIT_ARCH)
args[0] (offset 16) β 첫 λ²μ§Έ μΈμ (μ: socket family)
}
AF_INET μ°¨λ¨ νν° λμ νλ¦:
[0] μν€ν
μ² λ‘λ (AUDIT_ARCH κ²μ¦)
[1] μν€ν
μ² λΆμΌμΉ β νλ‘μΈμ€ μ’
λ£
[2] syscall λ²νΈ λ‘λ
[3] socket() μλ κ²½μ° β ALLOW
[4] args[0] (socket family) λ‘λ
[5] AF_INET β BLOCK (EPERM)
[6] AF_INET6 β BLOCK (EPERM)
[7] κ·Έ μΈ β ALLOW
seccomp νν°λ μν€ν
μ²μ λ°λΌ syscall λ²νΈκ° λ€λ₯΄λ€. ArchConfig μΆμ ν΄λμ€λ‘ μ΄λ₯Ό λΆλ¦¬νκ³ , λ°νμμ platform.machine()μΌλ‘ μλ κ°μ§νλ€.
| μν€ν μ² | AUDIT_ARCH | socket | execve | execveat |
|---|---|---|---|---|
| x86_64 | 0xC000003E |
41 | 59 | 322 |
| ARM64 (aarch64) | 0xC00000B7 |
198 | 221 | 281 |
격리λ νλ‘μΈμ€ κ° ν΅μ μ multiprocessing.Queueλ₯Ό μ¬μ©νλ€. νμ
μ΄ μ§μ λ IPCMessageλ₯Ό ν΅ν΄ λ°μ΄ν° μμ², λ°°μΉ ν λΉ, forward/backward κ²°κ³Ό λ±μ κ΅ννλ€.
TL++λ λ€μ€ κ³μΈ΅ 보μμ ν΅ν΄ λ°μ΄ν° νλΌμ΄λ²μλ₯Ό 보μ₯νλ€.
| κ³μΈ΅ | κΈ°μ | λ°©μ΄ λμ |
|---|---|---|
| λ°μ΄ν° λΆλ¦¬ | Split Learning | μλ³Έ λ°μ΄ν° λ―Έμ μ‘, activationλ§ κ΅ν |
| μνΈνμ λ³΄νΈ | Additive Secret Sharing (3-Party MPC) | activation/gradient λμ² λ°©μ§ |
| λ€νΈμν¬ κ²©λ¦¬ | Linux Network Namespace (unshare) |
νλ‘μΈμ€μ μΈλΆ λ€νΈμν¬ μ κ·Ό μ°¨λ¨ |
| μμ€ν μ½ μ ν | seccomp-BPF | μνν μμ€ν μ½ μ체λ₯Ό 컀λ μμ€μμ μ°¨λ¨ |
| κΆν μμΉ λ°©μ§ | PR_SET_NO_NEW_PRIVS |
νλ‘μΈμ€ κΆν μμΉ λΆκ° |
| Config κ²μ¦ | WebAssembly (Rust) | μμ§λ ¬ν 곡격 λ°©μ§ |
βββ TLpp/
β βββ orchestrator.py # νμ΅ μ½λλ€μ΄ν°
β βββ node.py # SecureNode / IsolatedNode
β βββ helper.py # MPC share κ΅ν μλ²
β βββ protocol.py # λ°μ΄λ리 μμΌ νλ‘ν μ½ + secret sharing
β βββ dynamic_model.py # JSON β PyTorch λͺ¨λΈ λΉλ
β βββ data.py # νμ΅ λ°μ΄ν° λ‘λ
β βββ utils.py # BatchScheduler, GradientAggregator
βββ isolation/
β βββ dataloader.py # DataLoaderProcess (격리)
β βββ trainer.py # TrainerProcess (격리)
β βββ networker.py # NetworkerProcess (격리)
β βββ common/
β βββ ipc.py # IPCChannel, IPCMessage
β βββ warden.py # seccomp-BPF νν° λΉλ/μ€μΉ
β βββ process_policy.py # νλ‘μΈμ€λ³ μλλ°μ€ μ μ±
β βββ architecture_config.py # μν€ν
μ²λ³ syscall λ²νΈ
βββ validator/
β βββ validator.py # WASM κ²μ¦κΈ° λνΌ
β βββ config_validator/ # Rust μμ€ + μ»΄νμΌλ .wasm
βββ config/
β βββ cnn_config.json # CNN λͺ¨λΈ μν€ν
μ² μ μ
βββ Dockerfile
βββ docker_manager.py
βββ gui.py # gui
βββ requirements.txt
pip install -r requirements.txt
pip install -e .μ£Όμ μμ‘΄μ±: torch, torchvision, wasmtime (WASM λ°νμ), pyseccomp
νλ«νΌλ³ λμ λ°©μ
- Linux: λ€μ΄ν°λΈ μ€ν.
unshare,seccompλ± μ»€λ κΈ°λ₯μ μ§μ μ¬μ©νλ€.- macOS / Windows: Node μ€ν μ
docker_manager.pyκ° Dockerλ₯Ό μλ κ°μ§νμ¬ Linux 컨ν μ΄λ λ΄μμ μ€ννλ€. μ΄λ―Έμ§ λΉλλ μλμΌλ‘ μ²λ¦¬λλ―λ‘, Docker Desktopμ μ€μΉνκ³ μ€νν μνμμ λμΌν λͺ λ Ήμ΄λ₯Ό μ¬μ©νλ©΄ λλ€. Orchestratorμ Helperλ λͺ¨λ νλ«νΌμμ λ€μ΄ν°λΈλ‘ μ€νλλ€.
# Orchestrator
python -m TLpp.orchestrator \
--host 192.168.0.4 --port 8080 \
--n_nodes 1
# Node (λ³λ ν°λ―Έλμμ n_nodes μλ§νΌ μ€ν)
python -m TLpp.node \
--host 192.168.0.4 --port 80803-Party MPCλ₯Ό νμ±ννμ¬ activationκ³Ό gradientλ₯Ό secret sharingμΌλ‘ 보νΈνλ€.
# Orchestrator
python -m TLpp.orchestrator \
--host [Orchestrator_IP] --port [Orchestrator_Port] \
--helper_host [Helper_IP] --helper_port [Helper_Port] \
--n_nodes [number of nodes] \
--secure
# Helper
python -m TLpp.helper \
--orch_host [Orchestrator_IP] --orch_port [Orchestrator_Port]\
--node_host [Helper_IP] --node_port [Helper_Port]\
--n_nodes [number of nodes]
# Node
python -m TLpp.node \
--orch_host [Orchestrator_IP] --orch_port [Orchestrator_Port]\
--node_host [Helper_IP] --node_port [Helper_Port]\
--secureNodeλ₯Ό 3κ°μ 격리λ νλ‘μΈμ€λ‘ λΆλ¦¬νμ¬ μ»€λ μμ€ λ³΄μμ μ μ©νλ€.
# Orchestrator + Helperλ Secure Modeμ λμΌ
# Node (--isolated μΆκ°)
python -m TLpp.node \
--orch_host [Orchestrator_IP] --orch_port [Orchestrator_Port]\
--helper_host [Helper_IP] --helper_port [Helper_Port]\
--secure \
--isolated