커널 radix tree (xarray)

Cute_Security15·2023년 9월 16일
0

커널

목록 보기
2/10

상황

legacy kernel 들에서 파일필터를 지원할때 redirfs.ko 모듈을 사용

이 모듈의 "적정 메모리 스펙" 을 정하기 위해 redirfs 가 사용하는 slab cache 3개의 사용량을 측정하고 있음

  • file / inode / dentry

문제는 모듈을 load 할때, radix_tree_node 라는 slab cache 가 약 3000K ~ 4000K 정도
순간적으로 치고 올라오는 걸 확인함

목적

radix_tree_node slab cache 가 redirfs.ko 에서 어떻게 쓰이는지 확인하기 위해,
radix tree insert 과정을 따라가봤습니다.

새로 알게된 내용

redirfs.ko 는 file/inode/dentry 구조체 주소를 index(key) 로 하여 높이 11의 radix tree 를 구성하고, leaf node 에 rfs_file/rfs_inode/rfs_dentry 를 저장하고 있습니다.

leaf node 에 접근하기 위해, index 를 chunksize(6) 크기로 앞(MSB)에서부터 사용. 현재 node 내 slot offset(0 ~ 63) 을 구하는데 사용하고 있습니다.

높이 11의 radix tree 는 최대 (64)^11 개까지 rfs_file/rfs_inode/rfs_dentry 저장이 가능합니다.

radix tree insert example

file 0xffff888003472800 에 대응하는 rfs_file 을 redirfs.ko 내부 radix tree 에 넣는
로직 예시입니다.

slot offset calculation

file 0xffff888003472800 를 radix tree 에 넣을때 node 별 slot offset 을 계산하는 과정입니다.

crash example (xarray)

계산한 offset 이 있고, radix tree insert 로직을 이해하였으므로, 이제 crash 상에서 file 에 대응하는 rfs_file 을 radix tree 내에서 찾을 수 있습니다.

  • linux 4.20-rc1 부터 radix tree 내부구현이 xarray 로 변경되었으므로,
    radix_tree 내 xarray 를 확인합니다.

1) file 0xffff888003a34bc0 의 slot offset
root/15/63/63/34/8/0/18/41/37/12/0

2) crash 상에서 따라가봅니다.

  • root xa_node slots[] 에선 offset 15 에 든 xa_node 를 선택
  • 선택된 xa_node 에선 offset 12 에 든 xa_node 를 선택
  • 이걸 11회 반복하면 rfs_file 획득

profile
관심분야 : Filesystem, Data structure, user/kernel IPC

0개의 댓글