ioctl 시스템 호출 (system call)은 Linux의 범용 장치 제어 인터페이스입니다. 사용자 공간 (userspace) 프로그램은 장치 노드를 열고 드라이버에 숫자 명령 코드 (numeric command code)와 인자 버퍼 (argument buffer)를 전달하며, 드라이버는 하드웨어 구성, 상태 읽기, 또는 커널 내부로의 데이터 이동 등 해당 코드가 의미하는 바를 수행합니다. 드라이버들은 이러한 명령들을 수천 개씩 직접 정의하며, 커널 컨텍스트 (kernel context) 내에서 인자를 파싱합니다. 이로 인해 ioctl 핸들러 (handler)는 커널 내에서 가장 광범위하고 비균일한 로컬 공격 표면 (attack surface) 중 하나가 되었습니다. 검증되지 않은 인자 길이를 신뢰하는 핸들러는 커널 메모리를 경계 외 (out of bounds)에서 읽거나 쓸 수 있지만, 명령 공간 (command space)은 중앙 집중식으로 목록화되어 있지 않습니다.
본 논문에서는 해당 표면에 대한 소스 기반의 쿼리 가능한 인벤토리 (inventory)인 Linux IOCTL Census를 제시합니다. allmodconfig 빌드를 통해 169개의 서브트리 (subtrees)에 걸쳐 878개의 모듈을 컴파일하였으며, 커널 소스에 대한 단일 결정론적 libclang 패스 (pass)를 통해 586개의 ioctl 디스패치 엔트리 포인트 (dispatch entry points), 1,289개의 디코딩된 _IOC 명령 코드 (command codes), 3,583개의 제어 입력 싱크 (controlled-input sinks), 그리고 1,298개의 권한 게이트 (permission gates)를 복구하였습니다. 두 번째 패스에서는 커널 자체의 문서화된 위협 모델 (threat model)을 쿼리 가능한 컬럼 (column)으로 인코딩하여, 권한 게이트가 없는 (capability-ungated) ioctl 표면(이는 입증된 도달 범위라기보다 비특권 사용자의 도달 범위 상한선임)과 강력한 권한 게이트 (capability gate)에 의해 범위에서 제외되는 부분을 분리하였습니다. 우리는 최근 22개의 인트리 (in-tree) ioctl CVE에 대해 이 센서스를 백테스트 (backtest)하였으며, 구조적 계층 (structural tier)을 오픈 데이터로 공개합니다. 이는 동반 프로젝트인 Windows IOCTL Census와 공유되는 스키마를 사용하여 단일 쿼리로 두 운영 체제를 모두 아우를 수 있도록 설계되었습니다.