“verifier만 믿어도 될까?” eBPF 보안 강화 현황: 외부 감사 + 런타임 하드닝(KASAN)의 투트랙

도입부: eBPF는 강력한 확장성과 성능 덕분에 널리 쓰이지만, 그만큼 “커널 안에서 안전하게 실행된다”는 전제가 무너지면 파급이 큽니다. 이 글에서는 최근 eBPF Foundation이 진행 중인 **외부 보안 감사(audit)**와 런타임 하드닝(KASAN 계측) 흐름을 정리하고, 제한된 리소스에서 어디에 먼저 투자해야 위험 감소 효과가 큰지 제 관점을 공유합니다.

eBPF 보안의 핵심 축: verifier와 JIT, 그리고 “실제로는 런타임”

eBPF 보안을 이야기할 때 보통 두 가지를 떠올립니다.

  • 커널 검증기(verifier): eBPF 프로그램이 커널에서 안전하게 실행될 수 있는지 정적으로 검사합니다. 포인터 범위, 메모리 접근, 루프, 스택 사용 등 “안전”을 증명하려고 합니다.
  • JIT(Just-In-Time compilation): eBPF 바이트코드를 아키텍처별 네이티브 코드로 바꿔 성능을 얻습니다. 하지만 JIT는 커널 내부에서 실행되는 코드 생성 파이프라인이라 공격 표면이 될 수 있습니다.

여기에 최근 강조되는 흐름이 하나 더 있습니다.

  • 런타임 계측/방어(예: KASAN): 정적 검증이 놓치는 케이스(복잡한 경로, 레이스, 구현 버그 등)를 “실행 중”에 잡아내거나, 최소한 빨리 드러내서 진단 가능하게 만듭니다.

제가 보기엔 eBPF 보안은 이제 “verifier가 다 막아준다”에서, 독립 감사로 현실 취약점을 찾고 + 런타임에서 진단/방어까지 끌어올리는 방향으로 진화하는 중입니다.

eBPF Foundation의 투트랙: (1) 외부 감사 (2) KASAN 런타임 하드닝

요약하면, eBPF Foundation은 Alpha-Omega 지원으로 아래를 병행 중입니다.

  1. verifier·JIT 실행 경로에 대한 외부 보안 평가
  2. JIT된 eBPF 프로그램에 대한 KASAN 계측 강화(런타임 메모리 안전성 진단/방어)

이 두 접근은 성격이 다릅니다.

  • 외부 감사: “실제로 취약한 지점이 어디인지”를 증거 기반으로 드러냅니다.
  • KASAN 하드닝: “취약점이 남아있더라도, 커널 메모리 안전성 문제를 더 빨리 폭로/탐지”하게 만듭니다.

즉 **발견(Find)**과 **진단/방어(Detect/Contain)**를 같이 끌어올리는 전략입니다.

STAR Labs 외부 감사 결과: JIT 단독 취약점은 없었지만, 총 14개 이슈

STAR Labs 평가에서 인상적인 포인트는 다음입니다.

  • x86-64/arm64 JIT 자체에서만 발생하는 단독 취약점은 발견되지 않았습니다.
  • 하지만 전체적으로는 총 **14개 이슈(고위험 8, 중위험 2, 저위험 4)**가 확인됐습니다.
  • 이슈 유형은 다음 범주로 요약됩니다.
    • 검증기 우회(verifier bypass)
    • 메모리/포인터 누출
    • 레이스 조건으로 인한 메모리 손상
    • 검증기 DoS(서비스 거부)
  • 일부는 이미 업스트림(upstream)에서 수정된 상태입니다.

여기서 제가 얻은 인사이트는 “JIT만 안전하면 끝”이 아니라는 점입니다. 현실 취약점은 보통 여러 계층이 맞물리는 경계면(검증 로직의 허점, 동시성, 상태 추론의 빈틈 등)에서 나옵니다.

KASAN 런타임 하드닝: JIT 로드/스토어 경로에 계측 심기

두 번째 축은 “JIT된 eBPF 프로그램이 실행될 때” 메모리 안전성 문제를 잡기 위한 KASAN 계측 강화입니다. 진행 중인 작업을 요약하면:

  • 대상 중심: JIT된 코드의 load/store 경로(BPF_LD/LDX/ST/STX) 위주
  • 접근 방식: PoC 테스트 → RFC → Kconfig 게이팅 → __asan_load/store 호출 플러밍(plumbing)
  • 다듬는 지점:
    • 부팅/런타임 이슈
    • 스택 접근의 선택적 계측
    • red-zone / poisoning 동작 정교화

즉 “원칙적으로는 계측을 심고 싶지만, 커널/성능/안정성 제약 때문에 어디까지 켤지”를 현실적으로 조율하는 단계입니다.

(간단 코드 스케치) JIT load/store에 KASAN 훅을 넣는다는 건

실제 커널 구현과 동일한 코드는 아니지만, 개념적으로는 아래처럼 “메모리 접근 직전”에 ASAN/KASAN 훅을 호출해 접근 유효성을 검사하는 그림입니다.

// pseudo code: JIT-generated memory load path
u64 bpf_ldx(u64 *addr) {
    __asan_load8(addr);   // KASAN/ASAN hook: load 전에 유효성 검사
    return *addr;
}

// pseudo code: JIT-generated memory store path
void bpf_stx(u64 *addr, u64 val) {
    __asan_store8(addr);  // store 전에 유효성 검사
    *addr = val;
}

이 계측은 “취약점을 예방”한다기보다, 취약한 접근이 실제로 발생했을 때 빠르게 크래시/리포트로 드러내고 재현성을 높이는 쪽에 강합니다. 특히 레이스나 희귀 케이스는 정적 검증만으로 커버하기 어렵기 때문에, 런타임 계측이 가진 실용적 가치가 큽니다.

제한된 리소스에서 어디에 먼저 투자할까? 저는 “취약점이 집중되는 병목”에 한 표입니다

대화에서 제가 동의했던 방향은 “병목 구간에 투자하자”였고, 여기서 병목은 두 가지로 나뉩니다.

  • 성능 병목(Throughput/Latency)
  • 보안/정확성 병목(취약점이 집중되는 경로)

요즘 현실(취약점 탐색 자동화, 공격 제작 비용 하락 등)을 감안하면, 저는 성능 병목 최적화보다 “취약점이 많이 나는 경로”를 먼저 다지는 게 리스크 감소 효과가 크다고 봅니다. 특히 eBPF는 커널 경계 안쪽에서 돌아가기 때문에, 한 번 뚫렸을 때 비용이 매우 큽니다.

제 우선순위 제안: “사전 차단(검증기) + 사후 진단(KASAN)”을 순차/병렬로

리소스가 정말 제한적이라 “하나만” 고르라면 저는 이렇게 생각합니다.

  • 1순위: verifier 정확성 개선(우회/누출/레이스 유발 경로 축소)
    이유: 공격 표면을 줄이는 효과가 직접적입니다. verifier 우회는 “커널에서 마음대로 메모리 만지는 길”로 이어질 수 있어서 파급이 큽니다.
  • 2순위: KASAN 계측 확대(특히 JIT load/store 핵심 경로)
    이유: verifier가 완벽할 수 없다는 전제에서, 남은 버그를 빨리 찾고(개발/업스트림), 운영에서도 사고를 조기에 감지/진단할 수 있습니다.

다만 현실적으로는 “둘 중 하나만”이 아니라, 감사로 취약점이 많이 나오는 경로를 찾고 → 그 경로에 verifier 보강과 KASAN 계측을 함께 집중하는 식이 가장 효율적이라고 봅니다. 이게 제가 말하는 “취약점이 집중되는 병목에 투자”의 구체화입니다.

(번외 인사이트) AI 시대의 보안과 하네스 엔지니어링 관점

대화에서 나온 포인트를 eBPF 맥락에 연결해보면:

  • AI가 취약점 탐색/PoC 생성 속도를 올릴수록, “언젠가 verifier 버그는 나온다”는 전제가 더 강해집니다.
  • 그래서 저는 “모델을 더 잘 검증”하는 것보다, 모델/도구(하네스 포함)가 열어주는 실행 권한을 최소화하고, 동시에 런타임에서 이상을 빨리 드러내는 계측/관측성을 강화하는 쪽이 현실적이라고 봅니다.

eBPF 쪽으로 번역하면, verifier 강화가 “사전 차단(least privilege에 해당)”이라면, KASAN은 “사후 탐지/진단(관측성/가드레일)”에 가까운 카드입니다. 둘은 경쟁 관계라기보다, 함께 있어야 방어선이 됩니다.

마무리

eBPF 보안 강화의 방향은 명확해 보입니다. 독립 감사로 실제 취약점을 발견하고, verifier 개선으로 공격 표면을 줄이며, KASAN 같은 런타임 계측으로 남은 버그를 빠르게 드러내는 것입니다. 제한된 리소스라면 “취약점이 집중되는 병목 경로”를 기준으로 verifier와 KASAN 투자를 함께 설계하는 게 가장 높은 위험 감소 효과를 준다고 생각합니다.

참고 자료