
커널 런타임 방어 프레임워크로, AF_ALG 취약점을 대상으로 하며 eBPF 소켓 추적, Ansible 강화, 드리프트 탐지를 위한 암호화 감사 도구를 제공합니다.
Linux AF_ALG(주소 패밀리 알고리즘, 패밀리 38) 서브시스템을 위한 커널 런타임 방어 프레임워크입니다. 제로 트러스트가 네트워크 경계에서 멈추지 않고 커널 내부로 확장되어야 하는 엔터프라이즈 Linux 플릿을 운영하는 보안 운영 센터(SOC)를 위해 구축되었습니다.
AF_ALG는 소켓 인터페이스(socket(AF_ALG, SOCK_SEQPACKET, 0))를 통해 커널 암호화 API를 사용자 공간에 노출합니다. 원래 /dev/crypto가 없는 임베디드 시스템을 위해 추가되었으며, 이후 권한이 없는 호출자에게 커널 모드 암호화 코드를 노출하기 때문에 커널 CVE에서 불균형적으로 큰 비중을 차지하게 되었습니다 — 전형적인 공격 표면 불일치입니다.
일반적인 엔터프라이즈 빌드에서:
connect(), bind() 또는 DNS를 후킹하는 엔드포인트 도구는 아무것도 볼 수 없습니다 — AF_ALG 트래픽은 커널을 벗어나지 않기 때문입니다.이 프레임워크는 모든 AF_ALG 소켓 생성을 고신호 이벤트로 취급하고 해당 이벤트를 악용 가능하게 만드는 공격 표면을 줄입니다.
.
├── ebpf/ 런타임 관측성 (BCC 트레이서 + 허용 목록)
├── ansible/ 코드형 구성 (sysctl + systemd drop-in)
├── systemd/ Ansible이 없는 호스트용 독립 systemd drop-in
├── auditor/ 커널 상태 감사자 (Python)
├── schemas/ 감사 보고서 수집용 JSON Schema
├── scripts/ 헬퍼 셸 스크립트 (CI에서 린트)
├── tests/ 단위 테스트 + 보고서 픽스처
└── .github/workflows/ CI: shellcheck + JSON 스키마 검증 + 린트
ebpf/af_alg_tracer.py는 security_socket_create에 kprobe를 연결합니다. 프로브는 BPF 프로그램 수준에서 family == 38을 필터링하여 검증기가 관련 없는 소켓 생성을 가지치기하고 이벤트당 오버헤드를 나노초 단위로 유지합니다. 시도당 하나의 JSON 레코드를 출력합니다:
{
"@timestamp": "2026-05-02T09:14:11.412041+00:00",
"event": {"category": "kernel", "action": "af_alg_socket_create", "severity": "high"},
"process": {"pid": 1394, "tgid": 1394, "comm": "suspicious_bin"},
"user": {"uid": 1000, "gid": 1000},
"socket": {"family": 38, "family_name": "AF_ALG", "type": 5, "protocol": 0},
"host": {"name": "web-prod-04"}
}
stdout을 Vector, Fluent Bit 또는 journald(systemd-cat 경유)로 파이프하세요. comm 이름 허용 목록(/etc/af-alg-defense/allow.list)은 알려진 정상 소비자를 억제하면서도 변칙 탐지 능력을 잃지 않습니다.
kprobe 대상은 LSM 후크이므로 이벤트는 의도에 따라 발생합니다 — seccomp나 RestrictAddressFamilies에 의해 거부될 시도조차도 레코드를 생성합니다. 이것이 바로 SOC가 행동 기준선 설정을 위해 원하는 것입니다.
ansible/roles/af_alg_hardening/은 두 가지 하드닝 계층을 적용합니다:
Sysctl drop-in (/etc/sysctl.d/90-af-alg-defense.conf):
kernel.unprivileged_userns_clone=0 — 대부분의 AF_ALG 권한 상승 체인이 사용하는 userns 피벗 제거.user.max_user_namespaces=0 — 배포판 이식 가능한 심층 방어.Systemd drop-in (/etc/systemd/system/<unit>.d/50-af-alg-restrict.conf):
RestrictAddressFamilies를 거부 목록이 아닌 허용 목록으로 사용합니다. 유닛은 AF_UNIX AF_INET AF_INET6 AF_NETLINK만 허용되며, AF_ALG를 포함한 다른 모든 패밀리는 애플리케이션이 비활성화할 수 없는 cgroup 연결 BPF를 통해 systemd가 강제하므로 EAFNOSUPPORT로 실패합니다. drop-in은 또한 CAP_SYS_ADMIN을 제거하고 ProtectKernel*를 적용하여 가장 흔한 권한 상승 경로를 차단합니다.
적용 방법:
ansible-playbook -i inventory ansible/site.yml --check --diff # 미리보기
ansible-playbook -i inventory ansible/site.yml # 적용
Ansible이 없는 호스트의 경우 독립 파일을 제자리에 배치하세요:
sudo ./scripts/deploy_dropin.sh nginx.service
auditor/crypto_auditor.py는 다음을 검사하여 JSON 보안 상태 보고서를 생성합니다:
/proc/crypto — FIPS 플래그와 자체 테스트 상태를 포함한 모든 등록된 암호/해시/aead./sys/module/ — taint 플래그와 매개변수 스냅샷을 포함한 암호화 하위 트리의 로드된 모듈./proc/sys/kernel/, /proc/sys/user/ — AF_ALG 공격 경로를 차단하는 sysctl./sys/kernel/security/lockdown — 커널 lockdown 모드.보고서는 안정적인 발견 ID(현재 FND-001~FND-005)로 키가 지정되어 SIEM 규칙이 전체 문서를 삭제하지 않고 개별 발견을 억제할 수 있습니다. 드리프트 탐지는 기준선과 상태를 비교합니다:
sudo ./auditor/crypto_auditor.py --output /var/log/af-alg-defense/today.json
sudo ./auditor/crypto_auditor.py \
--baseline /var/log/af-alg-defense/baseline.json \
--fail-on-drift
스키마는 schemas/audit_report.schema.json(Draft 2020-12)에 있으며 모든 푸시 시 CI에서 검증됩니다.
.github/workflows/ci.yml은 모든 푸시와 PR에서 네 가지 작업을 실행합니다:
*.sh 및 shebang이 있는 스크립트.audit_report.schema.json을 메타스키마로 검사한 후 GH 러너 커널에서 감사자를 라이브로 실행하고 결과 보고서를 검증합니다. tests/fixtures/의 픽스처도 검사됩니다.ruff check .).스키마 검사 실패는 병합을 차단하여 다운스트림 SIEM 파서가 조용히 이름이 변경된 필드로 인해 중단되는 것을 방지합니다.
af_alg_socket_create 이벤트 — 집계하지 말고 첫 발생 시 페이지.crypto_modules의 새 항목.hardened=false인 sysctl — 수동 변조 또는 병렬 구성 시스템의 드리프트를 나타냄.lockdown 필드가 integrity/confidentiality에서 none으로 전환 — 커널 상태 변조의 강력한 지표.allow.list를 채웁니다.baseline.json으로 캡처합니다.af_alg_systemd_services를 저위험 유닛 하나로 설정하여 카나리 그룹에 Ansible 역할을 적용합니다. journald에서 EAFNOSUPPORT 오류를 관찰합니다.systemd-analyze security <unit>이 제한이 적용되었음을 보여야 합니다.--fail-on-drift와 함께 야간 cron에 연결하고 0이 아닌 종료 코드를 온콜 큐로 라우팅합니다.af_alg를 언로드하지 않습니다. 합법적인 부팅 시 소비자가 여전히 실행 중일 수 있으므로 모듈 언로드는 범위 밖입니다. 호스트에서 아무것도 필요로 하지 않음을 확인했다면 커널 명령줄에서 modprobe.blacklist=af_alg를 사용하세요.security_socket_create kprobe 대상용).uname -r과 일치하는 커널 헤더.CAP_BPF(또는 root); 감사자용 /proc/crypto 읽기 권한(읽기에는 권한 불필요).Apache-2.0. LICENSE 참조.
| 제로 트러스트 원칙 | 이 프레임워크의 통제 수단 |
|---|
| 절대 신뢰하지 말고 항상 검증 | eBPF 트레이서가 모든 AF_ALG 소켓 생성 시도를 pid/uid/comm과 함께 기록 |
| 침해 가정 | 암호화 감사자가 서명된 기준선(baseline)과 커널 상태를 비교 |
| 최소 권한 | 관리 대상 유닛에 systemd RestrictAddressFamilies + capability 바운딩 |
| 마이크로세그멘테이션(커널 측) | unprivileged_userns_clone=0이 익스플로잇이 사용하는 userns 피벗 제거 |
| 지속적 검증 | CI가 모든 변경 사항에 대해 버전 관리된 스키마로 감사 보고서 검증 |