인기 검색어

Research

CodeQL Summary

  • -

CodeQL

What is CodeQL?

  • 데이터 흐름 분석 및 오염 분석 등을 통하여 코드 오류와 품질 등을 검사하고, 취약점을 찾기 위해 개발 된 도구
  • FACT database를 기반으로 QL이라는 쿼리 언어를 사용하여 database 내에서 취약한 패턴을 쿼리하여 데이터화, 분석을 진행함.
  • 변수나 함수, 클래스 선언 뿐 아니라 변수 내에 할당 된 값도 추적이 가
  • 다중 언어를 지원

Why We Use CodeQL?

  • 사람이 일일히 수동으로 해야하는 취약점 분석 과정을 신속하게 자동화할 수 있는 툴로 서, 업데이트 등의 사유로 코드가 업데이트 되었을 때도 몇 분만에 코드를 분석하여 잠재적 위험 요소를 확인할 수 있음.

QL Language & QL Query

  • CodeQL의 구조와 문법은 SQL 문법과 비슷하다(같은 Query Language 계열이기 때문)
    • FROM : 쿼리할 변수의 형식, 변수 정의
    • where : 변수에 대한 조건 정의
    • select 쿼리 출력 정의
  • Datalog에 기반을 두고 있기때문에 논리 연산으로 취급이 됨. 그렇기에 문법은 비슷하지만 SQL과 같다고 볼 수 없음

CodeQL Process

https://github.blog/2022-02-01-code-scanning-and-ruby-turning-source-code-into-a-queryable-database/

  • Extraction → Query Compilation → Query Evaluation
  1. Extraction : 코드에서 AST TYPE NAME 등의 메타데이터 정보를 추출하는 단계
  2. Query Compilation : QL 언어로 짜인 쿼리를 컴파일하는 단계
  3. Query Evaluation : 위 절차가 진행 된 후의 내용을 종합해서 취약점 가치 평가 진행하는 단계

Static Analysis

  • 코드를 동적으로 실행하지 않고 정적으로 취약점을 진단하는 것
  • 다양한 검사를 거쳐 코드의 문제를 찾아내는 작업

Initial Static Analysis - Analyzing Pattern

  • 초기의 정적 분석은 바이트 패턴등을 사용하여 정형화 된 검사를 수행했다.
  • 그 결과로, 코드의 실행 흐름이나 맥락을 파악하지 못해, 오탐이나 탐지를 하지 못하는 경우가 잦았다.

Source to Sink

  • Source-To-Sink : Source(취약점이 발생하는 곳으로 사용자 입력 값등이 있음)에서 Sink(이런 데이터가 실행, 사용되는 곳)로 데이터 흐름, 코드 흐름이 발생.
  • Finding Source Vs Sink Sink : 코드 흐름이 크고 길다면, 찾기에 매우 어렵고 시간이 많이 듦 Source : 위험하지 않은 함수가 위험하다고 간주될 수 있음(오탐 등등)

Advanced Static Analysis - AST

  • 프로그램의 소스 코드를 각각의 토큰으로 분해한 뒤, 이 토큰들을 이용해 구문 분석을 진행, 구문 분석의 결과는 일반적으로 "구문 트리(Syntax Tree)"라는 형태로 나타나는데, 이 구문 트리를 더 단순화하여 중복되거나 불필요한 정보를 제거한 것이 바로 AST임.

  1. 소스코드를 토큰으로 분해함 (렉싱 혹은 토큰화 등을 통해서)
  2. 이 토큰들을 구문에 따라 나열하고 분석하여 위와 같은 구문 트리를 만듬
  3. 구문 트리를 정리하고 단순화하여 위 같은 완성 된 AST를 생성함

💡 1줄 정리:

AST(추상 구문 트리)는 프로그램의 소스 코드를 토큰화하고 구조화한 뒤, 중복이나 불필요한 정보를 제거하여 단순화한 트리 형태의 데이터 구조

Advanced Static Analysis - CFG

  • AST에서는 Method에서 CALL과 관련된 정보를 수집 할 수 있지만, 데이터가 source에서 sink로 흐르는지, 어디서 어떻게 흐르는지의 정보는 식별하기 어렵다.
1. username = request.GET.get("username")
2. if request.user.is_superuser:
3.    sql = "SELECT * FROM users"
4.    cursor.execute(sql)
5. elif request.user.is_authenticated:
6.    sql = f"SELECT * FROM users WHERE username={username}"
7.    cursor.execute(sql)
8. else:
9.    print("404")

  • 위의 코드를 흐름표로 나타내면 이와 같다. 어디서 어느 분기에 어떻게 call이 되는지 한 눈에 볼 수 있어 유용하다.

Data flow analysis and taint tracking

  • 취약점 유발 가능한 입력값을 TAINT로 마킹 후, 이 데이터가 어느 경로로 흘러 들어가는지 파악함.
  • Source로부터 어떤 함수를 거쳐서 Sink에 도달하는지 알 수 있고, 이를 통해 빠르면서 정확한 분석이 가능함.
  • 동적 분석과는 다르게 실행 때 발생하는 데이터 흐름을 유추하기에는 한계가 있음.

CodeQL Usuage

https://docs.github.com/ko/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/about-code-scanning

  • Github Action의 CodeQL을 통해서 사용하는 것이 제일 빠르고 쉬운 방법
  • 위에서 설명한 from, where, select 명령어로 원하는 내용을 grab할 수 있음
import python

from Call c
where c.getLocation().getFile().getRelativePath().regexpMatch("2/challenge-1/.*")
select c, "This is a function call"

위 코드는 2/challenge-1/ 아래의 모든 파일의 call을 다 갖고 오는 구문.

'Research' 카테고리의 다른 글

SeedSeeker  (1) 2024.02.18
ComRaceConditionSeeker  (0) 2024.02.13
What Is Windows Search DB?  (1) 2023.12.26
Twice the Bits, Twice the Trouble: Vulnerabilities Induced by Migrating to 64-Bit Platforms  (2) 2023.11.22
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.