
CVE-2026-99999에 대한 제한된 eBPF TC 인그레스 가드, CO-RE 탐지기, 검증된 로더, C11 VMM 실행 감독기
CVE-2026-99999에 대한 임시 패킷 허용 가드 및 감독형 런처입니다.
호스트 커널이 skb_checksum_help에 도달하기 전에 VM의 TAP 인터페이스에서 위험한 게스트 트래픽을 차단합니다. 해석형 스크립트 없이 순수 C11과 eBPF로 작성되었습니다.
보안 상태: GAL 1 · CVE 억제 미검증 · 승격 중단. 모든 오프라인 정책, 탐지기, 런처 및 새니타이저 스위트가 통과합니다. 그러나 TC ingress 필터는 패킷 페이로드 바이트를 검증할 뿐 virtio 체크섬 메타데이터(
csum_start)는 검증하지 않습니다. fentry 탐지기는 의심스러운 메타데이터를 관찰하지만 실행을 차단할 수는 없습니다.권위 있는 해결책: 업스트림 커밋
6785011f8b16이 포함된 벤더의 패치된 호스트 커널을 설치하고 재부팅하십시오.csumguard는 게스트 트래픽 강화와 런타임 감독을 제공할 뿐, 검증된 CVE 무력화를 제공하지 않습니다. VALIDATION.md를 참조하십시오.
flowchart LR
subgraph Guest["Untrusted Guest VM"]
VMM["VMM Process<br/>QEMU or Cloud-Hypervisor"]
end
subgraph Interface["Host TAP Device tap0"]
TAP["tap0 clsact"]
TC["csumguard_in<br/>eBPF TC Ingress"]
end
subgraph Host["Host Linux Kernel"]
STACK["Host Network Stack"]
SINK["skb_checksum_help<br/>Vulnerable Sink"]
end
subgraph Supervisor["csumguard_launch Supervisor"]
MON["Identity Poller<br/>6D Vector State"]
QUAR["Quarantine Engine<br/>SIGSTOP, DOWN, SIGKILL"]
RING["Receipt Ledger<br/>64-slot Ring Buffer"]
end
VMM -->|TX Frames| TAP
TAP --> TC
TC -->|Admitted TCP, UDP, ARP| STACK
TC -.->|Dropped: Frag, GSO, VLAN, Options| DROP["Dropped + Counter"]
STACK -.-> SINK
MON -->|Polls Status| TAP
MON -->|Attachment Drift or Loss| QUAR
QUAR -->|Pauses & Terminates| VMM
QUAR -->|Flushes Receipts| RING
flowchart TD
PKT["Ingress Frame"] --> ETH{"EtherType"}
ETH -->|ARP 0x0806| ARP{"Request or Reply"}
ARP -->|Valid 42B or 60B pad| PASS["PASS: Admitted"]
ARP -->|Invalid| D_ARP["DROP: Malformed ARP"]
ETH -->|IPv4 0x0800| IP{"IPv4 Header Checks"}
ETH -->|Other or VLAN| D_ETH["DROP: Non-IPv4 or VLAN"]
IP -->|Options, Frag, or GSO| D_IP["DROP: Frag, Option, GSO, or Csum"]
IP -->|Valid IHL 5, MF 0, Offset 0| L4{"Transport Protocol"}
L4 -->|TCP proto 6| TCP{"TCP Checks"}
L4 -->|UDP proto 17| UDP{"UDP Checks"}
L4 -->|Other| D_PROTO["DROP: Unsupported Protocol"]
TCP -->|Valid ports and length| PASS
TCP -->|Port 0 or invalid length| D_TCP["DROP: Bad TCP"]
UDP -->|Valid dst port and length| PASS
UDP -->|Port 0 or invalid length| D_UDP["DROP: Bad UDP"]
flowchart TD
S0["1. Preflight<br/>Validate admission.json"] --> S1["2. Attachment<br/>Verify Hash & Attach clsact"]
S1 --> S2["3. Privilege Drop<br/>Non-root UID/GID & no_new_privs"]
S2 --> S3["4. Running<br/>Poll 4-Tuple ID Every 200ms"]
S3 -->|Poll Matches ID| S3
S3 -->|Filter Loss or ID Mismatch| Q0["5. Quarantine: SIGSTOP<br/>Pause VMM Process Group"]
Q0 --> Q1["6. Quarantine: LINK DOWN<br/>Set TAP Interface Down"]
Q1 --> Q2["7. Quarantine: SIGKILL<br/>Terminate Process Group"]
Q2 --> Q3["8. Exit<br/>Flush Hash-Chained Receipts"]
S3 -->|Normal VM Exit| Q3
| 구성 요소 | 파일 | 역할 |
|---|---|---|
| 패킷 필터 | policy.h, csumguard_tc.bpf.c | TC 인그레스에서의 헤더 전용 분류기. 표준 TCP, UDP, ARP를 허용한다. 프래그먼트, 옵션, GSO, VLAN은 드롭한다. 26개의 per-CPU 카운터가 사유를 추적한다. |
| 체크섬 탐지기 | detect_policy.h, csumguard_detect.bpf.c | 커널 내 CHECKSUM_PARTIAL 패킷을 추적하는 선택적 fentry 프로브. 의심스러운 오프셋에서 카운터를 증가시킨다. 절대 차단하지 않는다. |
| 로더 | loader.c | 심볼릭 링크 공격을 방지하기 위해 /부터의 파일 경로를 검증한다. SHA-256 다이제스트를 확인하고, 인터페이스가 DOWN 상태인지 보장하며, clsact를 연결한다. |
| VMM 런처 | launch.c, launch_policy.h | 운영자 증거를 검증하고, 비루트 UID/GID로 권한을 낮추고, VMM을 시작하며, 연결을 모니터링한다. 필터가 드롭하면 VM을 일시 중지하고 종료한다. |
| 영수증 원장 | launch.c | FIPS 180-4 SHA-256 해시 체인 JSONL 레코드를 작성하는 비동기 스레드. 64슬롯 링 버퍼가 디스크 정체를 방지한다. |
make EGRESS_MTU=1500 all
make test
객체를 root 소유 디렉터리(/opt/csumguard)에 배치하고, TAP 인터페이스가 DOWN 상태인지 확인한 후 연결합니다:
/opt/csumguard/csumguard_loader attach tap0 /opt/csumguard/csumguard_tc.bpf.o <EXPECTED_SHA256>
/opt/csumguard/csumguard_loader status tap0 <IFINDEX> <NETNS_INODE> <PROG_ID>
/etc/csumguard/admission.json을 작성하고 csumguard_launch 아래에서 VMM을 시작합니다:
/opt/csumguard/csumguard_launch \
--interface tap0 \
--loader /opt/csumguard/csumguard_loader \
--object /opt/csumguard/csumguard_tc.bpf.o \
--evidence /etc/csumguard/admission.json \
--receipt /var/log/csumguard/tap0.jsonl \
--uid 65534 \
--gid 65534 \
--interval 0.2 \
-- /usr/bin/qemu-system-x86_64 -netdev tap,id=n0,ifname=tap0,script=no,downscript=no
csumguard는 첨부된 암호화 증거 참조자(SLSA v1.0 출처 증명, CycloneDX v1.6 SBOM, 검증 매트릭스)와 함께 OCI v1.1 아티팩트(application/vnd.csumguard.ebpf.v1)로 패키징되어 배포됩니다:
# Package local OCI layout and attach all referrers
./oci/package.sh --layout-dir build/oci-layout --tag v0.2.0
# Discover attached referrers graph
oras discover --oci-layout build/oci-layout:v0.2.0
# Pull directly on hypervisor hosts without container daemon
oras pull ghcr.io/mchorfa/csumguard:v0.2.0
전체 OCI 미디어 유형, 디스크립터 및 Cosign 검증 워크플로는 oci/README.md를 참조하세요.
# Verify all source and evidence hashes
shasum -a 256 -c SHA256SUMS
# Run offline test suite
make test
# Run AddressSanitizer and UndefinedBehaviorSanitizer
clang -std=c11 -O1 -g -fsanitize=address,undefined -DEGRESS_MTU=1500 -I. tests/test_policy.c -o /tmp/p_asan && /tmp/p_asan
clang -std=c11 -O1 -g -fsanitize=address,undefined -I. tests/test_launch.c -lpthread -o /tmp/l_asan && /tmp/l_asan
clang -std=c11 -O1 -g -fsanitize=address,undefined tests/send_frame.c -o /tmp/f_asan && /tmp/f_asan --self-test
policy.h Packet admission parser and reason codes
detect_policy.h Checksum partial predicate
launch_policy.h Admission validator, 6D vector state, and SHA-256
csumguard_tc.bpf.c TC ingress eBPF program
csumguard_detect.bpf.c fentry/skb_checksum_help probe
loader.c libbpf loader and status reporter
launch.c VMM supervisor, quarantine engine, and receipt writer
tests/ Offline C11 test suites and frame generator
testbed.sh Lab veth test harness
docs/ Runbook, admission spec, and CVE references
evidence/ Verification logs and test records
promotion-gates.yaml Gate statuses and target requirements