CodeQL 2.27.2가 10월 7일 나왔다. 출시 기록에서 기존 쿼리에 가장 큰 영향을 줄 수 있는 항목은 Go 라이브러리 변경이다.
이번 출시는 Go의 제어 흐름 그래프(CFG)를 공유 CFG 라이브러리로 다시 구현했다. CFG는 코드가 실행될 수 있는 순서를 노드와 간선으로 나타낸 그래프다.
대입, 함수 매개변수와 결과, range 문, 지연 호출(defer)을 나타내는 노드가 추가됐다. 진입점에서 도달할 수 없는 노드는 빠지고, 기본 블록도 공유 CFG에서 직접 구성된다.
특정 노드, 간선, 위치, 텍스트 표현, 기본 블록 경계에 기대는 기존 코드는 수정이 필요할 수 있다.
맞춤 쿼리 팩에서 찾을 API 변경
BasicBlocks::Cfg가 제거됐고, ControlFlow::EntryNode와 ControlFlow::ExitNode가 추가됐다.
IfStmt.getCond는 사용 중단 예정이 되었고 IfStmt.getCondition이 대신 권장된다. IfStmt.getThen과 LoopStmt.getBody의 반환형은 BlockStmt에서 Stmt로 넓어졌다.
ReadArgumentInstruction, SelectInstruction 등 여러 IR 명령 클래스도 제거되거나 합쳐졌다.
API 이름만 바꾸면 컴파일 오류는 사라져도, 그래프 모양이나 반환 문장 유형에 대한 더 깊은 가정은 그대로 남을 수 있다.
macOS 27과 Xcode 27의 빌드 모드 제약
GitHub의 10월 9일 설명은 별도의 환경 제약을 덧붙였다. Apple이 macOS 27과 Xcode 27부터 x86-64/arm64 다중 아키텍처 바이너리를 제공하지 않아, 추적 분석에 필요한 바이너리가 없어졌다.
그래서 컴파일 언어의 autobuild와 manual 모드는 Xcode 버전과 관계없이 macOS 27에서, 그리고 Xcode 27을 선택한 macOS 26에서 지원되지 않는다. 이 모드에는 macOS 26과 Xcode 26 이하가 권장된다.
build mode none의 macOS 지원 개선은 진행 중인 작업이다. 지금 쓸 수 있는 보편적 우회책은 아니며, 모든 Mac의 모든 CodeQL 검사가 불가능하다는 뜻도 아니다.
데이터베이스 생성과 쿼리 의미를 나눈 두 관문
전환은 두 관문으로 나누면 다루기 쉽다. 첫째는 선택한 실행기, 운영체제, Xcode, 빌드 모드가 의도한 데이터베이스를 만드는지다.
익숙한 실행기 이름보다 실제 적용된 버전을 기록하는 편이 정확하다.
둘째는 대표 테스트 입력과 알려진 탐지 결과로 쿼리 팩을 평가하는 일이다. 둘을 나누면 추출도 끝나지 않은 쿼리를 디버깅하거나, 지원 실행기라는 이유로 쿼리 의미가 보존됐다고 오해하는 일을 피할 수 있다.
쿼리가 전제한 조건을 자극하는 Go 입력
Go 검토에는 쿼리가 실제로 전제하는 조건을 건드리는 입력이 맞다. 문장 경계를 따르는 쿼리라면 바뀐 API가 BlockStmt가 아닌 일반 Stmt를 돌려주는 사례를 넣는다.
경로를 순회하는 쿼리라면 예상한 도달 가능 경로와 일부러 도달 불가능하게 만든 코드를 함께 본다.
총 알림 수만으로는 부족하다. 같은 개수 아래 하나가 사라지고 다른 하나가 생길 수 있고, 개수 변화가 의도한 수정일 수도 있다.
주의할 점: 실행하지 않은 검증과 추출 실패
출시 기록과 후속 발표는 이 전환 계획의 근거이지만, 이 기사에서는 쿼리, 추출기, CI 실행기를 실행하지 않았다.
추출 실패는 실패한 보안 검사다. 발견 사항이 없다는 이유로 안전한 코드처럼 다룰 대상이 아니다.
쿼리 컴파일 성공도 호환성 검증의 한 단계일 뿐이다.
업그레이드 결과는 알림 개수가 아니라 어떤 데이터베이스에서 어떤 의미의 탐지가 유지됐는지로 설명할 수 있어야 받아들일 수 있다.
