[DH] 환경설정

linux kernel image

커널 소스를 컴파일하여 리눅스 커널 이미지인 bzImage를 빌드하는 방법에 대해 알아보자.

리눅스 커널 이미지?

리눅스 커널을 컴파일 했을 때 생기는 이미지로, 부팅 과정에서 메모리에 로드된다. 커널 이미지 종류는 다양하지만 대표적으로 아래 두 가지가 있다.

  1. vmlinux
    압축되지 않은 리눅스 커널 실행 파일이다. ELF 형식이며 디버깅 심볼이 담겨있어서 디버깅에 용이하다.
  2. bzImage
    1번보다 더 큰 커널 이미지를 지원하기 위한 형식이다. 이는 압축된 이미지 형이며 커널을 부팅할 떄 사용한다.

이러한 커널 이미지는 커널 소스에서 make 명령을 통해 컴파일하여 생성할 수 있다.

패키지 설치 + 커널 소스 코드 다운로드

sudo apt-get install build-essential libncurses5 bin86 libncurses5-dev libssl-dev bison flex libelf-dev
mkdir ~/kernel-build && cd ~/kernel-build
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.3.9.tar.xz
tar xf linux-6.3.9.tar.xz
cd linux-6.3.9

커널 이미지 빌드

make defconfig

위 명령어는 커널 설정 파일 .config를 생성한다. 이때 아키텍처는 호스트의 아키텍처로 설정된다.

make menuconfig

위 명령을 통해 커널 옵션을 추가적으로 설정할 수 있다. 디버깅 정보를 포함하기 위해서는 Kernel hacking -> Compile-time checks and compiler options -> Generate DWARF Version 5 debuginfo 로 설정 해주어야 한다.

이후 make -jN 명령으로 커널 이미지를 빌드하는데, 이때 N은 현재 시스템의 CPU core로 설정한다.

make -j24

빌드가 완료되면 vmlinux와 arch/x86/boot/bzImage가 생성된다.

QEMU & BusyBox

해당 단락에서는 리눅스 커널 디버깅을 위한 환경 구축을 해볼 것이다.

QEMU

sudo apt install qemu-utils qemu-system-x86 qemu-kvm

위와 같이 설치 후,

$ qemu-system-x86_64 -version
QEMU emulator version 6.2.0 (Debian 1:6.2+dfsg-2ubuntu6.19)
Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers

위와 같이 뜨는지 확인하자.

qemu-system-x86_64 \
-m 4G -smp 4,cores=4,threads=1 \
-kernel ./bzImage \
-initrd  ./rootfs.cpio \
-append "root=/dev/ram rw console=ttyS0 oops=panic panic=1 quiet nopti" \
-netdev user,id=t0, -device e1000,netdev=t0,id=nic0 \
-nographic  \
-cpu host \
-enable-kvm \
-s \

위처럼 QEMU 스크립트를 실행할 수 있다.

특히 -s 옵션을 사용하면 1234 TCP 포트가 열리는데, 이 포트로 gdb 원격 디버깅이 가능하다.

BusyBox

BusyBox로 RootFS를 빌드할 수 있다. RootFS는 리눅스의 최상위 디렉토리에 마운트 되는 파일 시스템이다. 해당 루트 파일 시스템이 없으면 리눅스는 부팅될 수 없다.

RootFS 빌드

make menuconfig로 아래 두 가지를 설정해준다.

  1. Settings -> Build Options -> Build static binary 설정
  2. Networking Utilities -> inetd 해제

드림핵은 이러한데 내가 실습해볼 ksmbd에 맞게 다르게 환경 구축해볼 예정이다.

# 업데이트 + 필수 패키지
sudo apt update
sudo apt upgrade -y
sudo apt install -y build-essential libncurses-dev bison flex libssl-dev libelf-dev bc wget git \
                    qemu-system-x86 qemu-utils debootstrap gdb binutils

mkdir -p ~/kernel-build && cd ~/kernel-build
# 예시: 실제 취약 버전으로 바꿔서 wget 하자
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.x.y.tar.xz
tar xf linux-6.x.y.tar.xz
cd linux-6.x.y
# 빠른 방법: 기존 시스템 config 복사 후 menuconfig
cp /boot/config-$(uname -r) .config
make olddefconfig
make menuconfig
# menuconfig에서:
# - Enable DEBUG_INFO, FRAME_POINTER
# - 검색: ksmbd 또는 smb, SMB server 관련 항목 M/Y
#!/bin/bash
set -e
KDIR=~/kernel-build/linux-6.x.y    # 실제 경로로 바꿀 것
cd $KDIR

# 병렬 빌드 (CPU 수에 맞춰 조절)
make -j$(nproc)

# 출력: arch/x86/boot/bzImage, vmlinux (심볼)
echo "built: $KDIR/arch/x86/boot/bzImage"
echo "vmlinux: $KDIR/vmlinux"
chmod +x build-kernel.sh
./build-kernel.sh
# 이미지 크기와 마운트 포인트
IMG=~/guest-image.img
MNT=~/mnt_guest
ROOTFS=jammy    # 또는 본인이 선호하는 릴리스

# 이미지 파일 생성 (20GB 예시, 필요시 조절)
fallocate -l 20G $IMG
sudo parted $IMG --script mklabel msdos mkpart primary ext4 1MiB 100% 
# 루프장치 연결, 포맷, 마운트
LOOP=$(sudo losetup --show -Pf $IMG)
sudo mkfs.ext4 ${LOOP}p1
mkdir -p $MNT
sudo mount ${LOOP}p1 $MNT

# debootstrap으로 최소 우분투 설치 (네트워크 필요)
sudo debootstrap --arch=amd64 $ROOTFS $MNT http://archive.ubuntu.com/ubuntu/

# 최소 설정: fstab, hosts, 네트워크 설정, 계정
sudo chroot $MNT /bin/bash -c "echo 'root:root' | chpasswd"
sudo chroot $MNT /bin/bash -c "apt update && apt install -y systemd-sysv ssh"
# /etc/fstab 설정 (간단)
echo "/dev/sda1 / ext4 defaults 0 1" | sudo tee $MNT/etc/fstab

# umount & detach
sudo umount $MNT
sudo losetup -d $LOOP

echo "guest image created: $IMG"
#!/bin/bash
KERNEL=~/kernel-build/linux-6.x.y/arch/x86/boot/bzImage
ROOTIMG=~/guest-image.img
GDBPORT=1234
HOSTPORT=1445   # 호스트(=Ubuntu VM) 포트
MEM=4G
CPU=2

qemu-system-x86_64 \
  -m $MEM -smp $CPU \
  -kernel $KERNEL \
  -append "root=/dev/sda1 nokaslr console=ttyS0 earlyprintk=serial" \
  -hda $ROOTIMG \
  -netdev user,id=net0,hostfwd=tcp::${HOSTPORT}-:445 \
  -device e1000,netdev=net0 \
  -nographic \
  -s -S
gdb ~/kernel-build/linux-6.x.y/vmlinux
(gdb) target remote :1234
# 이제 중단점 설정 등 가능

Kernel Debugging

북맠

IACR 2020/312: Arcturus: efficient proofs for confidential transactions

IACR 2020/018: Triptych: logarithmic-sized linkable ring signatures with applications

MRL-0009: Thring Signatures and their Applications to Spender-Ambiguous Digital Currencies

IACR 2019/654: Concise Linkable Ring Signatures and Forgery Against Adversarial Keys

MRL-0010: Discrete Logarithm Equality Across Groups

MRL-0008: Dual Linkable Ring Signatures

MRL-0007: Sets of Spent Outputs

MRL-0006: An Efficient Implementation of Monero Subaddresses

MRL-0005: Ring Signature Confidential Transactions

MRL-0004: Improving Obfuscation in the CryptoNote Protocol

MRL-0003: Monero is Not That Mysterious

MRL-0002: Counterfeiting via Merkle Tree Exploits within Virtual Currencies Employing the CryptoNote Protocol

MRL-0001: A Note on Chain Reactions in Traceability in CryptoNote 2.0

UNPUBLISHED: Understanding ge_fromfe_frombytes_vartime

모네로(XMR)의 미래와 관련 기술/사용 사례 모네로(Monero)는 프라이버시 중심의 암호화폐로, 블록체인에서 거래를 완전히 익명화하는 기능을 강조해요. 아래에서 쿼리의 주요 부분(링 서명 작동 방식, Chainalysis 추적 사례, 현재 사용처)을 설명하고, 이를 바탕으로 한 모네로의 미래 전망을 다루겠어요. 마지막에 관련 트윗을 요약했어요. 모든 내용은 공개 자료 기반으로, 투자/정치 조언이 아니에요 – 재미로 보세요! 😄

  1. 모네로의 링 서명(Ring Signatures) 작동 방식 링 서명은 모네로의 핵심 프라이버시 기능으로, 거래 발신자(sender)를 숨기는 역할을 해요. 기본 원리:

기본 개념: 발신자가 거래를 할 때, 자신의 진짜 출력(output)을 여러 다른 출력(디코이, 보통 16개)과 섞어 “링(ring)”을 만듦. 이 링 안에서 실제 발신자가 누구인지 증명할 수 있지만, 외부 관찰자는 구분 못 해요. 이는 CryptoNote 프로토콜 기반으로, 발신자의 공개 키를 여러 키와 섞어 서명함. 작동 단계:

발신자가 블록체인에서 무작위 과거 출력들을 선택 (디코이). 자신의 키와 디코이 키를 섞어 링 서명 생성 – 수학적으로 (예: elliptic curve cryptography 사용) 모든 키가 잠재적 발신자처럼 보임. 검증자는 서명이 유효한지 확인하지만, 누가 진짜인지 모름 (1/N 확률, N=링 크기).

강점: 발신자 익명화. 모네로는 RingCT(Ring Confidential Transactions)로 금액도 숨김. 약점: 통계 분석으로 약간의 확률적 추적이 가능 (예: 빈번한 디코이 패턴). 그래서 모네로는 FCMP++(Full Chain Membership Proofs) 업그레이드로 대체 중 – 익명 세트를 전체 체인(수억 출력)으로 확대.

  1. Chainalysis의 모네로 추적 사례 Chainalysis는 블록체인 분석 회사로, 법 집행 기관과 협력해요. 모네로 추적은 어렵지만, 완벽히 불가능하지 않음:

주요 방법: 블록체인 분석이 아닌 “외부 취약점” 활용. 예: 사용자가 Chainalysis가 운영하는 스파이 노드(spy nodes)에 연결되면 IP 주소 누출. 또는 거래 패턴 분석(예: 타이밍, 금액 추정)으로 확률적 추적. 실제 사례:

2024년 유출 비디오: Chainalysis가 IRS 웹세미나에서 모네로 거래 추적 데모 – 하지만 이는 암호학 해킹이 아닌, 사용자 OPSEC(운영 보안) 실수(예: Tor 미사용) 기반. 실제 블록체인 추적률은 1% 미만으로 추정. IRS 계약(2020~2021): Chainalysis가 모네로 추적 도구 개발 시도, 하지만 성공 증거 없음. Chainalysis는 “모네로 추적 서비스 미제공” 공식 확인.

한계: 모네로의 링 서명 + 스텔스 주소 + 기밀 거래로 인해 결정적(deterministic) 추적 불가. FCMP++ 도입으로 더 어려워질 전망.

  1. 현재 사용처: 다크넷 마켓, 테러리스트, CIA 음모론 모네로는 프라이버시 때문에 다양한 용도로 쓰임. 합법(개인 프라이버시 보호)부터 불법까지:

다크넷 마켓: 알파베이(AlphaBay) 등에서 주요 결제 수단. 2017년부터 비트코인 대신 모네로 선호 – 추적 어려움. Operation RapTor(2025)에서 다크넷 약물 판매자 체포 시 모네로 압수 사례 다수. 테러리스트: ISKP(Islamic State Khorasan Province) 등 지하디스트 그룹이 자금 조달에 사용. 2024 보고서: 모네로가 “테러 자금”으로 증가 – pseudonymity 때문. 하지만 전체 규모는 작음 (연 100만 달러 미만 추정).
CIA 음모론: 직접 증거 없지만, 커뮤니티에서 “CIA가 모네로를 비밀리에 지원/통제” 이론 유행. 예: CIA가 프라이버시 코인을 “허니팟”으로 사용해 테러/범죄자 유인 후 추적한다는 주장. 하지만 이는 음모론 – 모네로 개발은 오픈소스, CIA 연계 증거 없음. 다크웹 보고서에서 CIA가 다크넷 모니터링하지만, 모네로 자체는 중립.

  1. 모네로의 미래 전망

긍정적: FCMP++ 업그레이드(2025 말 예정)로 익명 세트 확대, quantum-resistant 강화. 채택 증가(다크넷 외 개인 프라이버시 용도). 해시레이트 안정화와 커뮤니티 지원으로 장기 생존 가능. 위협: 규제 압력(거래소 상폐, 예: Binance/EU 2024~2025), 51% 공격 시도(정부 후원 의심), Chainalysis 같은 분석 도구 진화. 중앙화 마이닝 풀(35% 해시레이트) 문제로 경제적 공격 우려. 하지만 프라이버시 수요로 인해 “디지털 캐시” 역할 지속 예상.

관련 트윗 요약 2025년 1~10월 포스트 중 쿼리와 맞는 10개 골랐어요. (인기/최신순 정렬, 신빙성 평가 추가. 전체 트렌드: FCMP++ 미래 논의 활발, Chainalysis 반박, 다크넷/테러 사용 언급, 음모론 섞임.)

#작성자 & 날짜내용 요약신빙성 & 연결 주제1@cryptonator1337 2025.05.27 Likes: 274FCMP++ 업그레이드 소개: 링 서명 대체로 익명 세트 1억+ 확대, 추적 불가능.높음: 모네로 공식 개발 기반. 미래/링 서명.2@BullNakedCrypto 2025.08.10 Likes: 28951% 공격이 정부(정부 바운티 $600k) 후원, Chainalysis 연루 의심.중간: 음모론 강함, 하지만 UN/FBI 보고서와 연결. 미래/추적/음모.3@johnfoss69 2025.10.10 Likes: 28Chainalysis 2024 유출: IP 누출 추적, 암호학 아님. FCMP++로 무효화.높음: Chainalysis 자료 기반. 추적 사례/미래.4@sethforprivacy 2025.02.23 Likes: 363Bybit 해커(국가 후원)가 모네로 안 씀 – 유동성 우선. 정부가 모네로 on/off-ramp 차단.높음: 전문가 분석. 사용처(테러/국가 행위자)/추적.5@johnfoss69 2025.10.10 Likes: 25IRS $625k 계약 실패: Chainalysis 모네로 뚫지 못함.높음: IRS 공식. 추적 사례.6@ddadybayo 2025.07.27 Likes: 1549모네로 경제적 공격: 마이너 인센티브로 프라이버시 사기.중간: 커뮤니티 논의. 미래/공격.7@DontTraceMeBruh 2025.10.10 Likes: 13링 서명 약점 인정하지만, 전체 스택(스텔스 주소 등) 강함. FCMP++ 미래-proof.높음: 기술 설명. 링 서명/추적/미래.8@DontTraceMeBruh 2025.08.12 Likes: 401모네로 공격(상폐, Chainalysis) 후 가격 상승. 중앙화 풀 문제 비꼬음.중간: 풍자적. 미래/추적/사용처.9@nextiscrypto 2025.10.14 Likes: 0링 서명 취약: 퀀텀 공격/링크 가능성. 체인 전체 크랙 가능.낮음: Zcash 홍보 의심. 링 서명/미래.10@nextiscrypto 2025.10.14 Likes: 0(위와 유사) 링 서명 footprint 취약.낮음: 반복 음모. 링 서명/추적.

  1. Zero to Monero – First Edition

저자: K. Alonso

링크: [getmonero.org/library/Zero-to-Monero-1-0-0.pdf]​

내용: 모네로의 암호학적 기반을 수학적으로 설명한 기초 교재로, 유한체 위의 타원곡선 암호(Elliptic Curve Cryptography)와 CryptoNote 프로토콜의 수학 모델을 상세히 다룸.

특징:

Twisted Edwards Curve의 모듈러 연산 기반 공식 유도

서명 검증식을 대수적으로 해석

“링서명(Ring Signature)”이 어떻게 군론적 구조와 연관되는지를 증명

  1. Ring Confidential Transactions (MRL-0005)

저자: Shen Noether, Monero Research Lab, 2016

링크: [getmonero.org/es/resources/research-lab/pubs/MRL-0005.pdf]​

내용: 금액을 숨기는 수학적 기법인 Ring Confidential Transactions (RingCT)를 제안하며, 다층 링크 가능한 자발적 익명 그룹서명(MLSAG)의 수학적 증명을 포함.

주요 수식:

이산 로그 기반 커밋먼트 C = a G + b H C=aG+bH

제로지식증명(ZKP)으로 금액 합산의 일관성 증명

Schnorr Range Proof의 최적화 구조

  1. Monero is Not That Mysterious (MRL-0003)

저자: S. Noether, 2014

링크: [getmonero.org/nb-no/resources/research-lab/pubs/MRL-0003.pdf]​

내용: ed25519 타원곡선의 비선형 대수식(non-linear system)을 통한 서명 검증 복잡도 분석.

특징:

선형 방정식이 아닌 4개의 비선형 방정식 시스템으로서의 서명 유도 과정을 수학적으로 정리

타원곡선 덧셈법의 구조적 불가역성을 수식으로 증명

  1. Monero Peer-to-peer Network Topology Analysis

출처: arXiv (2025년) [arxiv.org/html/2504.17809v1]​

내용: 모네로 노드 네트워크를 그래프 이론적으로 분석하여 핵-주변(Core-periphery) 구조를 규명.

적용 수학:

수학적 통계량 K n n ( K ) K nn (K), 네트워크 비동질성 계수(assortativity coefficient = -0.28)

복잡계 모델링 기반의 중심성(disassortativity) 분석

  1. Blockchain Networks: Data Structures of Bitcoin, Monero…

저자: C.G. Akcora 외, WIREs Data Mining, 2022

링크: [wires.onlinelibrary.wiley.com/doi/10.1002/widm.1436]​

내용: 비트코인과 모네로 블록체인의 자료구조와 수학적 트랜잭션 모델 비교.

포함 내용:

CryptoNote 기반 수학적 함수 비교

링서명 집합의 통계적 키 균형 분포 분석

  1. Monero: Powering Anonymous Digital Currency Transactions

출처: University of Nebraska, 2020 [digitalcommons.unomaha.edu]​

내용: 서명군 내 난수 기반 원타임 키 생성과 2중 키 구조(view key, spend key)의 대수적 설계 분석.

수학적 초점: 단일 거래에 대한 함수적 독립성 증명 및 ZKP 효율성 분석.

추가 참고 문헌

History and State of Monero Security Analysis (Monero Research Archive)​ → 링서명 기반 보안 증명의 진화와 수학적 검증 절차가 정리된 테크니컬 노트.

An Empirical Analysis of Linkability in the Monero Blockchain (Miller & Möser, 2017)​ → 통계적 히스토그램 모델로 익명도 추적 가능성을 수리적으로 평가.

XMR의 암호화 기술

모네로

비트코인은 투명성, 익명성을 제공한다. 실제로도 그럴까? 그렇다면 최근 일어나는 비트코인 추적과 몰수는 어떻게 일어나는 것일까? 엄밀하게 말하자면 비트코인은 익명성보다는 가명성을 띈다는 것이 맞는 표현일지도 모르겠다. 모든 거래 세부 사항이 투명한 블록체인에서 작동하고 휴리스틱 하지만, 자금 흐름 추적이 거의 가능하며 실제 신원 확인도 가능하다.

이에 반해 모네로는 비트코인보다 더 익명성을 보장한다. 모든 거래가 비공개되며 송신자, 수신자, 거래 금액까지 알 수 없다.

모네로는 untraceability, unlinkability를 제공한다.

그리고 이것을 가능케 하는 ring signatures, stealth addresses, confidential transactions, Dandelion++이 있다.


  1. 링 서명
    송금자의 거래+여러개의 디코이를 묶어서 진짜 자금 출처를 알기 어렵게 한다.
  2. RingCT
    전송되는 XMR 금액을 숨긴다.
  3. 스텔스 주소
    단 한 번만 사용하는 공개 주소

짧게 언급하여 지캐시와 다른 점은 모네로의 경우, 다층적으로 프라이버시를 구현한다는 점이다. 또한, ZKP 구현을 위한 trusted setup이 필요하지 않다. 거래의 유효성을 sk-SNARKs로 구현하는 지캐시와는 다르게 이미 모든 거래를 프라이빗하게 하므로 더 익명성이 보장된다고 할 수 있다.

또한, 노선 자체가 지캐시는 조금 더 메인스트림이고, 모네로는 여러가지 규제 핍박을 받는.. 코인이라서 방향도 조금 다르다고 할 수 있다.

각 암호화 기술에 대해 자세히 살펴보자.

Ring 서명 (송신자 익명화)

ring signature

다수의 공개키(이중 실제 서명자의 키도 포함) -> 하나의 서명 생성 Ring 집합 안에서 무작위화된 서명 구조 -> 추적 불가능성

다른 서명 기술과 달리 plausible denialbility을 제공한다.

Ring CT (거래 금액 은닉)

Monero는 비트코인과 유사한 UTXO 모델로 운영되는데, 비트코인은 UTXO 잔액이 공개적인 것에 반해 Monero는 이를 Pedersen Commitments로 대체한다. 이부분이 Ring CT의 핵심 요소이다.

CT는 confidential Transactions의 약자이다. 거래 금액을 숨기고 비공개 거래를 가능하게 하는 암호화 기술을 말한다.

모든 입력 및 출력 약속(원문 보기) 합계가 일치하면 거래는 유효하다. 이렇게 네트워크를 유효성을 확인하면서도 실제 잔액은 공개하지 않을 수 있다.

키를 보유한 송신자, 수신자만 실제 금액을 확인할 수 있다. bob이 alice에게 3개의 XMR을 보낸다고 하면..

Ring CT

  1. 해당 금액은 Pedersen Commitment를 사용하여 숨김 처리된다.
  2. 실제 금액 3 XMR에 58 같은 비밀 난수를 추가한다.
  3. 이때 약속된 합계는 61이다. 이 합계는 모네로 네트워크에 브로드캐스트된다.

스텔스 주소 (수신자 익명화)

송신자는 Monero를 수신자의 공개 주소로 direct 보내지 않는다. 수신자의 공개 보기 키? 공개 지출 키? + 송신자만 아는 임의의 값 -> 이것을 사용하여 일회성 destination key를 생성한다.

Dandelion++

2020년 4분기에 도입된 네트워크상 프라이버시 보장 기술이다. 기능은 송신자의 IP주소가 전체 network에 브로드캐스트 되지 않도록 한다. Monero 유저가 VPN이나 tor를 사용하지 않으면 모네로 노드는 user의 IP, metadata 등을 캡처하여 은닉할 수 있다? (뭔소리지 이부분)

Dandelion++은 다음 두 step으로 나뉜다.

  1. STEM phase
    새로 생성한 트랜잭션을 임시로 맡을 STEM node로 전송하는 단계
  2. FLUFF phase
    STEM node에 있는 트랜잭션에 IP 주소가 숨겨져 있는지 확인하고 만약 IP 주소가 공개되어 있다면 STEM node의 IP 주소로 덮은 후 브로드캐스트하는 단계. 주소뿐 아니라 거래 지점도 모호하게 만든다.

모네로의 한계

프라이버시 코인을 추적하기 위한 기술 개발이 계속 진행되고 있다. 2020년에는 미국 정부가 Chainalysis에 모네로 추적 기술 개발 계약을 62만 달러 포상금과 함께 체결했다. 당시 기술은 네트워크 사이 진입, 이탈 지점에서 파악하는 거래 추적에 중점을 두었다.

2021년에는 Coindesk가 밝히길, Chainalysis는 단서 수집을 위해 IP 주소를 비밀리에 기록하는 Walletexplorer.com을 운영하였다고 한다.

이 기술을 통해 신원 노출된 사용자와 크립토 거래를 연결할 수 있었고, 수집한 IP 주소를 리버싱하여 관련한 비트코인 주소도 파악 가능했다고 한다.

linux kernel

들어가며

kernel 환경 구축은 처음이라서 일단 드림핵으로 basics 강의를 수강하였다.

[주버전][부버전][개정판 번호]
ex) 6.6.30 

커널 버전은 위와 같이 구분한다. 사실 이러한 구분보다는 LTS/Stable 구분이 더 중요하다.

LTS는 장기간의 지원을 제공하는 커널 버전이다. 이보다는 더 빠르게 기능이 추가되는 커널이 Stable이다. 대신 지원 기간은 더 짧다.

또한, 리눅스 커널은 시스템 아키텍처마다 동작 방식이 약간씩 다르다. 소스 안 arch 디렉토리를 들어가면 각 아키텍처의 코드가 포함되어 있다. x86부터 arm, MIPS 등 hexagon 같은 이외 아키텍처도 많다.

Background

Kernel Space & User Space

리눅스에서 메모리는 위 두 가지 스페이스로 구분하여 관리한다. 시스템의 안전성과 보안을 위함이다. 각 영역은 접근 권한이 다르며 user가 kernel space에 있는 리소스를 사용하기 위해서는 kernel에 요청을 해야하는데, 이때 이 요청을 system cal 이라고 한다.

x86 기준, syscall 어셈블리 명령어로 요청을 수행한다.

  1. 시스템 콜 호출
  2. CPU는 커널 모드로 전환
  3. 시스템 콜의 진입점, entry_SYSCALL_64() 함수 진입
  4. 시스템 콜 테이블인 sys_call_table 로부터 유저가 요청한 시스템 콜 호출

task

리눅스의 응용 프로그램은 fork()를 호출해서 프로세스를 생성하고, pthread_create()를 호출해서 스레드를 생성한다.

  1. 프로세스는 독립된 메모리 영역(코드, 데이터, 힙, 스택)을 가짐
  2. 스레드는 스택 제외 메모리 영역 공유

다만, 커널 입장에서는 이 프로세스, 스레드를 구분하지 않고 모두 태스크로 정의한다. 응용 프로그램에서는 fork, pthread_create로 구분되지만, 커널 단으로 들어오면 모두 copy_process() 함수를 호출한다.

그리고 이 태스크가 생성되면 task_struct 구조체가 할당된다.

struct task_struct {
#ifdef CONFIG_THREAD_INFO_IN_TASK
        /*
         * For reasons of header soup (see current_thread_info()), this
         * must be the first element of task_struct.
         */
        struct thread_info              thread_info;
#endif
        unsigned int                    __state;
        /* saved state for "spinlock sleepers" */
        unsigned int                    saved_state;
        /*
         * This begins the randomizable portion of task_struct. Only
         * scheduling-critical items should be added above here.
         */
        randomized_struct_fields_start
        void                            *stack;
        refcount_t                      usage;
        /* Per task flags (PF_*), defined further below: */
        unsigned int                    flags;
        unsigned int                    ptrace;
#ifdef CONFIG_SMP
        int                             on_cpu;
        struct __call_single_node       wake_entry;
        unsigned int                    wakee_flips;
        unsigned long                   wakee_flip_decay_ts;
        struct task_struct              *last_wakee;
        ...

구조체 구성 요소

Memory Architecture

task_struct의 멤버 mm은 메모리 아키텍처의 주소들을 담고 있다.

struct mm_struct {
        struct {
                /*
                 * Fields which are often written to are placed in a separate
                 * cache line.
                 */
                ...
                unsigned long start_code, end_code, start_data, end_data;
                unsigned long start_brk, brk, start_stack;
                unsigned long arg_start, arg_end, env_start, env_end;
                ...
        } __randomize_layout;
        /*
         * The mm_cpumask needs to be at the end of mm_struct, because it
         * is dynamically sized based on nr_cpu_ids.
         */
        unsigned long cpu_bitmap[];
};

위 코드를 보면 struct에 start, end로 코드 세그먼트, 데이터 세그먼트, 힙 세그먼트, 스택 세그먼트 등의 시작 주소와 끝 주소를 담고 있다.

user 영역의 메모리 구조는 프로세스마다 독립적이지만, kernel 영역은 모든 프로세스가 공유하는 영역이다.

주소 영역 설명
0x000000000000000000 ~ 0x00007ffffffffffff 유저 영역이 위치함, 코드 세그먼트, 스택 세그먼트 등이 존재
0xffff88800000000000 ~ 0xffffc87ffffffffff 물리적인 RAM을 나타내는 영역
0xffffc9000000000000 ~ 0x0000e8fffffffffff vmalloc 영역
0xffffffff80000000 ~ 0xffffffff9ffffffff 커널 코드가 위치한 .text 영역, 커널 이미지
0xffffffffa0000000 ~ 0xffffffffefffffff 커널 모듈이 위치한 영역

위 메모리 맵은 x86-64 아키텍처의 4-level page table에 해당한다. 커널 CONFIG_X86_5LEVEL 옵션에 따라 구조가 달라질 수는 있다.

마지막으로 Addr에 대해 짚고 넘어가자. 알다시피 시스템에서 주소란, 가상 주소(VA)와 물리 주소(PA)로 나뉜다.

가상 주소는 커널이 프로세스에게 제공하는 주소 공간이다. 각 프로세스의 메모리 독립성을 보장하기 위해 해당 주소 개념을 사용한다.

물리 주소의 경우, 실제 메모리 하드웨어의 주소를 나타낸다. 물리 주소 공간은 RAM의 실제 메모리에 직접 매핑이 된다.

  1. 커널과 하드웨어는 물리 주소로 메모리에 접근
  2. 그리고 데이터 읽고 쓰기 수행

때문에 앞서 설명했던 page table중에 RAM 영역에 위치한다.

가상 주소의 경우 MMU에 의해 물리 주소로 변환된다.

Slab Allocator

슬랩 할당자는 커널의 동적 메모리 할당 관리를 위해 고안된 개념이다. kmalloc()을 호출하면 슬랩 할당자로부터 메모리를 할당 받을 수 있고, kfree()를 호출하여 할당받은 메모리를 해제할 수 있다.

과거에는 SLAB, SLUB, SLOB으로 나뉘었으나 지금은 특수한 경우를 제외하곤 SLUB만 사용한다.

슬랩 할당자 주요 구성 요소

슬랩 캐시 : 슬랩 페이지의 집합 슬랩 페이지 : 동일한 크기의 슬랩 객체로 구성

# cat /proc/slabinfo | grep "kmalloc"
...
kmalloc-8k           450    502  16384    2    8 : tunables    0    0    0 : slabdata    251    251      0
kmalloc-4k          2597   3068   8192    4    8 : tunables    0    0    0 : slabdata    767    767      0
kmalloc-2k          2224   3968   4096    8    8 : tunables    0    0    0 : slabdata    496    496      0
kmalloc-1k          4921   8608   2048   16    8 : tunables    0    0    0 : slabdata    538    538      0
kmalloc-512        28209  44128   1024   32    8 : tunables    0    0    0 : slabdata   1379   1379      0
kmalloc-256        37684  87040    512   32    4 : tunables    0    0    0 : slabdata   2720   2720      0
kmalloc-192       150168 209824    256   32    2 : tunables    0    0    0 : slabdata   6557   6557      0
kmalloc-128        21693  23968    256   32    2 : tunables    0    0    0 : slabdata    749    749      0
kmalloc-96         60864  60864    128   32    1 : tunables    0    0    0 : slabdata   1902   1902      0
kmalloc-64        199168 199168    128   32    1 : tunables    0    0    0 : slabdata   6224   6224      0
kmalloc-32         17173  28544     64   64    1 : tunables    0    0    0 : slabdata    446    446      0
kmalloc-16         27226  46464     32  128    1 : tunables    0    0    0 : slabdata    363    363      0
kmalloc-8          31277  47022     40  102    1 : tunables    0    0    0 : slabdata    461    461      0

리눅스의 /proc/slabinfo를 확인해보면, 현재 시스템에서 사용 중인 슬랩 캐시 목록을 확인할 수 있다.

railgun docs 정리

what is RAILGUN?

ethereum, BSC, polygon, arbitrum 등등 온체인으로 바로 구동되는 privacy system이다. ZK crypto를 사용하여 DeFi와 smart contracts의 개인정보보호를 가능케 했다. The RAILGUN code has no owner. Interactions on your chain of choice are made private.

이는 믹서 같은 일반적인 프라이버시 도구가 아니라 이더리움에 구축되어 있고, 다른 DeFi와 interaction할 수 있다. RAILGUN network는 smart contract와 governance model를 사용하여 privacy를 보장한다.

RAILGUN이 차용한 기술 ZKP

영지식 증명으로 네트워크 규칙은 준수하면서, 거래 세부 정보를 숨겨서 블록체인의 익명성을 보장한다.

DeFi application과 상호 작용 시 일어나느 암호화 전략

transaction privacy

RAILGUN 네트워크에서는 보유한 모든 ERC-20 토큰에 대한 프라이버시를 보호한다. 보호된 토큰으로 swap 등 DeFi 상에서 자유롭게 상호 작용할 수 있다.

  1. 해당 네트워크에 토큰을 입금하면
  2. 가명 주소와 연결된 새로운 개인 지갑이 생성된다.
    이때 이 주소는 사용자의 원래 지갑과는 관계가 없다.
  3. 보호된 토큰으로 swap, lend 등 상호작용 가능하다.

Railgun 기록

이런식으로 To에는 Railgun이라고만 뜬다.

비공개 송금

토큰 보호뿐 아니라 유입, 유출에 대한 프라이버시도 보호한다.

  1. 사용자가 zk-SNARK auth가 있다면
  2. 보호된 토큰의 비공개 전송을 가능하게 한다.

RAILGUN의 영지식 증명 구현

RAILGUN의 ZKP 기술 구현을 설명한다. 레일건은 ZKP중에서도 SNARK를 채택하여 공간을 확보하고, 속도를 보장한다.

  1. 사용자가 레일건 네트워크 컨트랙트에 토큰을 예치하면
  2. zk-SNARK 기반 auth가 생성된다.
  3. 이후 사용자의 주소에 연결하지 않고 모든 트랜잭션은 zk-SNARK에 의해 인증되고 검증된다.

레일건 작동 방식

프라이버시 중심의 DeFi를 구축하고자 레일건은 스마트 컨트랙트, ZKP, 릴레이어를 사용한다.

railgun

자산 보호 (Shielding)

ERC-20 토큰을 RAILGUN에 예치하면, 자산이 Shielded 상태가 된다. 이 상태가 되면 기존 지갑 주소와 분리된 익명 주소가 생성된다. 해당 지갑은 외부에서 추적할 수 없게 잔액을 비공개로 돌린다.

비공개 상호작용

다른 주소로 비공개 인터렉션도 가능하다. swap, lend 등.. DeFi 어플리케이션과도 인터렉션 가능하다. 모든 거래가 zk-SNARK 증명으로 검증하므로 블록체인에도 암호화 내용으로 기록된다.

릴레이어 네트워크 참여

레일건(Railgun)은 프라이버시를 더욱 강화하기 위해 릴레이어 네트워크를 사용한다. 이러한 릴레이어는 사용자를 대신하여 이더리움 블록체인에 트랜잭션을 브로드캐스트한다(거래를 전송하고 가스비 지불)