글
10월, 2026의 게시물 표시
L2 Wireguard
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
Wireguard 소개 wireguard는 VPN 프로토콜 중 하나로 필수적인 기능만 구현되어있어 기존 ipsec 등의 vpn보다 훨씬 단순하고 직관적이다. wireguard protocol 메세지 유형은 다음 4가지 뿐이다. (출처: https://www.wireguard.com/papers/wireguard.pdf ) 일반적인 흐름을 아주 단순화하면 Initiation -> Response -> Transport Data 다. 공격 방어가 필요한 경우 Cookie Reply 가 개입할 수 있는 구조다. 테스트 환경 구성 === office-gw === Arch: x86_64 OS: Debian 13 (trixie) Kernel: 6.12.107+deb13-amd64 WG tool: v1.0.20210914 === home-gw === Arch: aarch64 OS: Debian 12 (bookworm) Kernel: 6.12.95+deb12-arm64 WG tool: v1.0.20210914 === raspberrypi === Arch: aarch64 OS: Raspbian 12 (bookworm) Kernel: 6.18.33-v8+ WG tool: v1.0.20210914 === fedora === Arch: x86_64 OS: Fedora 43 (Workstation Edition) Kernel: 6.17.12-300.fc43.x86_64 WG tool: v1.0.20260223 L3 Wireguard 동작 확인 // office-gw root@office-gw:/home/suunj# ping -c 3 10.1.1.1 PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data. 64 bytes from 10.1.1.1: icmp_seq=1 ttl=64 time=0.971 ms 64 bytes from 10.1.1.1: icmp_seq=2 tt...
Build My Own RV32 JIT Emulator
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
risc-v ISA를 위한 간단한 JIT 컴파일 기반 에뮬레이터를 만들었다. 초기 구현 범위는 기본 기능으로 한정하고 SIMD 같은 선택적 아키텍쳐 기능은 거의 포함하지 않았다. 이 에뮬레이터는 QEMU의 TCG(Tiny Code Generator) 소프트웨어 에뮬레이션이 원리상 어떻게 작동하는지 이해하기 위한 연습으로 작성했다. QEMU의 C 구현을 그대로 따라하지는 않았다. ISA 를 Native Code로 변환하기 에뮬레이션은 다음 단계로 수행된다. 1. ELF file의 program header를 읽어 guest 메모리에 배치한다. 2. guest pc에서 rv-32i 명령어를 읽고 x86_64 명령어로 변환한다. 3. 변환 블록으로 묶고 code cache에 저장한다. 4. 원본 pc와 변환된 코드의 pc 사이의 대응 관계를 address lookup table에 저장한다. 4. 생성한 x86_64 코드를 실행하고 다음 guest pc의 블록을 찾아 실행한다. 변환로직은 디코딩된 RV32 명령어의 종류에 따라 switch 문으로 분기하고, 해당 명령어와 동등한 동작을 수행하는 호스트 머신 코드를 직접 생성한다. 생성된 코드는 게스트 레지스터와 메모리를 읽고 갱신하여 원래 명령어의 동작을 재현한다. 변환 로직은 조건 플래그 같은 머신 상태도 적절히 갱신해야한다. Block Chaining 명령어들은 translation block 단위로 묶인다. 일반적으로 분기나 점프처럼 실행 흐름이 바뀌는 control plane 전 명령어까지 하나의 블록으로 구성되며 생성한 호스트 코드는 코드 캐시에 저장한다. 게스트 블록의 시작 주소와 호스트 코드의 시작 주소를 연결해 두면 같은 블록을 사시 실행할 때 디코딩과 코드 생성을 반복하지 않고 기존 코드를 재사용할 수 있다. 블록 진입 시에는 모든 risc-v 아키텍쳐 레지스터의 값을 JIT 변수로 불러온다. 이 부분을 prologue라고 한다. 블록 실행이 끝나면 다음 게스트 pc를 설...
Inside the CPU Part 3: Microarchitecture (실제 instruction은 CPU 내부에서 어떻게 흘러가는가?)
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
Inside the CPU Part 2: RTL — Hardware CPU (TCG가 흉내 냈던 동작은 실제 CPU 회로에서는 어디에 존재하는가?)
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
Inside the CPU Part 1: QEMU TCG — Software CPU (소프트웨어로 CPU instruction을 어떻게 구현하는가?)
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
kprobes를 이용한 커널 instrumentation
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
kprobes 에 대하여 kprobes는 linux kernel에 내장된 디버깅 API이며 프로세서의 디버그 기능을 기반으로 한다. linux kernel 소스코드에는 kprobes.txt 문서가 있다. 현재 probe 에는 3가지 종류가 있다. kprobe: 커널의 거의 모든 명령어에 삽입할 수 있다. jprobe: 커널 함수의 진입점에 삽입되며 함수의 인자에 편리하게 접근할 수 있게 해준다. kretprobe: 지정한 함수가 반환될 때 동작한다. 이 정의를 보면 kprobes 인터페이스를 이용해 커널을 여러 흥미로운 방법으로 계측할 수 있다는 것을 상상할 수 있다. 보안을 강화하는 방향으로도 반대로 약화하는 방향으로도 사용할 수 있다. kprobes 가 커널 자체에서 제공되는 인터페이스라는 점은 장점이지만 뒤에서 살펴볼 여러 제한도 존재한다. 즉, kprobes는 커널의 특정 부분을 패치하는 데 사용할 수 있지만 모든 것을 처리할 수 있는 것은 아니다. 그럼 언제, 어디서 커널의 동작을 수정할 수 있는지 살펴보자. 경우에 따라 다른 패치 방법과 함께 사용해야 할 수도 있다. 몇가지 기본적인 사실은 먼저 등록된 kprobe는 /sys/kernel/debug/kprobes/list에서 확인할 수 있다. /sys/kerenl/debug/kprobes/enabled 파일에 0 또는 1을 기록하면 kprobes를 비활성화하거나 활성화할 수 있다. kprobes 소스코드는 다음 위치에 있다. /usr/src/linux/kernel/kprobes.c /usr/src/linux/arch/x86/kernel/kprobes.c jprobes와 kretprobes는 전적으로 kprobes를 기반으로 구현되어 있어 kprobes를 비활성화하면 kretprobe와 jprobe 역시 동작하지 않는다. jprobe 예제 probe를 등록하거나 해제하는 여러 함수가 제공된다. 예를 들어 sys_mprotect 호출을 관찰하고 어떤 인자가 전달되는지 확인하고 싶다고 ...
VM escape - QEMU의 메모리를 읽는 두 가지 방법
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
악성코드가 VM을 탈출하여 호스트 머신에서 코드를 실행할 수 있을까? KVM(Kernel-based Virtual Machine) 은 사용자 공간 프로그램에 완전 가상화 인프라를 제공하는 커널 모듈이다. 이를 통해 수정되지 않은 Linux 또는 Windows 이미지를 실행하는 여러 가상 머신을 구동할 수 있다. KVM 의 사용자 공간 구성요소는 메인라인 QEMU(Quick Emulator)에 포함되어있으며 특히 device emulation을 담당한다. 개발 환경 여기서 타겟으로 잡은 취약점은 이미 오래전 패치되었기 때문에 QEMU 소스에서 해당 취약점 수정 직전의 커밋으로 checkout 해야한다. QEMU 메모리 배치 게스트에 할당된 물리 메모리는 실제로 QEMU의 가상 주소 공간 내에서 mmap 된 private 영역이다. 게스트의 물리 메모리를 할당할 때 PROT_EXEC 플래그가 활성화되지 않는다는 점에 주목하는 것이 중요하다. 게스트 프로세스 +--------------------+ 가상 주소 공간 | | +--------------------+ | | \__ 페이지 테이블 \__ \ \ | | 게스트 커널 +----+--------------------+----------------+ 게스트 물리 메모리 | | | | +----+--------------------+--------...