Security
syzbot 버그 패치 리뷰 (2025.12.18)
divide error in ocfs2_block_group_fill (3)error type: Divide-by-zeroocfs2는 Oracle Cluster File System 2로, 파일시스템bpc는 Blocks Per Cluster클러스터 크기 = 64KB = 2^16 → s_clustersize_bits = 16블록 크기 = 4KB = 2^12 → s_blocksize_bits = 12expected_bpc = 1 하나의 클러스터 안에 16개 블록이 있다는 뜻block은 디스크 I/O의 최소 단위cluster는 파일시스템이 파일 공간을 할당하는 단위원인: 입력값 검증 누락으로 0으로 나누기 발생 option from the mount to silence this warning.=..
CVE-2009-3895, CVE-2012-2836 - Heap-based Buffer Overflow 취약점
취약점 개요CVE-2009-3895, CVE-2012-2836 는 libexif 라이브러리 버전 0.6.14에서 발견된 힙 기반 버퍼 오버플로우(Heap-based Buffer Overflow) 취약점이다. 환경 구성퍼징할 libexif-0.6.14를 다운로드하고 압축을 해제 후 빌드한다.wget https://github.com/libexif/libexif/archive/refs/tags/libexif-0_6_14-release.tar.gztar -xzvf libexif-0_6_14-release.tar.gzcd libexif-libexif-0_6_14-release/autoreconf -fvi./configure --enable-shared=no --prefix="$(pwd)/install/"ma..
CVE-2020-27786 - race condition 기반 Use-After-Free 취약점
ALSA rawmidi 드라이버에서 copy_from_user() 수행 중 lock이 해제되는 틈에 다른 스레드가 ioctl로 버퍼를 해제할 수 있는 race condition 기반 Use-After-Free 취약점 Referenceshttps://www.hacktivesecurity.com/blog/2022/06/13/linux-kernel-exploit-development-1day-case-study/https://github.com/kiks7/CVE-2020-27786-Kernel-Exploitfdsf
syzbot, qemu, gdb를 사용하여 linux kernel의 버그 수정
공개된 Syzbot 버그를 통해 보고서부터 시작하여 제공된 환경을 사용하여 원래 충돌을 확인하고 영향을 받는 커널 버전을 로컬에서 다시 빌드한 다음, 상위 버전 수정 사항을 적용한 후 문제가 해결되었는지 확인하는 절차를 알아보자.목표는 근본 원인을 추적하거나 패치하는 것이 아니다. 버그를 로컬 환경에서 실행하여 수정 전후의 상태를 확인하는 것이다. Linux Kernel 공개 버그리눅스 커널에서 공개된 버그를 찾는 방법은 여러가지 이다.BugZillaSyzbotSyzkaller-bugsChangelogsGit log BugZillaBugZilla는 리눅스 커널의 버그를 보고하는 표준적인 방법이다. subsystem 별로 정리된 흥미로운 취약점(예: IPv4 및 IPv6 네트워킹, ext* 파일 시스템 등..
syzkaller를 이용한 커널 퍼징 #4 실제 커널 퍼징
Google은 무제한 서버로 syzkaller를 돌리지만, local에서 작업하기에는 자원이 제한되어있다. syzkaller dashboard는 현재 퍼징 상태, 결과 그리고 linux subsystem에 대한 적용 범위를 표시한다. 타겟 선정 전략Coverage 섹션의 Subsystems Heatmap 분석을 확인하면 각 subsystem의 블록 수와 커버리지 비율을 확인할 수 있다.블록 수가 많으면서 커버리지 비율이 적은 subsystem을 테스트하여 아직 탐색되지 않은 버그를 찾아보기로 했다. 후보 목록퍼징 타겟으로 괜찮아 보이는 것subsystem이유dsa (3%, 3257 블록)코드량 많은데 커버리지 매우 낮음ncsi (5%, 1329 블록)적당한 크기, 낮은 커버리지6lowpan (3%, 46..
syzkaller를 이용한 커널 퍼징 #3 syz-manager 설정 및 syz-executor 실행
syz-manager란syz-manager는 syzkaller 의 메인 프론트엔드 프로그램이다. 전체 퍼징 인프라를 관리하는 중앙 컨트롤러 역할을 한다.syz-manager는 다음과 같은 주요 역할을 한다.VM 인스턴스 관리시작시 다음과 같은 절차를 거친다.설정 파일 읽기VM 템플릿 이미지의 스냅샷 생성 (bhyve + ZFS 사용 시)설정된 수만큼 VM 생성각 VM에 SSH로 접속하여 syz-fuzzer 설치 및 시작Crash 감지 및 처리vm console 을 모니터링하여 crash 감지 시 다음과 같은 절차를 거친다.Crash DB에 추가패닉 메시지로 분류일부 VM을 재현 시도에 할당최소 재현 프로그램 찾기 시도C 프로그램으로 변환VM 재생성Corpus RotationVM을 주기적으로 재시작 (cr..
syzkaller를 이용한 커널 퍼징 #2 Syzkaller의 동작 구조
커널 퍼징Linux에는 약 450개의 시스템 호출이 있는데 언뜻 보기에 퍼징할 공격 표면이 많지 않아 보일 수 있다. 하지만 실제 공격 표면은 매우 넓은데 이러한 시스템 콜이 수많은 커널 하위 시스템과의 통신 채널을 제공하기 때문이다. 가장 간단한 시스템 콜 open() 조차도 파일 시스템 드라이버(ext4, btrfs) 마다 /dev 하위의 노드 (/dev/null, /dev/sda...) 마다 각각 다른 구현을 가지고 있다. 또 네트워크 패킷 처리, 파일시스템 마운트 (USB 등 외부 미디어), 하드웨어 장치와 직접 통신까지 생각하면 커널은 훨씬 많은 공격 표면을 가지고 있다.따라서 syzlang 정의가 아무리 많아도 모든 케이스를 커버하기 어려워 여전히 모든 공격 표면을 완전히 커버하지는 못한다. ..
syzkaller를 이용한 커널 퍼징 #1 Fuzzing 이란
Fuzzing이란퍼징은 프로그램에 무작위 입력을 넣어서 크래시나 버그를 자동으로 찾아내는 소프트웨어 테스팅 기법으로 1980년대부터 있었지만, 최근 보안 연구에서 다시 각광받고 있다.핵심 구성 요소는 다음과 같다.1. 입력 생성 (Input Generation)모델 기반: 입력 형식(문법)을 알고 유효한 테스트 케이스 생성뮤테이션 기반: 기존 시드 입력을 무작위로 변형 → AFL, honggfuzz 같은 도구가 사용2. 실행 엔진 (Execution Engine)생성된 입력으로 프로그램을 실행하고 크래시 감지Sanitizer(ASan, UBSan 등)를 사용해 메모리 오류나 정의되지 않은 동작을 더 잘 탐지Fork 서버, 퍼시스턴트 퍼징 등으로 실행 속도 최적화 실제 예시 - pdf reader 퍼징P..
GO runtime 해부 #0 Monkey Patching
Go 프로그램 부트스트랩go 프로그램 시작 과정은 다음과 같다._rt0 (Entry Point) ↓_main ↓runtime.rt0_go (스케줄러 및 첫 고루틴 설정) ↓runtime.main ├→ runtime.init ├→ main.init └→ main.main (우리가 작성한 코드) ↓exit(0) 핵심 개념은 다음과 같다. 우리가 작성하는 main.main()은 진짜 시작점이 아님Go 런타임이 먼저 초기화 작업 수행:스케줄러 설정메모리 할당자 초기화GC 설정고루틴 스택 준비 진입점이 main 위에서 시작한다는 점이 중요하다. 진짜 시작점은 _rt0 이다. main()은 런타임 초기화의 끝 에 해당한다.이게 왜 중요할까 panic과 defer의 내부 구조panic은 함수가 아니다g..