본문 바로가기

기타 지식들

eBPF 정리하기

안녕하세요. 굉장히 오랜만에 글을 쓰는 것 같습니다.

아무래도 현생이 너무 바빠져서 블로그에 신경을 좀 못 썼는데, 종강도 했으니 다시 글을 많이 적어보려고 합니다.

 

최근에, 제가 다니는 보안 연구실에서 eBPF 관련해서 연구가 시작되어서 내용 정리할 겸 글을 적어보려고 합니다.

현재 작성 중인 글은 아래 링크에서 참고해서 적은 글임을 먼저 밝힙니다.

https://ebpf.io/ko-kr/what-is-ebpf/

eBPF?

eBPF는 기본적으로 운영 체제 커널과 같은 특별한 권한이 있는 환경에서 샌드박스 프로그램을 실행시킬 수 있는 리눅스 커널의 기술에서 기원한 기술입니다.

이는 커널 소스 코드를 바꾸거나, 커널 모듈을 로드하지 않고도 기존 커널의 기능을 안전하고 효율적으로 확장시키는 것에 사용됩니다.

훅 개요

eBPF 프로그램은 그냥 실행되지 않습니다.

기본적으로 이벤트를 기반으로 동작하고, 커널 또는 애플리케이션이 특정 훅 지점을 지나갈 때 실행됩니다.

사전에 정의된 훅들은 여러 가지가 포함되는데, 시스템 콜, 함수 진입 및 종료, 커널 tracepoint, 네트워크 이벤트 등 여러 가지가 포함됩니다.

 

대충 이런 식으로 Process가 실행될 때 특정 syscall이 발생하면 eBPF 프로그램이 실행된다고 생각하면 됩니다.

만약 사전에 정의된 훅이 없다면, 새로운 커널 probe 또는 user probe를 생성해서 커널 또는 유저 애플리케이션의 모든 임의의 위치에 eBPF 프로그램을 부착할 수 있습니다.

부착되는 예시는 아래와 같습니다.

로더 및 검증 아키텍처

특정 훅이 확인된다면, eBPF 프로그램은 bpf call을 통해서 리눅스 커널 내부로 로드될 수 있으며, 이러한 절차는 일반적으로 시스템에서 사용 가능한 eBPF 라이브러리 중 하나를 사용하여 진행됩니다.

 

검증

검증 단계에서는 eBPF 프로그램이 동작하기에 안전한지를 검증하며, 이 단계에서는 eBPF 프로그램이 여러 요구사항을 만족하는지를 검증하는데, 예시는 아래와 같습니다.

 

- eBPF 프로그램을 로드하는 프로세스는 특별한 권한이 필요합니다. 특권이 필요없는 eBPF를 허용하지 않는 한, 특별한 권한을 가진 프로세스들만 eBPF 프로그램을 로드할 수 있습니다.

- eBPF 프로그램은 크래시가 나거나 시스템에 악영향을 끼치지 않습니다.

- eBPF 프로그램은 항상 종료되어야 합니다.

JIT 컴파일

검증이 완료된 JIT 컴파일 단계는 프로그램의 실행 시간을 최적화 하기 위해서, 프로그램의 일반화된 바이트 코드를 특정 머신에서 동작하는 명령어 집합으로 변환합니다. -> 이를 통해서 eBPF 프로그램은 사전에 컴파일된 커널 코드 또는 로드된 커널 모듈과 비슷하게 효율적으로 동작이 가능합니다.

Map

eBPF 프로그램의 중요한 측면 중 하나는 수집된 정보를 공유하고 상태를 저장하는 능력입니다.

이를 위해서 eBPF 프로그램은 eBPF 맵의 개념을 사용해서 수많은 자료구조를 지원하는 데이터를 저장하거나 저장된 정보를 찾아올 수 있습니다.

eBPF 맵은 eBPF 프로그램 뿐만 아니라 시스템 콜을 사용하면 유저 공간에서의 애플리케이션에서도 접근이 가능합니다.

 

헬퍼 함수 호출

eBPF 프로그램은 임의의 커널 함수를 호출할 수 없습니다. 따라서 eBPF 프로그램은 대신 커널에 의해 제공되는 잘 알려지고 안정적인 API인 커널 함수를 호출합니다.