SK쉴더스 로고
ADT캡스캡스홈
SK쉴더스

Linux 커널 BPF JIT 코드 재사용 메모리 유출 가능 취약점 (CVE-2026-64507)

EQST Now | 2026.10.01

NOW Briefing

Brief 1 Linux 커널 cBPF JIT에서 해제된 코드 영역에 남은 분기 예측 정보로 커널 메모리가 유출되는 취약점(CVE-2026-64507)이 공개됐습니다.
Brief 2 연구팀은 기본 완화가 켜진 최신 Intel 시스템에서 로컬 저권한 사용자 권한으로 root 비밀번호 해시를 3~5분 내 추출했습니다.
Brief 3 배포판이 제공하는 패치 커널로 업그레이드해야 합니다. JIT 상수 블라인딩 설정만으로는 차단되지 않습니다.

‍

Linux 커널 BPF JIT 코드 재사용 메모리 유출 가능 취약점 (CVE-2026-64507)

‍

■ 개요

‍

Branch Target Reuse(BTR)는 VU Amsterdam VUSec과 이탈리아 Scuola Superiore Sant'Anna 연구팀이 2026년 9월 29일 공개한 Spectre-v2(분기 목표 예측을 오염시켜 추측 실행을 유도하는 취약점 계열) 신종 공격입니다. 표적은 JIT(실행 시점에 바이트코드를 기계어로 번역하는 컴파일러)입니다. 연구팀은 Linux 커널의 cBPF(고전 BPF, 소켓 필터·seccomp에 쓰이는 커널 내 바이트코드) JIT, Firefox의 SpiderMonkey, Oracle GraalVM에서 공격 표면을 확인했고, 근본 동작은 Intel·AMD·Arm에서 재현했습니다. 이 가운데 Linux 커널 건에 CVE-2026-64507과 CVE-2026-64508이 할당됐으며, 영향 범위는 패치 이전의 커널 5.18 이상입니다.

영향은 로컬 저권한 사용자의 커널 메모리 읽기입니다. 연구팀은 특권이 필요 없는 cBPF 프로그램만으로 커널 메모리를 약 8바이트/초 속도로 읽어냈습니다. 실행 중인 su 프로세스에서는 root 비밀번호 해시를 Raptor Cove·Lion Cove(Intel 최신 코어 마이크로아키텍처)에서 각각 평균 3분과 5분 내에 추출했습니다. 이 공격은 배포판 기본 설정과 기본 Spectre-v2 완화를 모두 켠 상태에서 성공했고, JIT 상수 블라인딩(JIT이 생성하는 상수를 난독화해 JIT 스프레이를 막는 하드닝)이 적용된 환경에도 익스플로잇을 맞춰 재현했습니다. 원격 공격은 아니고 로컬 실행 권한이 전제이며, 공개 시점까지 실제 악용 관측 보고는 없습니다.

커널 패치는 연구 공개에 앞서 2026년 7월 커널 트리에 반영됐고, 두 CVE 레코드도 2026년 7월 25일 게시됐습니다. 지금은 배포판 커널 업데이트로 적용할 수 있습니다. 위험이 실제로 성립하는 곳은 신뢰할 수 없는 사용자나 코드가 같은 호스트에서 실행되는 공유 개발 서버, 멀티테넌트(한 호스트를 여러 고객·사용자가 공유) 컨테이너 노드, 공용 CI 러너입니다. 국내에서도 kt cloud가 차세대 관리형 쿠버네티스에 eBPF 기반 쿠버네티스 네트워킹 구성요소인 Cilium을 표준으로 채택할 예정이고, 카카오는 7,000개 이상 클러스터·12만 대 이상 노드에서 Cilium을 운영합니다. 이런 대규모 인프라에서는 커널 BPF/JIT 경로가 상시 활성화됩니다.

‍

■ 요약

‍

항목 내용
CVE ID CVE-2026-64507
CVSS 점수 CVSS v3.1 5.5 (Red Hat 산정)
취약점 유형 CWE-515(은닉 저장 채널, Red Hat 분류), Spectre-v2 계열 마이크로아키텍처 사이드채널
영향/위험 • 로컬 저권한 사용자의 커널 메모리 읽기가 약 8바이트/초로 재현됨
• 실행 중 su 프로세스에서 root 비밀번호 해시 추출이 3~5분 내 재현됨
• 기본 Spectre-v2 완화 및 JIT 상수 블라인딩이 켜진 환경에서도 우회됨
• 실제 악용 관측 보고는 없음
취약 버전 • 5.18 이상 커널 중 아래 패치 버전 미만
• 5.18 미만: 영향 없음
패치 버전 • 6.1.183
• 6.6.145
• 6.12.97
• 6.18.39
• 7.1.4
• 7.2 이상

‍

■ 기술 분석

‍

최신 CPU는 코드가 스스로 수정되면 명령어 일관성은 복원하지만, 그때 간접 분기 예측기에 남은 낡은 목표 주소 항목까지 무효화하지는 않습니다. BPF JIT 할당자는 작은 프로그램 여러 개를 큰 실행 가능 할당에 묶어 넣고 해제된 공간을 재사용합니다. 그래서 새 프로그램의 간접 분기가 이전 프로그램이 남긴 예측 항목을 그대로 쓰게 되고, CPU는 이미 사라진 옛 오프셋을 목표로 새 코드 일부를 추측 실행합니다. 해제된 코드를 추측 실행하는 이 상태(speculative execute-after-free)에서 공격자가 유도한 명령 조합이 비밀 값을 건드리고, 그 흔적은 Flush+Reload(캐시 접근 시간 차로 값을 알아내는 측정 기법)로 읽힙니다.

이 공격은 신뢰 경계를 넘지 않아 기존 완화에 걸리지 않습니다. retpoline(간접 분기를 안전한 명령 시퀀스로 대체하는 완화)이나 컨텍스트 전환 시 간접 분기 예측 장벽(IBPB) 같은 기본 대응은 권한 도메인을 넘나드는 예측 주입을 겨냥하지만, BTR에서는 예측기를 학습시키는 코드와 오용되는 코드가 모두 커널 안의 같은 JIT 영역이라 장벽이 발동하지 않습니다. JIT 스프레이(공격자가 원하는 기계어가 JIT 코드 영역에 생성되게 유도하는 기법)를 겨냥한 상수 블라인딩도 단독으로는 충분하지 않았습니다. 연구팀은 공격자 제어 바이트를 즉시값 대신 전방 점프의 오프셋 바이트에 실어 이 하드닝을 우회했습니다.

패치는 JIT 메모리가 재사용되는 시점 자체에 장벽을 넣습니다. 아래는 커널 커밋 25dbcd3(메인라인 커밋 a3af84b의 스테이블 백포트)의 arch/x86/kernel/cpu/bugs.c에 추가된 구간입니다. IBPB를 실행하는 경로와 이 하드닝을 켤지 판단하는 조건을 정의합니다.

+#ifdef CONFIG_BPF_JIT
+static void __bpf_arch_ibpb(void *unused)
+{
+	entry_ibpb();
+}
+
+void bpf_arch_ibpb(void)
+{
+	on_each_cpu(__bpf_arch_ibpb, NULL, 1);
+}
+
+static bool __init cpu_wants_ibpb_bpf(void)
+{
+	/* A genuine retpoline already neutralizes ring0 indirect predictions */
+	if (retpoline_seq_enabled())
+		return false;
+
+	return boot_cpu_has(X86_FEATURE_IBPB);
+}
+#endif

이 패치는 on_each_cpu()로 모든 코어에서 장벽을 실행합니다. 예측 항목은 코어별로 남으므로 한 코어만 비우면 다른 코어에서 그대로 재사용됩니다. 진짜 retpoline 시퀀스가 적용된 시스템은 커널 내 간접 예측이 이미 무력화돼 있어 이 하드닝을 건너뜁니다. 전체 코드는 CONFIG_BPF_JIT로 묶여 JIT 미사용 빌드에 영향을 주지 않습니다.

이 x86 장벽을 연결하는 아키텍처 독립 플러시 훅 bpf_arch_pred_flush는 BPF 계층 쪽 하드닝인 CVE-2026-64508에서 추가됐고, 두 건의 패치 버전은 동일합니다.

‍

■ PoC

‍

VUSec는 논문 아티팩트 저장소 vusec/btr에 Linux cBPF 대상 엔드투엔드 익스플로잇을 함께 공개했습니다. 저장소 설명 기준으로 이 익스플로잇은 기본 Ubuntu 보안 설정에서도, 상수 블라인딩(bpf_jit_harden)을 켠 상태에서도 동작합니다. 다만 테스트 환경은 Ubuntu 24.04의 커널 6.14.0-27-generic이고, 빌드 시 ARCH= 값으로 Lion Cove와 Raptor Cove 중 하나를 지정해야 합니다. 이 전제는 해당 익스플로잇 빌드에 한정된 조건이고, 취약 조건 자체는 패치 이전 커널의 BPF JIT 경로입니다.

익스플로잇은 임의 커널 메모리 읽기 기능을 조립한 뒤 이를 반복 호출합니다. 대상 프로세스에 대응하는 커널 구조체(task_struct)를 찾고, 메모리 서술 구조체와 페이지 테이블을 따라가 사용자 주소를 커널 주소로 바꿉니다. 그 다음 해시 문자열의 앞부분 서명이 나타나는 지점을 찾아 바이트 단위로 읽어냅니다. 아래 코드는 leak_shadow.c의 leak_shadow_hash() 앞부분 일부입니다. 코드는 수정하지 않고 그대로 옮겼습니다. 파일 전체는 참고 자료에 연결한 공개 PoC 원문에서 확인할 수 있습니다.

void * leak_shadow_hash(struct config * cfg) {
    struct timeval t0, t1;
    uint64_t delta_us;
    uint64_t task_struct, mm_struct, brk_start, brk_end, pgd;
    uint64_t user_addr, kern_addr, hits;
    if (cfg->constant_blind_safe == 0){
        set_load_chain_leak_secret(cfg);
    } else {
        cb_set_load_chain_leak_secret(cfg);
    }

    gettimeofday(&t0, NULL);

    int pid = cfg->pid_target;

    task_struct = find_target_task_struct(cfg, pid);
    // printf("%16s: %#18lx\n", "&task", task_struct);

    mm_struct = get_kernel_pointer(cfg, task_struct + TASK_MM_OFF, 0x0, 0xf, 0);

⚠️ WARN

익스플로잇은 설정 값 constant_blind_safe에 따라 상수 블라인딩이 적용된 시스템용 경로를 따로 실행합니다.
상수 블라인딩 설정만으로는 대응이 끝나지 않으므로 커널 패치를 적용해야 합니다.

‍

■ 탐지 및 점검

‍

• uname -r로 실행 커널이 6.1.183, 6.6.145, 6.12.97, 6.18.39, 7.1.4, 7.2 중 해당 계열의 패치 버전 이상인지 확인합니다. 배포판 커널은 업스트림과 다른 버전 체계를 쓰므로, 버전 문자열이 위 목록과 맞지 않으면 배포판 보안 공지의 패치 빌드 번호와 대조합니다.

• dmesg | grep -i "Enabling IBPB for BPF"로 패치 커널이 이 하드닝을 실제로 켰는지 확인합니다. 진짜 retpoline 시퀀스가 적용된 시스템에서는 메시지가 없는 것이 정상입니다.

• cat /sys/devices/system/cpu/vulnerabilities/spectre_v2로 현재 완화 방식이 retpoline인지 간접 분기 추측 제한(IBRS) 계열인지 확인해, 위 메시지가 없는 이유가 정상 조건인지 미패치인지 구분합니다.

• sysctl net.core.bpf_jit_enable net.core.bpf_jit_harden으로 JIT 활성 여부와 상수 블라인딩 설정값을 기록해 둡니다.

• 신뢰할 수 없는 사용자나 코드가 로컬 실행 권한을 갖는 호스트를 식별해 우선 패치 대상으로 분류합니다.

📌 NOTE

마이크로아키텍처 사이드채널은 파일·네트워크 흔적을 남기지 않아 로그 기반 탐지를 기대할 수 없습니다.
커널 버전과 완화 활성 상태를 직접 확인하는 것이 실질적인 점검 수단입니다.

‍

■ 대응 방안

‍

• 배포판이 제공하는 패치 커널로 업그레이드하고 재부팅해 새 커널로 부팅됐는지 확인합니다.

• 즉시 재부팅이 어려운 시스템은 net.core.bpf_jit_enable을 0으로 두어 이후 로드되는 프로그램의 JIT 경로를 없애는 방안을 검토합니다. 단 CONFIG_BPF_JIT_ALWAYS_ON으로 빌드된 배포판 커널에서는 이 sysctl의 허용 범위가 1로 고정돼 0 쓰기가 거부되고, 인터프리터 경로로 되돌아가면 네트워크·관측 성능이 저하됩니다.

• 연구팀이 상수 블라인딩이 켜진 환경에서도 유출을 재현했으므로, net.core.bpf_jit_harden을 단독 대책으로 쓰지 않습니다.

• 패치 이전에 신뢰할 수 없는 사용자가 로그인할 수 있었던 공유 호스트는 root 비밀번호와 커널 메모리에 상주하던 자격증명의 재발급을 우선 검토합니다.

• 간접 분기 목표를 제한하는 Intel IBT, Arm BTI 같은 하드웨어 기능은 공격 난이도를 높이지만 위험을 제거하지 않으므로, 펌웨어·마이크로코드 업데이트와 커널 패치를 함께 적용합니다.

‍

[참고 자료]

• VUSec — Branch Target Reuse 프로젝트 페이지

• Linux 커널 패치 커밋 — x86/bugs: Enable IBPB flush on BPF JIT allocation

• BTR 공개 PoC 원문 — e2e-exploit/user/leak_shadow.c

• BTR PoC 저장소 — e2e-exploit README (빌드·실행 조건)

• CVE-2026-64507 레코드 (영향·패치 버전)

• CVE-2026-64508 레코드 (영향·패치 버전)

• Red Hat 보안 정보 — CVE-2026-64507

• BleepingComputer — 새 Spectre v2 변종, Linux root 비밀번호 해시 유출

• Daily CyberSecurity — Branch Target Reuse Spectre-v2 공격 상세

• Linux 커널 문서 — net sysctl (bpf_jit_enable, bpf_jit_harden)

• Linux 커널 소스 — net/core/sysctl_net_core.c (CONFIG_BPF_JIT_ALWAYS_ON 시 값 고정)

• kt cloud 기술블로그 — Calico와 Cilium(eBPF) 비교 분석

• CNCF Korea — 국내 쿠버네티스 프로덕션 사례

  • #EQST_NOW
  • #취약점

관련 서비스

더 많은 보안 인사이트

SK쉴더스 유튜브 채널에서 확인하세요.

SK쉴더스 유튜브 채널에서 확인하세요.
보안 트렌드와 대응방법

매월 뉴스레터로 확인하세요.

매월 뉴스레터로 확인하세요.