
코드베이스를 스캔하여 유사한 취약점을 찾는 변종 분석 및 시각화 도구
![]()
C0deVari4nt는 코드베이스에서 유사한 취약점을 검사하는 변종 분석 및 시각화 도구입니다. 이 도구는 의미론적 코드 분석 엔진인 CodeQL을 활용하여 사용자가 제어하는 CodeQL 쿼리 템플릿을 기반으로 코드를 질의하고, 그 결과를 vis.js와 React로 구축된 클라이언트 인터페이스로 전달하여 추가 탐색 및 시각화를 지원합니다. 이를 통해 이전 취약점 보고서를 기반으로 신속하고 포괄적인 변종 분석이 가능합니다. vis.js 시각화 기능은 개발자가 취약한 코드 경로에 대한 추가적인 통찰력을 제공하며, 잠재적인 변종을 효과적으로 분류할 수 있도록 합니다.

2021년 12월의 Log4Shell 사건은 오픈소스 개발자가 취약점 보고에 대응하는 데 겪는 어려움을 부각시켰습니다. CVE-2021-44228에 대한 초기 패치 이후(이 취약점은 인증되지 않은 원격 공격자가 취약한 Log4j 2 버전을 실행하는 장치를 제어할 수 있게 함), Apache는 관련 취약점과 해결되지 않은 경계 사례를 해결하기 위해 추가 패치 3개를 더 릴리스했습니다.
오픈소스 개발자는 종종 포괄적인 코드 검토 교육을 받지 못했으며, 취약점의 변종을 식별하는 데 어려움을 겪어 불완전한 패치로 이어집니다. CodeQL 쿼리 제품군이 코드베이스의 빠른 분석을 용이하게 하기 위해 존재하지만, 이러한 제품군에서 반환된 결과는 상당한 오탐률을 초래할 수 있습니다. 또한 이러한 제품군은 사전 정의된 쿼리에 의존하므로 변종 분석을 지원하지 않으며 개별 코드베이스에 맞춤화되지 않습니다. 따라서 오픈소스 프로젝트는 잠재적인 변종을 놓치는 단편적인 방식으로 취약점 보고에 대응하는 경우가 많습니다.
C0deVari4nt는 개발자가 자체 CodeQL 쿼리를 작성하는 상당한 오버헤드 없이 변종 분석을 쉽게 수행할 수 있는 플랫폼을 제공합니다. 이를 통해 개발자는 특정 소스 및 싱크와 같은 코드베이스별 정보를 제공하여 CodeQL 템플릿을 사용자 정의할 수 있는 유연성을 얻습니다. 결과는 vis.js로 구동되는 그래프 데이터베이스 뷰로 시각화되어 개발자가 잠재적인 변종을 신속하게 식별할 수 있습니다. 따라서 개발자는 단일 취약점 보고서로부터 전체 버그 클래스를 효과적으로 처리할 수 있습니다.
C0deVari4nt는 Python, CodeQL, vis.js 및 React를 사용하여 구축된 대화형 GUI 응용 프로그램으로, 사용자 입력을 받고 서로 다른 취약한 코드 경로 간의 관계를 보여줍니다.

C0deVari4nt는 다음과 같은 2가지 주요 구성 요소로 구성됩니다:
클라이언트 인터페이스에 대한 자세한 내용은 아래에서 확인할 수 있습니다:

dbextractor.py <codeql db zip file>을 실행하여 codeql 데이터베이스 콘텐츠의 압축을 풉니다pip install -r requirements.txtuvicorn main:app --reload를 실행하여 포트 8000에서 로컬 개발 서버를 시작합니다npm inpm start를 실행하여 로컬 개발 서버를 시작합니다
strcat 함수에 대한 모든 호출 찾기strncpy 함수에 대한 모든 호출 찾기snprintf 호출의 반환 값에 경계 검사가 없는 모든 경우 찾기
malloc, calloc 또는 realloc에 대한 모든 호출 찾기isAdditionalTaintStep 메서드를 사용하여 연결되지 않은 두 함수 간에 오염을 전달합니다isAdditionalTaintStep 메서드를 사용하여 런타임에 동일한 값을 가지는 포인터 간에 오염을 전달합니다다음은 recvfrom을 소스, mempool_alloc을 추가 오염 단계, memcpy를 싱크로 하는 쿼리의 CodeQL 결과를 보여줍니다:

이 결과는 총 27개의 서로 다른 코드 경로에서 180개의 노드를 산출합니다. 결과는 아래의 간단한 neo4j 인터페이스에 표시됩니다:

이 쿼리를 도구에 입력함으로써 각 노드, 소스 및 싱크의 중복 발생을 식별하고 노드 관계를 병합할 수 있었습니다.
그 결과, 11개의 고유 노드로 훨씬 깔끔한 그래프가 생성되었으며, 모든 27개의 고유 코드 경로는 그대로 유지되었습니다:

결과는 경로 레이블 지정 기능을 통해 해당 경로별로 추가로 분류할 수 있습니다:

