이론적인 부분은 구글에서 공부하면 될것같습니다
(여러 자료들을 찾아보아도, 잘 안되길래 삽질을 통해서 아래와 같은 방식으로 했다.)
CodeQL
CodeQL은 Variant Analysis를 수행하는 정적 분석 도구이다.
Variant Analysis : 알려진 취약점을 기준 삼아서 비슷한 유형의 취약점을 찾아내는 분석 방법이다.
https://github.com/github/codeql/tree/main
장점 : 패턴을 모델링하고 코드베이스에서 해당 패턴이 발생하는 부분을 빠르게 스캔할 수 있다는 것이다.
동작 방식
- CodeQL이 내부적 동작하는 과정
- 대상 code를 데이터화하여 CodeQL Database를 생성
- CodeQL Database를 대상으로 CodeQL 쿼리로 질의
- 쿼리 결과 분석
CodeQL Path 추가
echo 'export PATH="설치경로:$PATH"' >> ~/.bashrc
source ~/.bashrc
취약한 소스 코드 작성
스택 버퍼 오버플로우가 존재하는 소스 코드를 작성
사용자 팩 생성
mkdir -p ~/codeql-packs/user.strcpy/Queries
vim ~/codeql-packs/user.strcpy/qlpack.yml
쿼리 작성
vim ~/codeql-packs/user.strcpy/Queries/simplestrcpy.ql
CodeQL Database 생성
codeql database create stack-overflow --language=cpp --command="gcc -o vuln vuln.c"
데이터베이스가 만들어지면 Successfully created database at 라는 메시지가 나온다.
CodeQL Query
codeql database analyze stack-overflow user/strcpy:Queries/simplestrcpy.ql --search-path "$HOME/.coeql/packages:$HOME/codeql-packs" --format=sarif-latest --output result.sarif
결과
VS Code에서 sarif viewer 설치 후에 보면 분석 결과를 간편하게 보여줌
한계
디버깅 복잡성 : CodeQL 쿼리에 대한 디버깅 프로세스는 복잡성이 증가함에 따라 점점더 모호하고 어려워짐
높은 오탐 : 상당수의 오탐을 발생시킨다.
확장성 문제 : 대규모 코드베이스에서는 단일 쿼리로는 엄청난 양의 결과가 생성될 수 있다. 그래서 수동 분석에 많은 시간과 정신적 피로가 발생할 수 있다.
쿼리를 작성해야한다는 어려움이 존재한다.