코드를 안 고치고 추적하는 법 — 관측과 보안 후킹의 공통 조상

부제: 대상 소스를 안 고치고 경계에 프로브를 꽂는다 — 관측과 보안은 한 뿌리다


이 시리즈를 처음 열게 한 질문이 있었다. 관측 도구를 쓰다가 이런 경험을 했다.
각 서비스는 잘 도는데, 모니터링하려고 로그를 남기려면 상식적으로는 모든
서비스의 로깅 함수를 갈아끼우거나 코드를 고쳐야 한다. 그런데 Tempo·Beyla 같은
추적 시스템은 코드를 한 줄도 안 고치고 요청의 흐름을 잡아냈다. 그게 참
편했다.

그때 든 직감이 하나 있었다. "이거, 보안 업계에서 윈도우 메시나 IPC·RPC 통신을
감시하던 기법과 연관 있는 거 아닐까?"
조사해 보니 — 정확히 그랬다. 이번
편(시리즈 C의 마지막)은 그 연결을 정리한다.


한 줄 정의부터

개념 한 줄 정의
동적 계측(dynamic instrumentation) 실행 중인 프로그램을 재컴파일 없이 가로채 관찰·변경하는 것
auto-instrumentation 앱 코드를 안 고치고 경계에 계측기를 끼워 신호를 뽑는 관측 방식
후킹(hooking) 함수·이벤트·통신을 가로채는 기법 — 보안의 전통 무기
eBPF 커널에 안전한 프로그램을 심어 관찰·필터하는 현대적 커널 프리미티브

코드를 안 고치는 세 가지 방법

C1에서 Beyla·Linkerd를 "코드 무수정 관측의 다리"라고 했다. 실제로 앱을 안 고치고
계측하는 방법은 크게 셋이다.

  • 바이트코드 에이전트 — 예: OpenTelemetry Java Agent를 -javaagent로 붙이면,
    클래스가 로딩되는 순간 바이트코드를 다시 써서 HTTP 클라이언트·DB 드라이버
    진입점에 span 생성 코드를 주입한다(Byte Buddy 사용). 소스는 그대로다.
  • eBPF — Beyla·Pixie는 커널에 프로브를 심어 uprobe/kprobe로 함수 진입과
    소켓 송수신을 관찰한다. 에이전트조차 앱에 안 붙고 커널에서 훔쳐본다.
  • 사이드카/서비스 메시 — Linkerd·Envoy는 Pod 옆 프록시가 트래픽을 가로채
    거기서 메트릭·트레이스를 만든다.

셋 다 공통점이 하나다. 대상 소스를 건드리지 않고, 경계(진입점·커널·네트워크)에
프로브를 꽂는다.
그리고 바로 이 발상이 보안 업계의 오래된 무기와 같다.


같은 조상 — 관측과 보안은 한 뿌리다

정리하면 이렇다. 두 세계는 같은 기법을 쓰고, 목적만 다르다.

관측 계열과 보안 계열의 대응표 — 같은 동적 계측, 갈라진 목적

  • 함수 가로채기 — 보안의 Detours 인라인 훅·IAT 후킹(Windows) ↔ 관측의
    LD_PRELOAD·uprobe(Linux). 둘 다 "함수 진입을 바꿔치기".
  • 이벤트 관찰 — ETW(Event Tracing for Windows) ↔ tracepoint·eBPF.
  • 네트워크 감시 — WFP(Windows Filtering Platform) ↔ eBPF/XDP.
  • EDR/상시 관찰 — 보안 제품(EDR)은 과거 SSDT 커널 훅에서 지금은 커널 콜백·
    ETW-Ti로 왔고, 관측의 Beyla·Pixie·Falco는 eBPF로 같은 일을 한다.

여기서 핵심 하나. Beyla·Pixie가 쓰는 uprobe·kprobe·eBPF는, EDR과 루트킷이
쓰던 커널 후킹을 커널이 공식적으로 안전하게 열어 준 판(eBPF)
이다. 문자 그대로
같은 커널 프리미티브를 쓴다. 그리고 OTel Java Agent의 바이트코드 재작성은
인라인 훅의 JVM판이다. 갈리는 건 오직 의도 — 가로채서 관찰하느냐(관측),
조작하거나 탐지하느냐(보안).


RPC/IPC 감시 = 분산 트레이싱의 다른 얼굴

내가 처음 떠올린 "IPC·RPC 감시" 직감이 특히 정확했던 지점이 여기다.

분산 트레이싱의 span 트리와 보안의 RPC 호출 그래프는 같은 그림

분산 트레이싱은 요청이 서비스 경계를 넘을 때마다 traceparent 헤더(같은
trace-id)를 전파한다. 그러면 서로 다른 프로세스가 남긴 span들이 하나의 요청
으로 묶여, 부모-자식 관계의 호출 그래프(span 트리) 가 된다. "어느 구간이
느린가"가 한눈에 보인다.

보안은 같은 그림을 다른 목적으로 그린다. ETW의 RPC 공급자나 IPC 필터로
프로세스 간 호출을 상관(correlate) 해 호출 그래프를 재구성하고, 거기서
침해·이상 행위를 찾는다. 경계를 넘는 호출을 하나로 잇는다는 문제는 똑같다 —
하나는 병목을 찾으려고, 하나는 공격을 찾으려고.


정리 — 시리즈를 닫으며

  • 코드를 안 고치고 추적하는 auto-instrumentation의 정체는 동적 계측이다 —
    바이트코드 에이전트·eBPF·사이드카.
  • 이건 보안 업계의 후킹(Detours·ETW·WFP·EDR)과 같은 조상을 공유한다.
    Beyla·Pixie의 eBPF는 EDR 커널 후킹의 안전판, OTel 에이전트는 인라인 훅의
    JVM판 — 같은 기법, 다른 의도.
  • 분산 트레이싱의 span 트리와 보안의 RPC/IPC 호출 그래프는 같은 그림이다.
  • 그래서 그때 그 관측이 편했던 건 우연이 아니라, 관측과 보안이 기술적으로 같은
    뿌리
    여서였다.

이렇게 개념 시리즈 A·B·C를 마친다. 컨테이너의 정의(A)에서, 네트워킹·격리의
안쪽(B)을 지나, 관측과 보안의 공통 뿌리(C)까지 — 매 편 "개념마다 한 줄 정의 +
실제로 확인 + 쓰기에 어긋나지 않을 만큼만" 이라는 한 가지 방법으로 걸어왔다.
도구를 만든 의도와 결에 맞게 쓰기 위한, 딱 그만큼의 지도다.


참고

  • Grafana Beyla / Pixie Docs — eBPF auto-instrumentation
  • OpenTelemetry — Java agent (bytecode instrumentation), W3C Trace Context (traceparent)
  • Microsoft — Detours, Event Tracing for Windows (ETW), Windows Filtering Platform
  • Linux man-pages — uprobes, kprobes, bpf(2)

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다